AC78013FDLA是采用ARM Cortex-M0+内核的高性能微控制器,嵌套了中断向量控制器 (NVIC) ,其具有32个可屏蔽中断通道、4个可编程优先等级。本次实验就是利用了板载的按键K6、K7产生的外部中断控制LED2、LED3的工作状态,当K6按下产生一个下降沿中断LED2点亮、当K6松开时又会产生一个上升沿中断LED2熄灭;当K7按下便产生一个下降沿中断LED3点亮,再次按下产生中断后LED3熄灭。
一、实验资源
1、AC7801x开发板;
2、AutoGen Studio 1.2.0;
3、KEIL 5.28.0.0;
4、ST-LINK2
二、资源简介
上面提到的嵌套了中断向量控制器 (NVIC) 手册中有简要的介绍,更详细的描述还要参考《ARM Cortex™-M0+ Technical Reference Manual》第8章异常和中断。
下面是AC780x中断表:
实验中用到了其中的“EXITx”中断,具体是哪一个还要根据实际的硬件进行确定。从AC7801x开发板原理图上可以看出K6、K7分别接在了PC6和PA11端口,外部中断向量对应EXTI3_8_IRQn和EXTI9_15_IRQn。
三、代码实现
工程用“AutoGen Studio”创建,其中的K6(PC6)被配置成上升沿+下降沿触发中断;LED2与LED3对应的端口被配置成了输出模式;
主要代码:
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void ATC_GPIO_Init(void)
{
GPIO_SetFunc(GPIOA, GPIO_PIN11, GPIO_FUN0);
GPIO_SetFunc(GPIOC, GPIO_PIN6, GPIO_FUN0);
GPIO_SetFunc(GPIOC, GPIO_PIN7, GPIO_FUN0);
GPIO_SetFunc(GPIOC, GPIO_PIN9, GPIO_FUN0);
GPIO_SetDir(GPIOA, GPIO_PIN11, GPIO_IN);
GPIO_SetDir(GPIOC, GPIO_PIN6, GPIO_IN);
GPIO_SetDir(GPIOC, GPIO_PIN7, GPIO_OUT);
GPIO_SetDir(GPIOC, GPIO_PIN9, GPIO_OUT);
GPIO_SetCallback(GPIO_PIN11, K7_Callback);
GPIO_SetCallback(GPIO_PIN6, K6_Callback);
GPIO_EnableExtInterrupt(GPIOA, GPIO_PIN11, EXTI_TRIGGER_FALLING);
GPIO_EnableExtInterrupt(GPIOC, GPIO_PIN6, EXTI_TRIGGER_RISING_FALLING);
GPIO_SetPinLevel(GPIOC, GPIO_PIN7, GPIO_LEVEL_LOW);
GPIO_SetPinLevel(GPIOC, GPIO_PIN9, GPIO_LEVEL_LOW);
GPIO_SetDrivingAbility(GPIOC, GPIO_PIN7, GPIO_DRIVING_4MA);
GPIO_SetDrivingAbility(GPIOC, GPIO_PIN9, GPIO_DRIVING_4MA);
/* EXTI interrupt init*/
NVIC_SetPriority(EXTI3_8_IRQn, 0);
NVIC_EnableIRQ(EXTI3_8_IRQn);
NVIC_SetPriority(EXTI9_15_IRQn, 0);
NVIC_EnableIRQ(EXTI9_15_IRQn);
}
上述代码是GPIO端口的配置代码,其中的两行
GPIO_SetCallback(GPIO_PIN11, K7_Callback);
GPIO_SetCallback(GPIO_PIN6, K6_Callback);要根据中断回调函数名称修改一下,下面就是两个按键的回调函数:
//按下K7产生下降沿电平点亮LED3;再次按下后熄灭LED3
void K7_Callback(void *device, uint32_t wpara, uint32_t lpara)
{
static uint8_t LED3_flag = 1;
if(GPIO_LEVEL_LOW == GPIO_GetPinLevel(K7_GPIO_Port, K7_Pin))
{
if(LED3_flag)
{
GPIO_SetPinBit(LED3_GPIO_Port, LED3_Pin);
LED3_flag = 0;
}
else
{
LED3_flag = 1;
GPIO_ResetPinBit(LED3_GPIO_Port, LED3_Pin);
}
}
}
//K6按下时检测到K6电平下降沿点亮LED2;K6松开时检测到K6电平上升沿熄灭LED2;
void K6_Callback(void *device, uint32_t wpara, uint32_t lpara)
{
if(GPIO_LEVEL_HIGH == GPIO_GetPinLevel(K6_GPIO_Port, K6_Pin))
GPIO_ResetPinBit(LED2_GPIO_Port, LED2_Pin);
if(GPIO_LEVEL_LOW == GPIO_GetPinLevel(K6_GPIO_Port, K6_Pin))
GPIO_SetPinBit(LED2_GPIO_Port, LED2_Pin);
}
四、实验结果
满足了实验设计。
五、实验总结
通过实验对AC7801x中断有了初步认识,学会了EXTI外部中断的基本操作。另外网友“dengyonglei”建议将“AutoGen Studio”更新为1.3.0版本,由于本地网断了几天,这个实验在之前已经完成,所以还是按1.2.0版本进行了描述。在此向@dengyonglei 表示感谢!
六、附件
GPIO.rar
(952.38 KB)
|