打印
[学习笔记]

【AutoChips 7801x MCU评测报告】二、EXTI

[复制链接]
605|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MCU, ps, TI, Chip, pi
      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)

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14978

帖子

17

粉丝