一、EXTI及NVIC介绍
- GD32和STM32的EXTI基本相似,具体见STM32F1单片机-外部中断
- GD32的EXTI包括20个相互独立的边沿检测电路请求产生中断或事件,4位优先级配置寄存器,16个优先等级
- GD32的EXTI有三种触发方式:上升沿、下降沿和任意沿触发
- 如下图为EXTI框图,通过EXTI_Line0-19(IO的16个管脚和内部模块的4根线)一共20条线路进入到边沿检测,或通过软件触发,最终通过中断屏蔽控制(挂起标志位-指示有中断发生,不意味着中断处理已经完成)到NVIC产生中断或者产生事件
二、编程实验
2.1 相关库函数
- 下面是GD32F103关于EXTI和NVIC相关的库函数
void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin);
void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type);
void exti_interrupt_enable(exti_line_enum linex);
FlagStatus exti_flag_get(exti_line_enum linex);
void exti_flag_clear(exti_line_enum linex);
FlagStatus exti_interrupt_flag_get(exti_line_enum linex);
void exti_interrupt_flag_clear(exti_line_enum linex);
void nvic_priority_group_set(uint32_t nvic_prigroup);
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority);
2.2 实验代码
- 外部中断基本步骤如下:开启GPIO、AFIO时钟 — 初始化GPIO和外部中断引脚选择 — 初始化EXTI和NVIC — 使能EXTI — 进入EXTI中断服务函数(判断中断标志位)
- 使用触摸按键去模拟外部中断,触摸按键原理图如下所示
- TTP223作为一款触摸检测IC、提供一个触摸按键,OUT_1接到PA0
- Q是CMOS输出引脚、VS是接地,VDD电源,I是触摸输入,AHLB是输出有效选择(0表示高电平有效、1表示低电平有效),TOB是输出模式选择(0表示直接模式,1表示触发模式)。所以本图中表示的是直接模式,低电平有效输出
- 触摸按键部位有个感应电容,当触摸到按键部分时,会与C13电容并联使得输入I的电容变大,OUT_1输出低电平,松手时,OUT_1输出高电平,触摸期间一直输出低电平
- 实验内容:按下触摸按键A,实现LED的状态反转
- 下面是My_EXTI.c
- 中断服务函数不需要声明,main函数调用LED、EXTI初始化函数即可
#include "gd32f10x.h"
#include "LED.h"
void My_EXTI_Init()
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_0);
exti_init(EXTI_0,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
exti_interrupt_enable(EXTI_0);
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(EXTI0_IRQn,1,1);
}
void EXTI0_IRQHandler()
{
if(exti_interrupt_flag_get(EXTI_0) == SET)
{
LED1_Turn();
exti_interrupt_flag_clear(EXTI_0);
}
}