返回列表 发新帖

SAM4E-EK开发板对LED灯闪烁的控制

[复制链接]

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-4-24 09:25:18 | 显示全部楼层 | 阅读模式
本帖最后由 Mcuzone_TKN 于 2020-4-24 09:25 编辑

关键词:SAM4E-EK  开发板 LED闪烁
概述:解读LED灯闪烁的代码

1:电路
    通过查看电路图,可以发现有个LED灯连接在PA0引脚上。我们可以通过改变PA0输出的电平来实现LED灯的闪烁。

2:寄存器的访问     对单片机的操作需要通过对相关寄存器的访问来实现。

const unsigned long led_mask[] = { PIO_PA0, PIO_PD20, PIO_PD21 };  /*定义一个常量数组*/

void LED_Init(void) {
  PMC->PMC_WPMR = 0x504D4300;             /* 关闭写保护 */

  PMC->PMC_PCER0 = ((1UL << ID_PIOA) |    /* 打开PIOA的时钟*/
                                      (1UL << ID_PIOD)  );  /*打开PIOD的时钟  */

  PIOA->PIO_PER  =                                                            
  PIOA->PIO_OER  =
  PIOA->PIO_PUDR =
  PIOA->PIO_OWER = (PIO_PA0);             /*把PA0设置成LED的IO*/

  PIOD->PIO_PER  =
  PIOD->PIO_OER  =
  PIOD->PIO_PUDR =
  PIOD->PIO_OWER = (PIO_PD20 | PIO_PD21); /*设置LED的脚PIO_PD20到PD21*/

  PMC->PMC_WPMR = 0x504D4301;             /*关闭写保护*/

  LED_Out (0);                            /* 关闭LED */
}

/*------------------------
开启LED
*--------------------------*/

void LED_On (unsigned int num) {

  if (num < LED_NUM) {
    if (num == 0) PIOA->PIO_CODR = led_mask[num];
    else          PIOD->PIO_CODR = led_mask[num];
  }
}


/*----------------------------------
  关闭LED
*-----------------------------------*/
void LED_Off (unsigned int num) {

  if (num < LED_NUM) {
    if (num == 0) PIOA->PIO_SODR = led_mask[num];
    else          PIOD->PIO_SODR = led_mask[num];
  }
}

/*----------------------------------
往LED里面写值
*-----------------------------------*/
void LED_Out(unsigned int value) {
  int i;

  for (i = 0; i < LED_NUM; i++) {
    if (value & (1<<i)) {
      LED_On (i);
    } else {
      LED_Off(i);
    }
  }
}








LED电路图

LED电路图
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表