EXTI NVIC_1">一、EXTI 及NVIC介绍
GD32 和STM32的EXTI 基本相似,具体见STM32F1单片机 -外部中断GD32 的EXTI 包括20 个相互独立的边沿检测电路请求产生中断或事件,4位优先级配置寄存器 ,16 个优先等级GD32 的EXTI 有三种触发方式 :上升沿 、下降沿 和任意沿触发 如下图为EXTI 框图,通过EXTI _Line0-19 (IO的16个管脚 和内部模块的4根线 )一共20条线路进入到边沿检测,或通过软件触发 ,最终通过中断屏蔽控制(挂起标志位-指示有中断发生,不意味着中断处理已经完成 )到NVIC产生中断 或者产生事件
二、编程实验
2.1 相关库函数
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接到PA0Q是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 ( EXTI 0_IRQn, 1 , 1 ) ;
}
void EXTI 0_IRQHandler( )
{
if ( exti_interrupt_flag_get ( EXTI _0) == SET)
{
LED1_Turn ( ) ;
exti_interrupt_flag_clear ( EXTI _0) ;
}
}