1、硬件连接
可以看出,PA0通过R29下拉到GND,按键按下时, PA0的电压为3.3V,没有按下时,PA0的电压为0V,因此可以通过判断上升沿,判断按键是否按下。
2、中断优先级
可以看出只有2位,4个优先等级,而且不分先占、次占优先级,这与cortex m3还是区别比较大的。
3、中断线
可以看出PA0 / PB0 / PC0 / PD0 / PF0对应一个中断线,即就是这几个如果要用到外部中断,同一时刻只能有一个。
4、中断函数
查看startup_gd32l23x.s文件,发现外部IO中断只有7个中断函数,分别是:
代码语言:javascript复制EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI5_9_IRQHandler
EXTI10_15_IRQHandler
从这里也可以看出,PX5-PX9,对应一个中断函数,PX10-PX15,对应一个中断函数,需要在中断函数中判断,具体是哪个中断源。
5、代码实现
代码语言:javascript复制static uint8_t KeyState=0;
void KeyInit(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
/* enable the SYSCFG clock */
rcu_periph_clock_enable(RCU_SYSCFG);
/* enable and set key EXTI interrupt to the specified priority */
nvic_irq_enable(EXTI0_IRQn, 2U);
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);
/* configure key EXTI line */
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_RISING);
exti_interrupt_flag_clear(EXTI_0);
}
void KeyPolling(void)
{
if(KeyState)
{
KeyState=0;
printf("key pressrn");
}
}
void EXTI0_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_0)) {
exti_interrupt_flag_clear(EXTI_0);
KeyState=1;
}
}