GD32F103单片机EXTI外部中断详解与应用指南
GD32F103单片机-EXTI外部中断
一、EXTI及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);//配置NVIC优先级分组
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority);//初始化NVIC,中断通道,抢占优先级和子优先级(响应优先级)
//中断服务函数入口在:startup_gd32f10x_md.s中
//枚举中断号IRQn在gd32f10x.h中
2.2 实验代码

#include "gd32f10x.h" // Device header
#include "LED.h"
/*
@brief:初始化EXTI
@param:无
@retval:无
*/
void My_EXTI_Init()
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF); //开启GPIOA,AFIO时钟
gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0);//PA0上拉输入
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_0);//AFIO设置PA0为EXTI触发源
exti_init(EXTI_0,EXTI_INTERRUPT,EXTI_TRIG_FALLING);//通道0,下降沿触发外部中断
exti_interrupt_enable(EXTI_0);//使能EXTI
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//NVIC分组
nvic_irq_enable(EXTI0_IRQn,1,1);//配置NVIC,中断通道,抢占和子优先级为1
}
/*
@brief:EXTI中断服务函数
@param:无
@retval:无
*/
void EXTI0_IRQHandler()
{
if(exti_interrupt_flag_get(EXTI_0) == SET)//判断中断标志位
{
LED1_Turn();
exti_interrupt_flag_clear(EXTI_0);//清除中断标志位
}
}
作者:侥幸哥f