GD32F407ZGT6/GD32F450ZGT6(3)外部中断实验

 本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发

       向上代码兼容GD32F450ZGT6中使用

       后续项目主要在下面该专栏中发布:

https://blog.csdn.net/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482

       感兴趣的点个关注收藏一下吧!

       电机驱动开发可以跳转:

GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-CSDN博客

       BMS电源系统开发可以跳转:暂未放链接

本教程使用开发板:

因为先前F4的开发板用于BMS储能开发,涉及隐私无法在此基础上继续公布,所以就手忙脚乱的自制了一块专门用于教程的开发板,部分还未焊接完毕,焊油也未洗掉,后续会慢慢美化的。 

 群号:621154399

有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。

介绍

Cortex®-M4 集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))
来实现高效的异常和中断处理。NVIC 实现了低延迟的异常和中断处理,以及电源管理控制。
它和内核是紧密耦合的。
EXTI(中断/事件控制器)包括 23 个相互独立的边沿检测电路并且能够向处理器内核产生中断
请求或唤醒事件。EXTI 有三种触发类型:上升沿触发、下降沿触发和任意沿触发。EXTI 中的
每一个边沿检测电路都可以独立配置和屏蔽。

具体详细介绍可以参考F1/F3系列教程:

GD32F103RCT6/GD32F303RCT6(4)外部中断

主要特征

异常类型

手册中对应:

代码中对应:

可以在启动文件中找到以下内容:

Default_Handler PROC
;               /* external interrupts handler */EXPORT  WWDGT_IRQHandler                  [WEAK]EXPORT  LVD_IRQHandler                    [WEAK]                  EXPORT  TAMPER_STAMP_IRQHandler           [WEAK]           EXPORT  RTC_WKUP_IRQHandler               [WEAK]               EXPORT  FMC_IRQHandler                    [WEAK]                EXPORT  RCU_CTC_IRQHandler                [WEAK]                 EXPORT  EXTI0_IRQHandler                  [WEAK]                  EXPORT  EXTI1_IRQHandler                  [WEAK]                 EXPORT  EXTI2_IRQHandler                  [WEAK]               EXPORT  EXTI3_IRQHandler                  [WEAK]                EXPORT  EXTI4_IRQHandler                  [WEAK]                 EXPORT  DMA0_Channel0_IRQHandler          [WEAK]         EXPORT  DMA0_Channel1_IRQHandler          [WEAK]          EXPORT  DMA0_Channel2_IRQHandler          [WEAK]        EXPORT  DMA0_Channel3_IRQHandler          [WEAK]         EXPORT  DMA0_Channel4_IRQHandler          [WEAK]          EXPORT  DMA0_Channel5_IRQHandler          [WEAK]          EXPORT  DMA0_Channel6_IRQHandler          [WEAK]          EXPORT  ADC_IRQHandler                    [WEAK]         EXPORT  CAN0_TX_IRQHandler                [WEAK]          EXPORT  CAN0_RX0_IRQHandler               [WEAK]          EXPORT  CAN0_RX1_IRQHandler               [WEAK]           EXPORT  CAN0_EWMC_IRQHandler              [WEAK]           EXPORT  EXTI5_9_IRQHandler                [WEAK]           EXPORT  TIMER0_BRK_TIMER8_IRQHandler      [WEAK]  EXPORT  TIMER0_UP_TIMER9_IRQHandler       [WEAK]  EXPORT  TIMER0_TRG_CMT_TIMER10_IRQHandler [WEAK]EXPORT  TIMER0_Channel_IRQHandler         [WEAK]        EXPORT  TIMER1_IRQHandler                 [WEAK]       EXPORT  TIMER2_IRQHandler                 [WEAK]           EXPORT  TIMER3_IRQHandler                 [WEAK]           EXPORT  I2C0_EV_IRQHandler                [WEAK]          EXPORT  I2C0_ER_IRQHandler                [WEAK]         EXPORT  I2C1_EV_IRQHandler                [WEAK]         EXPORT  I2C1_ER_IRQHandler                [WEAK]         EXPORT  SPI0_IRQHandler                   [WEAK]        EXPORT  SPI1_IRQHandler                   [WEAK]          EXPORT  USART0_IRQHandler                 [WEAK]         EXPORT  USART1_IRQHandler                 [WEAK]         EXPORT  USART2_IRQHandler                 [WEAK]        EXPORT  EXTI10_15_IRQHandler              [WEAK]        EXPORT  RTC_Alarm_IRQHandler              [WEAK]        EXPORT  USBFS_WKUP_IRQHandler             [WEAK]        EXPORT  TIMER7_BRK_TIMER11_IRQHandler     [WEAK] EXPORT  TIMER7_UP_TIMER12_IRQHandler      [WEAK] EXPORT  TIMER7_TRG_CMT_TIMER13_IRQHandler [WEAK]EXPORT  TIMER7_Channel_IRQHandler         [WEAK]        EXPORT  DMA0_Channel7_IRQHandler          [WEAK]       EXPORT  EXMC_IRQHandler                   [WEAK]         EXPORT  SDIO_IRQHandler                   [WEAK]           EXPORT  TIMER4_IRQHandler                 [WEAK]           EXPORT  SPI2_IRQHandler                   [WEAK]          EXPORT  UART3_IRQHandler                  [WEAK]          EXPORT  UART4_IRQHandler                  [WEAK]          EXPORT  TIMER5_DAC_IRQHandler             [WEAK]         EXPORT  TIMER6_IRQHandler                 [WEAK]        EXPORT  DMA1_Channel0_IRQHandler          [WEAK]          EXPORT  DMA1_Channel1_IRQHandler          [WEAK]          EXPORT  DMA1_Channel2_IRQHandler          [WEAK]         EXPORT  DMA1_Channel3_IRQHandler          [WEAK]         EXPORT  DMA1_Channel4_IRQHandler          [WEAK]          EXPORT  ENET_IRQHandler                   [WEAK]         EXPORT  ENET_WKUP_IRQHandler              [WEAK]         EXPORT  CAN1_TX_IRQHandler                [WEAK]          EXPORT  CAN1_RX0_IRQHandler               [WEAK]         EXPORT  CAN1_RX1_IRQHandler               [WEAK]          EXPORT  CAN1_EWMC_IRQHandler              [WEAK]          EXPORT  USBFS_IRQHandler                  [WEAK]          EXPORT  DMA1_Channel5_IRQHandler          [WEAK]          EXPORT  DMA1_Channel6_IRQHandler          [WEAK]          EXPORT  DMA1_Channel7_IRQHandler          [WEAK]          EXPORT  USART5_IRQHandler                 [WEAK]          EXPORT  I2C2_EV_IRQHandler                [WEAK]         EXPORT  I2C2_ER_IRQHandler                [WEAK]          EXPORT  USBHS_EP1_Out_IRQHandler          [WEAK]    EXPORT  USBHS_EP1_In_IRQHandler           [WEAK]    EXPORT  USBHS_WKUP_IRQHandler             [WEAK]             EXPORT  USBHS_IRQHandler                  [WEAK]            EXPORT  DCI_IRQHandler                    [WEAK]                      EXPORT  TRNG_IRQHandler                   [WEAK]          EXPORT  FPU_IRQHandler                    [WEAK]          

用于中断发生后的处理查找

相信大家也看见了其中两个特殊函数,没错,就是我们在编写F1系列的UCOSIII移植教程的过程中修改的两个中断:

结构框图

EXTI包含 23 个相互独立的边沿检测电路并且可以向处理器产生中断请求或事件唤醒。 EXTI
3 种触发类型:上升沿触发,下降沿触发和任意沿触发。 EXTI 中每个边沿检测电路都可以分
别予以配置或屏蔽。
EXTI 触发源包括来自 I/O 管脚的 16 根线以及来自内部模块的 7 根线,具体细节参考 触发源表格 。通过配置 SYSCFG_EXTISSx 寄存器,所有的 GPIO 管脚都可以被选作 EXTI 的触发源,

EXTI触发源

软件触发
按照如下步骤软件也可以触发 EXTI 中断或事件:
1. 配置对应的 EXTI_INTEN EXTI_EVEN 位使能中断或事件;
2. 配置 EXTI_SWIEV 寄存器的对应 SWIEVx 位,使能的中断或事件将被立即触发。如果为
中断触发,则对应的 PD 位将立刻被置 1 ;如果为事件触发,则对应的 PD 位不被置 1
软件需要响应该中断或事件并清除相应 PDx

EXTI 线编号

触发源

0

PA0/PB0/PC0/PD0/PE0/PF0/PG0

1

PA1/PB1/PC1/PD1/PE1/PF1/PG1

2

PA2/PB2/PC2/PD2/PE2/PF2/PG2

3

PA3/PB3/PC3/PD3/PE3/PF3/PG3

4

PA4/PB4/PC4/PD4/PE4/PF4/PG4

5

PA5/PB5/PC5/PD5/PE5/PF5/PG5

6

PA6/PB6/PC6/PD6/PE6/PF6/PG6

7

PA7/PB7/PC7/PD7/PE7/PF7/PG7

8

PA8/PB8/PC8/PD8/PE8/PF8/PG8

9

PA9/PB9/PC9/PD9/PE9/PF9/PG9

10

PA10/PB10/PC10/PD10/PE10/PF10/PG10

11

PA11/PB11/PC11/PD11/PE11/PF11/PG11

12

PA12/PB12/PC12/PD12/PE12/PF12/PG12

13

PA13/PB13/PC13/PD13/PE13/PF13/PG13

14

PA14/PB14/PC14/PD14/PE14/PF14/PG14

15

PA15/PB15/PC15/PD15/PE15/PF15/PG15

16

LVD

17

RTC 闹钟

18

USB 唤醒

EXTI寄存器

本章寄存器和库函数讲解,大部分我们依旧可以参考之前F1系列的文章:

 具体详细介绍可以参考F1/F3系列教程:

GD32F103RCT6/GD32F303RCT6(4)外部中断

本章以基于F1/F303以前教程为基础升级而来,因此对于重复的内容就不做过多追叙了。

按键中断控制LED实验

演示视频:

按键中断控制LED演示视频

编程要点:

1.使能 GPIO 端口时钟

2.初始化 EXTI

3.配置 NVIC

4.编写中断服务函数

我们本期讲解依旧以模块化的方式进行,以便丰富我们的外设库文件!

 详细模块化编程以及按键注意事项可以参考F1文章:

GD32F103RCT6/GD32F303RCT6(3.2)GPIO外设使用-实验编程

  通过按下按键达到翻转LED电平状态

按键在原理图中对应的引脚为:

PG2-PG6

首先便是存在于bsp_key.c中的按键初始化函数。

/**@brief 按键驱动初始化@param 无@return 无
*/
void Key_GPIO_Init(void)
{rcu_periph_clock_enable(KEY1_GPIO_CLK);gpio_mode_set(KEY1_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,KEY1_GPIO_PIN);gpio_mode_set(KEY2_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,KEY2_GPIO_PIN);gpio_mode_set(KEY3_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,KEY3_GPIO_PIN);gpio_mode_set(KEY4_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,KEY4_GPIO_PIN);gpio_mode_set(KEY5_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,KEY5_GPIO_PIN);

以及我们的按键检测函数:

 /** 函数名:Key_Scan* 描述  :检测是否有按键按下* 输入  :GPIOx:x 可以是 A,B,C,D或者 E*		     GPIO_Pin:待读取的端口位 	* 输出  :KEY_OFF(没按下按键)、KEY_ON(按下按键)*/
uint8_t Key_Scan(uint32_t gpio_periph, uint32_t pin)
{			/*检测是否有按键按下 */if(gpio_input_bit_get(gpio_periph, pin) == KEY_ON)  {	 /*等待按键释放 */while(gpio_input_bit_get(gpio_periph, pin) == KEY_ON);   return 	KEY_ON;	 }elsereturn KEY_OFF;
}

其次是存在于中断文件bsp_exti.h中的中断初始化函数:

/********************************************************************** */
/**@brief 按键外部中断初始化@param 无@return 无
*/
void Key_EXTI_Init(void)
{rcu_periph_clock_enable(RCU_SYSCFG);// 设置优先级分组nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);nvic_irq_enable(EXTI2_IRQn, 0U, 2U);nvic_irq_enable(EXTI3_IRQn, 0U, 2U);nvic_irq_enable(EXTI4_IRQn, 0U, 2U);nvic_irq_enable(EXTI5_9_IRQn, 0U, 2U);/* connect key EXTI line to key GPIO pin */syscfg_exti_line_config(EXTI_SOURCE_GPIOG, EXTI_SOURCE_PIN2 );syscfg_exti_line_config(EXTI_SOURCE_GPIOG, EXTI_SOURCE_PIN3 );syscfg_exti_line_config(EXTI_SOURCE_GPIOG, EXTI_SOURCE_PIN4 );syscfg_exti_line_config(EXTI_SOURCE_GPIOG, EXTI_SOURCE_PIN5 );syscfg_exti_line_config(EXTI_SOURCE_GPIOG, EXTI_SOURCE_PIN6 );	/* configure key EXTI line */exti_init( EXTI_2 , EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_init( EXTI_3 , EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_init( EXTI_4 , EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_init( EXTI_5 , EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_init( EXTI_6 , EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_interrupt_flag_clear(EXTI_2 );exti_interrupt_flag_clear(EXTI_3 );exti_interrupt_flag_clear(EXTI_4 );exti_interrupt_flag_clear(EXTI_5 );exti_interrupt_flag_clear(EXTI_6 );	 }

其次就是存放于gd32f4xx_it.c中的中断处理函数了:

void EXTI2_IRQHandler(void)
{if(RESET != exti_interrupt_flag_get(EXTI_2)) {LED1_TOG;exti_interrupt_flag_clear(EXTI_2);}
}void EXTI3_IRQHandler(void)
{if(RESET != exti_interrupt_flag_get(EXTI_3)) {LED2_TOG;exti_interrupt_flag_clear(EXTI_3);}
}void EXTI4_IRQHandler(void)
{if(RESET != exti_interrupt_flag_get(EXTI_4)) {LED3_TOG;exti_interrupt_flag_clear(EXTI_4);}
}void EXTI5_9_IRQHandler(void)
{if(RESET != exti_interrupt_flag_get(EXTI_5)) {LED4_TOG;exti_interrupt_flag_clear(EXTI_5);}if(RESET != exti_interrupt_flag_get(EXTI_6)) {LED5_TOG;exti_interrupt_flag_clear(EXTI_6);}
}

抢占优先级,数字越小,优先级越高

若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高

当中断发生时,对应的中断服务函数就会被执行,我们可以在中断服务函数实现一些控制。

一般为确保中断确实发生,我们会在中断服务函数中调用中断标志位状态读取函数读取外设中断标志位并判断标志位状态。

代码完成编写,现在烧录!

与实验预期相符合,完成!

具体代码请参考例程

可以关注我,点个关注获取本节例程哦

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

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

相关文章

商品详情接口在独立站的应用及接口请求示例

商品详情接口在独立站的应用主要体现在以下几个方面,这些应用不仅提升了独立站的运营效率,也优化了用户体验: 商品信息查询与展示: 商品详情接口允许独立站通过商品ID或关键词快速查询商品详细信息,包括价格、库存、…

用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意:手动分配内存,指的是在堆内存中。 除非实现自己的数据结构,否则永远不要手动分配内存! 即使这样,您也应该通过std::allocator…

Nerstudio 相机优化代码理解

源码 有两种模式,SO3xR3和SE3,代表不同的刚体变换,都是6个参数,表述三个旋转角3个偏移量 # Initialize learnable parameters.if self.config.mode "off":passelif self.config.mode in ("SO3xR3", "S…

ABC353

A #include<bits/stdc.h>using namespace std;int n;int main() {cin>>n;int m0;int i0;int pos0;while(m<n){mpow(2,i);i;pos;}cout<<pos; }B 模拟 #include <iostream> #include <cstring> #include <algorithm>using namespace s…

进入新公司有焦虑感怎么办?

前因 前两天技术交流群里有童鞋问了一个很有意思的问题&#xff0c;他问如何克服进入新公司的焦虑感&#xff1f;很多热心的童鞋都纷纷支招&#xff0c;比如 “主动干活”、“专注干活”、“让时间冲淡焦虑感”、……等等&#xff0c;这些都很有道理&#xff0c;不过&#xff…

今时今日蜘蛛池还有用吗?

最近不知道哪里又开始刮起“蜘蛛池”这个风气了&#xff0c;售卖、购买蜘蛛池的行为又开始在新手站长圈里开始蔓延和流行了起来&#xff0c;乍一看到“蜘蛛池”这个词给明月的感受就是陌生&#xff0c;要经过回忆才能想起来一些残存的记忆&#xff0c;所谓的蜘蛛池说白了就是利…

PHP编程入门:揭开Web开发的神秘面纱

PHP编程入门&#xff1a;揭开Web开发的神秘面纱 在数字化时代&#xff0c;PHP作为一种广泛使用的服务器端脚本语言&#xff0c;为Web开发领域注入了强大的活力。无论你是编程新手还是有一定经验的开发者&#xff0c;掌握PHP编程都将为你开启一扇通往Web开发新世界的大门。接下…

grpc接口调用

grpc接口调用 准备依赖包clientserver 参考博客&#xff1a; Grpc项目集成到java方式调用实践 gRpc入门和springboot整合 java 中使用grpc java调用grpc服务 准备 因为需要生成代码&#xff0c;所以必备插件 安装后重启 依赖包 <?xml version"1.0" encoding&…

mysql buffer pool 详解

概念&#xff1a;为了缓存磁盘中的页&#xff0c;mysql服务器启动时会向操作系统申请一片连续的内存空间&#xff0c;这片连续的内存空间叫做buffer pool&#xff0c;即缓冲池。 buffer pool 默认大小&#xff1a;128M innodb_buffer_pool_size&#xff1a;自定义缓冲池大小 …

ECS搭建redis4.0集群版

在 CentOS 上安装 Redis 4.0 集群版涉及多个步骤&#xff0c;包括安装 Redis、配置集群并启动它。下面将详细介绍整个过程&#xff1a; 1. 系统更新 首先&#xff0c;保证系统是最新的。 sudo yum update2. 安装依赖项 安装构建 Redis 所必需的依赖&#xff1a; sudo yum …

计算机三级等级考试

计算机等级考试&#xff1a; 一&#xff1a;理论知识考试 100分考60分 1&#xff1a;题库 二&#xff1a;技能考试 100分考60分 1&#xff1a;写文档 项目概述 功能描述 数据库设计 UML 绘 图 用例图 与 包图&#xff08;两个图&#xff09; 2&…

使用 nmcli 命令设置 IP 地址并排查网络故障

在现代网络管理中&#xff0c;nmcli&#xff08;NetworkManager Command Line Interface&#xff09;是一个非常强大和实用的工具。它不仅可以帮助你设置 IP 地址&#xff0c;还能协助排查各种网络故障。今天&#xff0c;我们将深入探讨如何使用 nmcli 命令来高效地管理你的网络…

node mysql的增删改查基础

学习koa时&#xff0c;不选择mongodb&#xff0c;而是MySQL&#xff0c;虽然node对mongodb更亲和&#xff0c;但是我感觉MySQL的键值对的储存结构更正规 1.首选确认你的数据库有个库。有个表,我的如下 2.配置 let mySqlConfig{host:localhost,user:root,password:123456,data…

C#操作MySQL从入门到精通(10)——对查询数据进行通配符过滤

前言 我们有时候需要查询数据,并且这个数据包含某个字符串,这时候我们再使用where就无法实现了,所以mysql中提供了一种模糊查询机制,通过Like关键字来实现,下面进行详细介绍: 本次查询的表中数据如下: 1、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…

rose 聊开源—1 你为什么需要一个开源项目

我自己从最开始开源 rosedb/lotusdb&#xff0c;以及一些其他组件&#xff0c;折腾开源也有很多年了&#xff0c;这次想写一个关于开源项目的系列&#xff0c;结合我自己的实际经历&#xff0c;讲讲开源项目的开发、参与、维护、流程规范、收获、盈利等内容&#xff0c;希望这个…

2024.6.5

1、react原理学习&#xff0c; hook、fiber 2、瀑布流组件完善 3、代码随想录二刷

如何充分利用代理IP扩大网络接触面

目录 前言 第一部分&#xff1a;什么是代理IP&#xff1f; 第二部分&#xff1a;如何获取代理IP&#xff1f; 1. IP质量 2. 匿名性 3. 限制 第三部分&#xff1a;如何使用代理IP&#xff1f; 第四部分&#xff1a;如何充分利用代理IP&#xff1f; 总结&#xff1a; 前…

【java前端课堂】04_类的继承

类的继承 在Java中&#xff0c;继承是面向对象编程的四大基本特性之一&#xff0c;它允许我们根据一个已有的类来定义一个新的类&#xff0c;这个新的类继承了原有类的特性&#xff08;属性和方法&#xff09;&#xff0c;并可以添加新的特性或修改原有特性。这样&#xff0c;…

Web前端框架:深入探索与实践

Web前端框架&#xff1a;深入探索与实践 在当下数字化飞速发展的时代&#xff0c;Web前端框架的选择与应用成为了开发者们关注的焦点。Node.js&#xff0c;作为一种强大的后端技术&#xff0c;在前端框架的构建中也发挥着不可或缺的作用。本文将围绕Node.js Web前端框架&#…

KNN 算法【python,机器学习,算法】

KNN&#xff08;K-Nearest Neighbors&#xff09;算法是一种基本的、易于理解的机器学习算法&#xff0c;用于分类和回归问题。在 KNN 中&#xff0c;一个对象的分类或值是基于其k个最近邻居的多数投票或平均值来决定的。 基本原理 距离度量&#xff1a;首先&#xff0c;KNN …