|
本帖最后由 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);
}
}
}
|
|