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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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&…

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、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…

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; 前…

【Python数据预处理系列】Pandas 数据操作实战:掌握 .loc[] 方法进行高效数据选取

文章将详细介绍.loc[]方法的各种使用场景&#xff0c;帮助读者深入理解并掌握这一核心功能。 在Pandas库中&#xff0c;.loc[]方法是一种强大而灵活的数据选取工具。本文将通过详细的步骤和示例&#xff0c;手把手教您如何利用这一工具进行高效的数据操作。 首先&#xff0c;我…

掌握SVG基础:从零开始学习

格栅图可以实现图片的清晰显示&#xff0c;但这也意味着如果要在各种设备上使用格栅图&#xff0c;就会增加大量不同规格的格栅图&#xff0c;以适应各种尺寸的设备。这也直接导致资源文件体积的增加&#xff0c;矢量图没有这个问题。本文将SVG代码编写与即时设计工具相结合&am…

C++ Primer 总结索引 | 第十五章:面向对象程序设计

继承和动态绑定 对程序的编写 有两方面的影响&#xff1a;一是 我们可以更容易地定义与其他类相似 但不完全相同的新类&#xff1b;二是 在使用这些彼此相似的类编写程序时&#xff0c;我们可以在一定程度上 忽略掉它们的区别 在很多程序中都存在着一些相互关联 但是有细微差别…

PDF批量加水印 与 去除水印实践

本文主要目标是尝试去除水印&#xff0c;但是为了准备测试数据&#xff0c;我们需要先准备好有水印的pdf测试文件。 注意&#xff1a;本文的去水印只针对文字悬浮图片悬浮两种特殊情况&#xff0c;即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…

【Web API DOM10】日期(时间)对象

一&#xff1a;实例化 1 获取系统当前时间即创建日期对象 const date new Date() console.log(date) 2024年6月5日周三 2 获取指定的时间 以获取2025年6月29日为例 const date new Date(2025-6-29) console.log(date) 二&#xff1a;日期对象方法 1 使用场景&#xf…

关于信号翻转模块(sig_flag_mod)的实现

关于信号翻转模块(sig_flag_mod)的实现 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于信号翻转模块(sig_flag_mod)的实现一、引言二、实现信号翻转模块的方法&#xff08;1&#xff09;输入接口&#xff08;2&#xff09;输出接口&…

新手学习编程网站一站式合集

LTPP在线开发平台 探索编程世界的新天地&#xff0c;为学生和开发者精心打造的编程平台&#xff0c;现已盛大开启&#xff01;这个平台汇集了近4000道精心设计的编程题目&#xff0c;覆盖了C、C、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3以及C#等众多编程语…

【javaEE初阶】

&#x1f308;&#x1f308;&#x1f308;关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE&#xff0c;一般称为java企业版&#xff0c;实际上java的历史可以追溯到上个世纪90年代&#xff0c;当时主要的语言主流的还是C语言和C&#xff0c;但是在那个时期嵌入式初…

小熊家务帮day13-day14 门户管理(ES搜索,Canal+MQ同步,索引同步)

目录 1 服务搜索1.1 需求分析1.2 技术方案1.2.1 使用Elasticsearch进行全文检索&#xff08;为什么数据没有那么多还要用ES&#xff1f;&#xff09;1.2.2 索引同步方案1.2.2.1 Canal介绍1.2.2.1 Canal工作原理 1 服务搜索 1.1 需求分析 服务搜索的入口有两处&#xff1a; 在…