本帖最后由 xiaoli2018 于 2022-1-29 20:58 编辑
GPIO除了通用的IO功能,还可以配置外部中断源EXTI。这样当IO检测到引脚状态的变化时,可以第一时间通知MCU进行处理。
比如可以通过EXTI检测设备的外壳被打开,或者可以检测输入量的变化等。在使用外部中断的时候需要配置3个外设:
- IO:配置为输入功能
- EXTI:将对应IO的输入配置为EXTI中断源
- NVIC:配置中断的优先级和使能
除了上面3个外设的配置,还需要使能相关外设的时钟,编写中断处理函数。
本例使用将按键连接的IO配置为EXTI的中断源,当按键按下时触发中断,翻转LED。
- 按键连接在PA0,PA0接了下拉电阻,当按键按下时PA0为高电平
- LED连接在PA7
#define BTN_PORT GPIOA
#define BTN_PIN GPIO_PIN_0
#define LED1_PORT GPIOA
#define LED1_PIN GPIO_PIN_7
IO的配置
IO的设置分为时钟使能和IO设置两部分。
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(LED1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED1_PIN);
gpio_output_options_set(LED1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED1_PIN);
gpio_mode_set(BTN_PORT,GPIO_MODE_INPUT,GPIO_PUPD_NONE,BTN_PIN);
EXTI的配置
EXTI需要SYSCFG模块进行设置,因此需要使能SYSCFG的时钟。
rcu_periph_clock_enable(RCU_SYSCFG);
syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXTI_SOURCE_PIN0);
exti_init(EXTI_0,EXTI_INTERRUPT,EXTI_TRIG_RISING);
exti_interrupt_flag_clear(EXTI_0);
exti_interrupt_enable(EXTI_0);
NVIC的配置
GD32L233是Cortex-M23的内核,在其NVIC模块上只能设置4个中断优先级。

上图的引用链接
nvic_irq_enable(EXTI0_IRQn,2);
注意NVIC优先级只可以设置为0~3,共4个优先级,0的优先级最高。高优先级可以抢占低优先级的中断。
中断处理函数
中断处理函数可以放到任何一个.c文件中,不过为了统一管理中断函数,并且满足GD32模板文件的要求,最好将中断函数都写在gd32l23x_it.c中。
有的中断的中断标志位可以通过读取操作自动清除,而有些中断的中断标志位必须手动清除,具体的操作要看芯片的手册。而EXTI的中断标志位需要手动清除。
void EXTI0_IRQHandler(void)
{
if(exti_interrupt_flag_get(EXTI_0) != RESET){
gpio_bit_toggle(GPIOA,GPIO_PIN_7);
exti_interrupt_flag_clear(EXTI_0);
}
}
用户手册从第一篇文章中下载
第一篇 GD32L233C开发资源的下载
第二篇 开发环境的创建