GD32F103单片机-EXTI外部中断

GD32F103单片机-EXTI外部中断

一、EXTI及NVIC介绍

  • GD32和STM32的EXTI基本相似,具体见STM32F1单片机-外部中断
  • GD32的EXTI包括20 个相互独立的边沿检测电路请求产生中断或事件,4位优先级配置寄存器16个优先等级
  • GD32的EXTI有三种触发方式上升沿下降沿任意沿触发
  • 如下图为EXTI框图,通过EXTI_Line0-19 (IO的16个管脚 和内部模块的4根线 )一共20条线路进入到边沿检测,或通过软件触发 ,最终通过中断屏蔽控制(挂起标志位-指示有中断发生,不意味着中断处理已经完成 )到NVIC产生中断 或者产生事件
  • 下图为EXTI触发源对应表

二、编程实验

2.1 相关库函数

  • 下面是GD32F103关于EXTI和NVIC相关的库函数
c 复制代码
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 实验代码

  • 外部中断 基本步骤如下:开启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初始化函数即可
c 复制代码
#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);//清除中断标志位
	}
}
相关推荐
危桥带雨6 小时前
Freertos——使用队列集优化数据传输
stm32·单片机·嵌入式硬件·freertos
来生硬件工程师6 小时前
【程序库】 MutiButton 按键库
c语言·笔记·stm32·单片机·mcu·嵌入式实时数据库
sweetone6 小时前
好帅(HOST) HS-AF01T电烤炉(空气炸锅)的小修及物联网设备的安全思考
经验分享·单片机·嵌入式硬件·物联网
多看多敲多思考6 小时前
华润微CS32ME10 MCU使用教程(1)---CS32ME10之GPIO使用
c语言·stm32·单片机·嵌入式硬件·mcu
小谦32516 小时前
第十一篇、CubeMX | 可见光谱颜色传感器 AS7341
单片机·嵌入式硬件
黑白园6 小时前
STM32 printf函数重定向到USATR1输出打印
stm32·单片机·嵌入式硬件
踏着七彩祥云的小丑7 小时前
嵌入式——认识电子元器件——温度保险丝系列
单片机·嵌入式硬件
12.=0.7 小时前
【stm32_6.1】串行异步接口USART,串口的原理和应用
c语言·stm32·单片机·嵌入式硬件
雅斯驰7 小时前
4Gbit密度+16位总线宽度:H5AN4G6NBJR-UHC在DDR4成熟期的产品定位
运维·单片机·嵌入式硬件·物联网·自动化
weixin_456808388 小时前
【沁恒蓝牙开发】电压监控
单片机·嵌入式硬件