GPIO外部中断输入
1、GD32F303RCT6内部由20多条中断线,给gpio用的有16条,对应关系如图:
开发版的User Key连接PA1,所以用的是1这条中断线,而0、1、2、3、4这五条中断线有各自对应的中断函数,EXTI0_IRQHandler,EXTI1_IRQHandler,EXTI2_IRQHandler,EXTI3_IRQHandler,EXTI4_IRQHandler。5-9中断线对应EXTI5_9_IRQHandler中断函数,10-15对应EXTI10_15_IRQHandler中断函数。
2、在按下UserKey后,我们用串口打印一句话。效果如图:
3、新增key_input.c key_input.h文件
key_input.c
#include "main.h"
#include "key_inpu.h"
#include "gd32f30x.h"
#if ENABLE_KEY_INPUT_TEST == 1
void key_input_config(void)
{
//配置PA1外部中断
rcu_periph_clock_enable(RCU_GPIOA);//GPIOA时钟使能
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//PA1配置成上拉输入
nvic_irq_enable(EXTI1_IRQn, 2U, 0U);//enable and set key EXTI interrupt to the lowest priority
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_1);//connect key EXTI line to key GPIO pin
exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
exti_interrupt_flag_clear(EXTI_1);//清中断标志
}
#endif //ENABLE_KEY_INPUT_TEST == 1
key_input.h
#ifndef __KEY_INPUT_H__
#define __KEY_INPUT_H__
#define ENABLE_KEY_INPUT_TEST 1
#if ENABLE_KEY_INPUT_TEST == 1
void key_input_config(void);
#endif //ENABLE_KEY_INPUT_TEST == 1
#endif //__KEY_INPUT_H__
gd32f30x_it.c 中新增中断处理函数
#if ENABLE_KEY_INPUT_TEST == 1
void EXTI1_IRQHandler(void)
{
exti_interrupt_flag_clear(EXTI_1);
delay_1ms(20);
if (gpio_input_bit_get(GPIOA,GPIO_PIN_1) == RESET)
{
printf("User Key Press!\r\n");
}
}
#endif