四、GD32 MCU 常见外设介绍 (4) EXTI 中断介绍

 4.EXTI 中断介绍

EXTI(中断/事件控制器)包含多个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。 EXTI 有三种触发类型:上升沿触发、下降沿触发和任意沿触发。 EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。

4.1.GD32 EXTI 外设原理简介

GD32 EXTI 主要特性(以 GD32F30x 为例)

◼ 高效的中断处理;

◼ 支持异常抢占和咬尾中断;

◼ 将系统从省电模式唤醒;

◼ 3 种触发类型:上升沿触发,下降沿触发和任意沿触发;

◼ 软件中断或事件触发;

◼ 可配置的触发源;

◼ Cortex-M4系统异常;

◼ 多达68种可屏蔽的外设中断;

◼ 4位中断优先级配置位,可配置16个中断优先级;

◼ EXTI中有多达20个相互独立的边沿检测电路;

EXTI 框图

如图所示,EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件。EXTI的输入线可以通过寄存器设置为任意GPIO,也可以是一些外设的事件,输入线是存在电平变化的信号。

EXTI包含一个边沿检测电路,它会根据上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号给边沿检测电路,否则输出无效信号,而通过配置寄存器,可设置边沿检测电路响应跳变过程,如设置为上升沿触发、下降沿触发和双边沿触发。

EXTI还包含一个或门电路,它一个输入来自边沿检测电路,另外一个输入来自软件中断事件寄存器。软件中断事件寄存器允许我们通过程序控制就可以启动中断/事件线,这在某些地方非常有用。

中断/事件线

不同系列的MCU对应有不同数量、不同种类的中断/事件线,以GD32F10x系列为例,如EXTI中断线图所示它有20个中断/事件线,每个 GPIO都可以被设置为输入线,占用 EXTI0至EXTI15,另外 4根特定外设中断/事件线由外设触发,比如EXTI16代表低压检测LVD中断、EXTI17代表RTC闹钟中断、EXTI18代表USB唤醒中断、EXTI19代表以太网唤醒中断。

EXTI 中断线

EXTI0至 EXTI15用于 GPIO,通过编程控制可以实现任意一个 GPIO作为 EXTI的输入源。由表可知,EXTI0 可以通过 EXTI源选择寄存器0寄存器(AFIO_EXTISS0)的EXTI0_SS[3:0]位选择配置为 PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他 EXTI线(EXTI中断/事件线)使用配置都是类似的。

注意:多组中同一标号PIN仅可配置一个IO口为外部中断,例: PA0、 PB0、 PC0仅支持三个中的其中一个IO口产生外部中断,不支持三个同为外部中断模式。

各系列 EXTI 功能差异

GD32系列MCU有关SPI外设各系列功能差异如 GD32 MCU 各系列 EXTI 功能差异表所示。

4.2.硬件连接说明

外部中断输入检测可以通过配置上升沿、下降沿或者任意沿触发,读者可根据输入信号的初始状态进行配置。如按键设计原理图所示,该图为GD32 开发板按键设计原理图,在按键未按下时KEY引脚状态为高电平,按下后,引脚电平状态为低电平,因而可以配置为下降沿(按键按下时)触发EXTI、上升沿(按键松开后)触发EXTI或任意沿(按键按下和松开后)触发EXTI。

4.3.软件配置说明

本小节讲解EXTI_Example历程中EXTI模块的配置说明,主要包括外设时钟配置、GPIO引脚配置、EXTI外设配置、主函数介绍以及运行结果。本例程主要介绍GD32 MCU各系列EXTI外部中断的使用。

外设时钟配置

外设时钟配置如代码清单EXTI例程时钟配置代码所示,在该历程中使用PA0作为EXTI输入检测引脚,因而,在GD32全系列MCU中均需打开GPIOA的时钟,另外,在GD32F1X0、GD32F3X0和GD32E23X中需要打开CFGCMP时钟,以及在GD32F4XX中需要打开SYSCFG时钟,主要由于 EXTI源选择控制位在系统配置寄存器中。

void rcu_config(void)
{
#if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10Xrcu_periph_clock_enable(RCU_GPIOA);
#elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23X
rcu_periph_clock_enable(RCU_GPIOA);#if defined GD32F1X0 || GD32F3X0 || GD32E23Xrcu_periph_clock_enable(RCU_CFGCMP);#elif defined GD32F4XXrcu_periph_clock_enable(RCU_SYSCFG);#endif
#endif
}

GPIO 引脚配置

GPIO引脚配置如代码清单EXTI例程GPIO引脚配置代码所示,PA0引脚需要配置为浮空输入状态。

void gpio_config(void)
{
#if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10Xgpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
#elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23Xgpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
#endif 
}

EXTI 外设配置

EXTI外设配置代码如代码清单EXTI例程EXTI外设配置代码所示,在该代码中,首先使能EXTI中断,之后配置EXTI源以及所需要的边沿,最后清除EXTI中断标志。

void exti_config(void)
{
#if defined GD32F10X_HD|| GD32F30X_HD || GD32F1X0 || GD32F20X_CL || GD32F4XX || GD32F3X0 || GD32E10X || 
GD32E23X
#if defined GD32F1X0 || GD32F3X0 || GD32E23X || GD32F4XX
#if defined GD32E23X
/* enable and set key EXTI interrupt to the lowest priority */
nvic_irq_enable(EXTI0_1_IRQn, 2U);#elif defined GD32F4XXnvic_irq_enable(EXTI0_IRQn, 2U,0U);
#elif defined GD32F1X0 || GD32F3X0 
nvic_irq_enable(EXTI0_1_IRQn, 2U,0U);
#endif
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);
/* configure key EXTI line */
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_0);
#elsenvic_irq_enable(EXTI0_IRQn, 2U,0U);gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
/* configure key EXTI line */
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_0);
#endif
#endif 
}

主函数说明及中断处理函数说明

主函数配置十分简单,如代码清单EXTI例程主函数所示,主要包括外设时钟初始化调用、GPIO初始化调用以及EXTI配置函数。

int main(void)
{/* peripheral clock enable */rcu_config();/* GPIO config */gpio_config();/* SPI config */exti_config();while(1)
{
}
}

中断处理函数如代码清单EXTI中断处理函数所示。在中断处理函数中,首先判断产生EXTI的中断是否为EXTI_0的中断标志,如果是,则进入EXTI_0的中断处理,处理完成后,清除EXTI_0的中断标志。

void EXTI0_IRQHandler(void)
{
if(exti_interrupt_flag_get(EXTI_0) == SET)
{exti_interrupt_flag_clear(EXTI_0);
}
}

运行结果

将EXTI_Example例程按照对应的芯片工程编译完成后,下载到对应芯片中,在中断处理函数中加断点,可以发现,当PA0有下降沿发生时,会产生EXTI中断,进入EXTI中断处理函数。

本章内容每日持续更新,如有兴趣,请关注收藏

更多GD32 MCU相关咨询:https://www.gd32bbs.com/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/383931.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用C#自制一个Windows安装包

原文链接:https://www.cnblogs.com/zhaotianff/p/17387496.html 以前都在用InstallShield制作安装包,基本需求是能满足的,但也有一些缺点: 1、界面不能完全定制 2、不能直接调用代码里的功能 平常使用一些其它软件,…

【基础算法总结】优先级队列

优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1…

FPGA开发——LED流水灯实现先从左往右流水,再从右往左流水

一、概述 我们在设计完一个方向的流水灯的设计时,总是会想实现让流水灯倒着流水回去的设计,这里我也是一样,实现这种设计的方法有很多种,其中就有直接使用case语句将所有可能包含进去编写,这种设计方法是最简单的&…

leetcode日记(51)不同路径Ⅱ

和上一道题(无障碍物的最短路径)很像,但事实上比上一题多了优化方法 根据上一题改的代码如下,添加了对障碍物的判定,如果有障碍物则将数组值设为0。 class Solution { public:int uniquePathsWithObstacles(vector&l…

Origin制作线性拟合回归图

选中数据,点下方散点图 调整散点颜色 在分析中打开线性拟合回归 添加文本 显示上轴

算法 —— 暴力枚举

目录 循环枚举 P2241 统计方形(数据加强版) P2089 烤鸡 P1618 三连击(升级版) 子集枚举 P1036 [NOIP2002 普及组] 选数 P1157 组合的输出 排列枚举 P1706 全排列问题 P1088 [NOIP2004 普及组] 火星人 循环枚举 顾名思…

keil调试SH79F7416

仿真器JET51A, 调试设置 选择器件 再次点击调试就一切正常啦

快速汇总公司产品涉及的项目(服务、站点)

文章目录 引言I 快速汇总公司产品涉及的项目II 常用工具jar包转成exe应用远程操作常用命令III 把应用做成windows服务在后台运行借助工具`instsrv.exe`和`srvany.exe`把应用做成windows服务的步骤SysWOW64 文件夹的作用引言 需求:汇总 平台涉及站点和服务信息 I 快速汇总公司…

SkyWalking入门搭建【apache-skywalking-apm-10.0.0】

Java学习文档 视频讲解 文章目录 一、准备二、服务启动2-1、Nacos启动2-2、SkyWalking服务端启动2-3、SkyWalking控制台启动2-4、自定义服务接入 SkyWalking 三、常用监控3-1、服务请求通过率3-2、服务请求拓扑图3-3、链路 四、日志配置五、性能剖析六、数据持久化6-1、MySQL持…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2,实现输入员工姓名后返回员工的年龄 创建一个存储过程s3,有2个参数&…

Pytorch使用教学5-视图view与reshape的区别

有同学后台留言问为什么view有时可对张量进行形变操作,有时就会报错?另外它和reshape功能好像一致,有什么区别呢?本文就带你了解PyTorch中视图的概念。 在PyTorch中对张量进行形变操作时,很多同学也会使用view方法&am…

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式(一行一行的数据)或者列向量形式(一…

Windows搭建Nginx代理本地盘的文件 共享本地文件

一、查询自己的内网IP和外网IP的方法,以及判断是否直接连接到公网 内网IP,即局域网IP: 打开cmd窗口, 输入 ipconfig 后回车 外网IP,即公网IP: 打开cmd窗口,输入curl ifconfig.me指令访问ifconfi…

PE文件(十二)导入表

导入表 导入表的引入 当一个PE文件(如.dll/.exe等)需要使用别的模块的函数,也叫做依赖某模块,就需要一个清单来记录使用的模块(一般为.dll文件,为方便理解,以后我们将模块都认为是.dll文件&am…

Python写UI自动化--playwright(通过UI文本匹配实现定位)

本篇简单拓展一下元素定位技巧,通过UI界面的文本去实现定位 目录 匹配XPath 匹配文本元素 .count()统计匹配数量 处理匹配文本返回多个元素 1、使用.nth(index)选择特定元素: 2、获取所有匹配的元素并遍历: 3、错误处理: 匹配XPath 比如我们要定位到下图的…

VScode连接虚拟机运行Python文件的方法

声明:本文使用Linux发行版本为rocky_9.4 目录 1. 在rocky_9.4最小安装的系统中,默认是没有tar工具的,因此,要先下载tar工具 2. 在安装好的vscode中下载ssh远程插件工具 3. 然后连接虚拟机 4. 查看python是否已经安装 5. 下载…

Linux网络:传输层协议TCP(一)

目录 一、TCP协议的定义 二、确认应答机制ACK 三、序号、确认序号 四、超时重传机制 一、TCP协议的定义 TCP 全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传 输进行一个详细的控制; TCP 协议段格式 • 源/目的端口号: 表示数据…

减轻幻觉新SOTA,7B模型自迭代训练效果超越GPT-4,上海AI lab发布

LLMs在回答各种复杂问题时,有时会“胡言乱语”,产生所谓的幻觉。解决这一问题的初始步骤就是创建高质量幻觉数据集训练模型以帮助检测、缓解幻觉。 但现有的幻觉标注数据集,因为领域窄、数量少,加上制作成本高、标注人员水平不一…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

抖音直播弹幕数据逆向:websocket和JS注入

&#x1f50d; 思路与步骤详解 &#x1f575;️‍♂️ 思路介绍 首先&#xff0c;我们通过抓包工具进入的直播间&#xff0c;捕获其网络通信数据&#xff0c;重点关注WebSocket连接。发现直播弹幕数据通过WebSocket传输&#xff0c;这种方式比传统的HTTP更适合实时数据的传输。…