一、背景
本人最近在做将STM32 H7的代码移植到GD32 F4上,实现芯片的国产化替代。在移植过程中,需要实现按键中断。
在STM32 M7的GPIO库中提供了引脚中断函数接口,只需要在引脚初始化配置时,选择引脚模式为:GPIO_MODE_IT_RISING 或是 GPIO_MODE_IT_FALLING 即可开启引脚上升沿 / 下降沿中断。
而在GD32中,并没有在引脚初始化函数中封装中断配置,需要通过中断/事件控制器(EXIT)进行设置。
二、中断/事件控制器(EXTI)
Cortex-M4 集成了嵌套式矢量型中断控制器实现高效的异常和中断处理。EXTI(中断/事件控制器)包括 23 个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。 EXTI 有三种触发类型:上升沿触发、下降沿触发和任意沿触发。 EXTI 中的每一个边沿检测电路都可以独立配置和屏蔽。
EXTI触发源包括来自I/O管脚的16根线以及来自内部模块的7根线。 (包括LVD、 RTC闹钟、 USB唤醒、以太网唤醒、 RTC侵入和时间戳、 RTC唤醒)。通过配置SYSCFG_EXTISSx寄存器,所有的GPIO管脚都可以被选作EXTI的触发源。
三、外部中断配置
1. 使能 GPIO 和 SYSCFG 时钟
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_SYSCFG);
2. 外部中断引脚配置为输入模式,这里以PC13为例
gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
3. 开启外部中断
nvic_irq_enable(EXTI10_15_IRQn, 2U, 0U);
GPIO_PIN_10 ~ GPIO_PIN_15 同用一个中断响应函数 EXTI10_15_IRQHandler;GPIO_PIN_5 ~ GPIO_PIN_9 同用一个中断响应函数 EXTI5_9_IRQHandler,其余的例如 GPIO_PIN_1 的响应函数为 EXTI1_IRQHandler。
4. 配置SYSCFG_EXTISSx寄存器,设置PIN13为触发源
syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13);
5. 初始化外部中断并清除中断标记
exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_RISING);
exti_interrupt_flag_clear(EXTI_13);
6. 配置中断响应函数
void EXTI10_15_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_13)){
/*--------以下放入中断响应函数---------*/
}
exti_interrupt_flag_clear(EXTI_13);
}