【GD32】03 - EXTI外部中断

2024-05-14 02:52
文章标签 中断 03 外部 gd32 exti

本文主要是介绍【GD32】03 - EXTI外部中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

EXTI

EXTI,全称External Interrupt/Event Controller,即外部中断/事件控制器,是微控制器中的一个重要组成部分。它主要用于管理来自外部设备的中断和事件请求。以下是关于EXTI的详细介绍:

  1. 功能概述:
  • EXTI管理了控制器的多个中断/事件线,通常这些线路数量在STM32等微控制器中可以达到20个或更多。
  • 每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿检测。这意味着当外部信号的状态从低电平变为高电平(上升沿)或从高电平变为低电平(下降沿)时,EXTI可以检测到这种变化并产生相应的中断或事件。
  • EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性(如上升沿触发、下降沿触发或双边沿触发)。
  1. 两大功能:
  • 产生中断:当外部设备触发中断条件时,它会向EXTI发送中断请求。EXTI会接收并处理这些中断请求,并将信号传递给NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)进行处理。NVIC会根据中断的优先级来决定是否响应中断,并调用相应的中断服务程序。
  • 产生事件:除了产生中断外,EXTI还可以产生事件。这些事件可以用于触发某些特定的操作或行为,而无需进入中断服务程序。例如,可以使用EXTI来检测按钮的按下事件,并在检测到该事件时执行某个特定的任务或操作。
  1. 典型应用:
  • 在物联网应用中,NVIC和EXTI是常用的中断处理器和中断控制器。外部设备可以是各种传感器、开关、按钮等。当这些设备触发中断条件时,它们会向EXTI发送中断请求,EXTI会接收并处理这些请求,并触发相应的中断服务程序或事件处理程序。
  • 在嵌入式系统中,EXTI也常用于处理各种外设的中断请求,例如传感器数据的到达、网络通信的中断等。
  1. 结构特点:
  • EXTI的结构通常包括多个中断/事件线、边沿检测器、配置寄存器等部分。每个中断/事件线都可以单独进行配置,以选择请求类型和相应的触发事件。此外,EXTI还提供了丰富的库函数和API,方便开发人员进行编程和配置。

总的来说,EXTI是微控制器中一个重要的外部中断/事件控制器,它可以实现对外部设备的中断和事件请求的管理和处理。在物联网和嵌入式系统等领域中,EXTI具有广泛的应用前景和重要的价值。

以上介绍来自文心一言。

GD32中的EXTI

很常规的EXTI,与STM32不一样的是,GD32这边的优先级是只有2位配置中断优先级的。

再看看中断的流程。

那根据上面的框图,我们要实现外部中断,要配置的东西就是边沿检测,极性控制,中断屏蔽控制(NVIC)。

然后和STM32一样的是,我们是GPIO几,那么中断线就是几号。并且同一时间同一个引脚号只能使用一种端口(A,B,C)

固件库函数

首先我们除了需要打开拿来外部中断的GPIO的外设时钟之外。由于我们还需要将GPIO口映射到中断线上,因此还需要配置系统时钟。

rcu_periph_clock_enable(RCU_CFGCMP);

exti_init

初始化EXTI。

如果我们用的是GPIO的0号引脚,那么选择0号中断线(EXTI_0),一号引脚就选择1号中断线,以此类推。

模式一般选择中断模式EXTI_INTERRUPT

exti_interrupt_enable

中断使能,输入的参数指定中断线。

exti_interrupt_flag_get

获取指定中断线的标志位,当我们有多条中断线共用一个中断处理函数的时候可以帮助我们判断具体是哪一个中断线触发的中断。

exti_interrupt_flag_clear

清除指定中断线的中断标志位。

关于EXTI的函数就上面几个就够了。但是根据框图,我们还需要将GPIO映射到中断线上,以及配置NVIC的优先级。

syscfg_exti_line_config

根据上面表格的参数来填写,将我们使用的端口以及对应的中断线选上。因为中断线的序号和GPIO的引脚号是一致的,所以只需要说是EXTI的哪个引脚(中断线)即可。

nvic_irq_enable

使能NVIC中断并且配置优先级。

可以自行去官方提供的固件库使用指南去寻找可以使用的枚举类型。

比如说我使用GPIO的0号引脚,那么我就使用红框框中的参数。

一切准备就绪,我们就可以开始中断了,最后一个问题就是中断处理函数,和STM32一样,我们去启动文件中的汇编文件里寻找。

示例代码

#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "OLED.h"int count=0;void EXTI0_1_IRQHandler(void){if(exti_interrupt_flag_get(EXTI_0) == SET){        //获取中断线0的标志位if(!gpio_input_bit_get(GPIOA,GPIO_PIN_0)){     //消抖处理delay_ms(15);gpio_bit_toggle(GPIOA, GPIO_PIN_5);count++;}exti_interrupt_flag_clear(EXTI_0);              //清除标志位}
}int main(void){systick_config();       //延时函数初始化OLED_Init();rcu_periph_clock_enable(RCU_GPIOA);         //打开GPIOA的外设时钟rcu_periph_clock_enable(RCU_CFGCMP);        //配置系统时钟gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_5);            //GPIOA5输出模式gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_5);   gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_PULLDOWN,GPIO_PIN_0);         //GPIOA0下拉输入模式nvic_irq_enable(EXTI0_1_IRQn, 1);                                           //NVIC分配优先级syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXTI_SOURCE_PIN0);                //将GPIO口映射到中断线上exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);                       //EXTI初始化exti_interrupt_enable(EXTI_0);                                              //中断使能while(1){OLED_ShowNum(1,1,count,2);delay_ms(1000);}
}

这篇关于【GD32】03 - EXTI外部中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987553

相关文章

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属