当前位置: 首页 > news >正文

四、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/ 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ip地址是电脑还是网线决定的
  • Potree在web端显示大型点云模型文件
  • MySQL_JDBC
  • 【git】切换到远程其他分支
  • Flask 框架 redirect() url_for()
  • python键盘操作工具:ctypes、pyautogui
  • Ajax学习笔记
  • ARM功耗管理之功耗和安全
  • 51单片机嵌入式开发:16、STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作
  • 下拉菜单过渡
  • 算法017:二分查找
  • 【MySQL-17】存储过程-[变量篇]详解-(系统变量&用户定义变量&局部变量)
  • 基于chrome插件的企业应用
  • Spark内核的设计原理
  • 1.1 OpenCV __ Introduction
  • Android 控件背景颜色处理
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • spring boot 整合mybatis 无法输出sql的问题
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue的全局变量和全局拦截请求器
  • 从零开始学习部署
  • 将 Measurements 和 Units 应用到物理学
  • 让你的分享飞起来——极光推出社会化分享组件
  • 三分钟教你同步 Visual Studio Code 设置
  • 少走弯路,给Java 1~5 年程序员的建议
  • 异步
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Java NIO(一)FileChannel
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (20)docke容器
  • (55)MOS管专题--->(10)MOS管的封装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • .apk文件,IIS不支持下载解决
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core 项目指定SDK版本
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Standard 的管理策略
  • .Net Web项目创建比较不错的参考文章
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net开发引用程序集提示没有强名称的解决办法
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @antv/g6 业务场景:流程图
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android] Upload package to device fails #2720
  • [Android]使用Android打包Unity工程
  • [Bugku] web-CTF靶场系列系列详解⑥!!!