2-1 EXTI外部中断(gd32)

中断的概念

中断硬件结构/软件结构

EXTI中断

EXTI硬件结构

注:EXTI线在同一时刻只能连接一个GPIO口,如果我们先连接了PA0,然后又连接了PB0那么此时PA0这个IO口就失去作用。

中断触发函数

中断优先级

中断优先级

数值越小优先级越高,抢占优先级可以实现中断嵌套的效果,不同的分组有不同的抢占优先级

EXTI外部中断配置

配置步骤

根据学习库函数原理配置步骤一般为如下所示(类比学习hal库函数原理)

1:配置AFIO,中断引脚寻找

2:配资EXTI,边沿检测以及控制

3:配置NVIC,嵌套中断向量控制器(用于统一分配和管理优先级)

注:按照步骤将下图打通即可

配置EXTI外部中断

static void KeyExtiInit(void)
{/*使能EXTI时钟*/rcu_periph_clock_enable(RCU_AF);/*I/O连接到EXTI线*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
//	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_0);//gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_0);/*配置上升/下降沿*/exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_0);/*使能中断*/nvic_irq_enable(EXTI0_IRQn, 1, 0);/*key2*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_13);/*配置上升/下降沿*/exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_13);/*KEY3*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_14);/*配置上升/下降沿*/exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_14);// 使能中断nvic_irq_enable(EXTI10_15_IRQn, 1, 0);}

中断服务函数代码

 

// EXTI0中断服务函数,对应PA0口
void EXTI0_IRQHandler(void){// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_0) == SET){// 此时说明进入中断ToggleLed(LED1);		// 清除标志位,如果标志位没有清除为0,//会不断地进入中断服务函数当中,所以要清除中断标志位exti_interrupt_flag_clear(EXTI_0);}
}uint8_t flag = 0;// EXTI_10_15中断服务函数,对应PA0口
void EXTI10_15_IRQHandler(void){// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_13) == SET){// 此时说明进入中断ToggleLed(LED2);		// 清除标志位,如果标志位没有清除为0,会不断地进入中断服务函数当中,// 所以要清除中断标志位exti_interrupt_flag_clear(EXTI_13);			}// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_14) == SET){// 此时说明进入中断ToggleLed(LED3);		// 清除标志位,如果标志位没有清除为0,会不断地进入中断服务函数当中,// 所以要清除中断标志位exti_interrupt_flag_clear(EXTI_14);flag = 1;			}
}

 整个程序的完整结构

KEY_DRV.c代码

#include <stdint.h>
#include "gd32f30x.h"
#include "KEY_DRV.h"
#include <stdint.h>
#include "LED.h"static void KeyGpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_0);// 初始化剩下的两个按键rcu_periph_clock_enable(RCU_GPIOG);gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_13);gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_14);
}static void KeyExtiInit(void)
{/*使能EXTI时钟*/rcu_periph_clock_enable(RCU_AF);/*I/O连接到EXTI线*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
//	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_0);//gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_0);/*配置上升/下降沿*/exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_0);/*使能中断*/nvic_irq_enable(EXTI0_IRQn, 1, 0);/*key2*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_13);/*配置上升/下降沿*/exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_13);/*KEY3*/gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_14);/*配置上升/下降沿*/exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/*清除标志*/exti_interrupt_flag_clear(EXTI_14);// 使能中断nvic_irq_enable(EXTI10_15_IRQn, 1, 0);}/**
***********************************************************
* @brief 按键硬件初始化
* @param
* @return 
***********************************************************
*/
void KeyDrvInit(void)
{KeyGpioInit();KeyExtiInit();
}// EXTI0中断服务函数,对应PA0口
void EXTI0_IRQHandler(void){// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_0) == SET){// 此时说明进入中断ToggleLed(LED1);		// 清除标志位,如果标志位没有清除为0,//会不断地进入中断服务函数当中,所以要清除中断标志位exti_interrupt_flag_clear(EXTI_0);}
}uint8_t flag = 0;// EXTI_10_15中断服务函数,对应PA0口
void EXTI10_15_IRQHandler(void){// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_13) == SET){// 此时说明进入中断ToggleLed(LED2);		// 清除标志位,如果标志位没有清除为0,会不断地进入中断服务函数当中,// 所以要清除中断标志位exti_interrupt_flag_clear(EXTI_13);			}// 判断中断标志位,产生中断时标志位会设置为1if( exti_interrupt_flag_get(EXTI_14) == SET){// 此时说明进入中断ToggleLed(LED3);		// 清除标志位,如果标志位没有清除为0,会不断地进入中断服务函数当中,// 所以要清除中断标志位exti_interrupt_flag_clear(EXTI_14);flag = 1;			}
}

KEY_DRV.h代码

#ifndef _KEY_DRIVE_H_
#define _KEY_DRIVE_H_
#include <stdint.h>void KeyDrvInit(void);#endif

LED.C

#include "gd32f30x.h"                   // Device header
#include "Delay.h"// 结构体初始化
typedef struct{rcu_periph_enum rcu;uint32_t gpio;uint32_t pin;}Led_GPIO_t;// 保存GPIO口的资源信息
static Led_GPIO_t g_gpioList[] = {{RCU_GPIOA,GPIOA,GPIO_PIN_8},{RCU_GPIOE,GPIOE,GPIO_PIN_6},{RCU_GPIOF,GPIOF,GPIO_PIN_6},
};
// 获取内存空间的大小
#define LED_NUM_MAX (sizeof(g_gpioList)/sizeof(g_gpioList[0]))void LedDrv_Init(void){uint8_t i = 0;for(i = 0; i < LED_NUM_MAX;i++){rcu_periph_clock_enable(g_gpioList[i].rcu);gpio_init(g_gpioList[i].gpio,GPIO_MODE_OUT_PP,GPIO_OSPEED_2MHZ,g_gpioList[i].pin);// 熄灭LED灯	gpio_bit_reset(g_gpioList[i].gpio,g_gpioList[i].pin);	}
}void TurnOnLed(uint8_t ledNO){if(ledNO >= LED_NUM_MAX){return;}gpio_bit_set(g_gpioList[ledNO].gpio,g_gpioList[ledNO].pin);
};void TrunOffLed(uint8_t LedOff){if(LedOff >= LED_NUM_MAX){return;}gpio_bit_reset(g_gpioList[LedOff].gpio,g_gpioList[LedOff].pin);
};// led状态取反
void ToggleLed(uint8_t ledNO){FlagStatus bit_state;bit_state = gpio_input_bit_get(g_gpioList[ledNO].gpio,g_gpioList[ledNO].pin);// 当获取到的数据为0的时候 1 -0 等于 0 ,当获取到的数据为1的时候 1 - 1 = 0;bit_state = (FlagStatus)(1 - bit_state); gpio_bit_write(g_gpioList[ledNO].gpio,g_gpioList[ledNO].pin,bit_state);};

LED.H

 

#ifndef _LED_H_
#define _LED_H_#include <stdint.h>#define LED1 0
#define LED2 1
#define LED3 2void LedDrv_Init(void);
// 点亮LED ledNO 标号0-2
void TurnOnLed(uint8_t ledNO);
void TrunOffLed(uint8_t LedOff);
void ToggleLed(uint8_t ledNO);#endif

main.c

#include <stdint.h>
#include "gd32f30x.h"
#include "Delay.h"
#include "LED.h"
#include "KEY_DRV.h"extern uint8_t flag;
int main(void)
{    LedDrv_Init();KeyDrvInit();while(1){if(flag == 1){/*执行led是否被按下*/flag = 0;}	} }

仿真调试

 

按键运算补充

抢占优先级的作用

注:高优先级的任务会抢占低优先级的任务,数值越小表示优先级别越高,当抢占式优先级相同时

如果有一个任务响应式优先级更高,但是实际上抢占还是不会发生,仍然是执行前面优先级部分。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

加州大学欧文分校英语高级语法专项课程01:Verb Tenses and Passives 学习笔记

Verb Tenses and Passives Course Certificate Course Intro 本文是学习 Verb Tenses and Passives 这门课的学习笔记。 文章目录 Verb Tenses and PassivesWeek 01: Simple, Progressive, and Perfect Verb Tenses ReviewLearning Objectives Present Perfect Tense Review L…

企业级通用业务 Header 处理方案

目录 01: 处理 PC 端基础架构 02: 通用组件&#xff1a;search 搜索框能力分析 03: 通用组件&#xff1a;search 搜索框样式处理 04: 通用组件&#xff1a;Button 按钮能力分析 05: 通用组件&#xff1a;Button 按钮功能实现 06: 通用组件&#xff1a;完善 search 基本…

Photoshop 2022 for Mac/win:释放创意,打造专业级的图像编辑体验

在数字图像编辑的世界里&#xff0c;Adobe Photoshop 2022无疑是那颗璀璨的明星。这款专为Mac和Windows用户设计的图像处理软件&#xff0c;以其卓越的性能和丰富的功能&#xff0c;赢得了全球数百万创作者的青睐。 Photoshop 2022在继承前代版本强大功能的基础上&#xff0c;…

Appium 2.x 安装及使用

由于安全问题&#xff0c;Appium 1.x 版本不再被维护&#xff0c;但想要继续使用Appium进行自动化可以使用 Appium 2.x。 1. 安装Appium 2.x 在过往文章中有介绍过Appium 1.x 的安装&#xff0c;所以一些必备的软件(如&#xff1a;JDK、SDK、node.js、Python)安装就不再细嗦&…

STM32串口通信入门

文章目录 一、串口协议和RS-232标准&#xff0c;以及RS232电平与TTL电平的区别1.串口通信协议2.RS-232标准3.RS232电平与TTL电平的区别4.USB/TTL转232“模块&#xff08;CH340芯片为例&#xff09; 二、补充实验&#xff08;一&#xff09;几个常见的库函数、结构体1.时钟配置函…

C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

客户端的程序结构前半部分与服务器端基本相同&#xff0c;后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外&#xff0c;就不再做长篇大论的解释。强调一点&#xff0c;如果将此程序移到其它电脑上运行&#xff0c;编译需要releas…

Vue路由拆分

1.在src下建立router&#xff0c;在router中建立文件index 2.将main.js中部分内容复制 App <template> <div><a href"#/friend">朋友</a><br><a href"#/info">信息</a><br><a href"#/music&quo…

支持播放h265的插件

插件源码地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/nanguantong/flv-h265.js/overview 1. 下载代码 运行以下命令 npm i npm run build npm run build 后生成 flv.min.js 文件&#xff0c;引入使用 2. 调用 js 文件&#xff1a; let flvj…

完全背包问题(c++)

完全背包问题 当前有 N 种物品&#xff0c;第 i 种物品的体积是 ci​&#xff0c;价值是 wi​。 每种物品的数量都是无限的&#xff0c;可以选择任意数量放入背包。 现有容量为 V 的背包&#xff0c;请你放入若干物品&#xff0c;使总体积不超过 V&#xff0c;并且总价值尽可…

msvcp140dll怎么修复,分享5种有效的解决方法

MSVCP140.dll文件丢失这一现象究竟是何缘由&#xff0c;又会引发哪些令人头疼的问题呢&#xff1f;在探索这个问题的答案之前&#xff0c;我们先来深入了解这个神秘的DLL文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它扮演着至关重要的…

景源畅信:抖音小店的商品怎么同步到橱窗?

在数字营销的海洋中&#xff0c;抖音小店与橱窗的同步操作无疑是商家们关注的焦点。这不仅能增加商品的曝光度&#xff0c;还能提高交易的可能性。那么&#xff0c;如何将抖音小店的商品同步到橱窗呢? 一、核心步骤解析 要实现商品从抖音小店同步到橱窗&#xff0c;你需要确保…

汇昌联信:做拼多多网点需要具备什么能力?

在当前电商行业高速发展的背景下&#xff0c;拼多多以其独特的商业模式迅速崛起&#xff0c;成为众多创业者和商家关注的焦点。想要运营一家成功的拼多多网点&#xff0c;不仅需要对平台规则有深入的了解&#xff0c;还需要具备多方面的能力。这些能力是确保网点稳定运营并实现…

VBA_NZ系列工具NZ07:日期录入控件

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

Multisim 14 常见电子仪器的使用和Multisim的使用

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

利用PS在不伤背景的前提下根据颜色去除图像上不想要的内容

下面为一个例子&#xff0c;去除图像上红色的虚线 Step1.用套索工具框选带有颜色的部分 Step2.切换到魔术棒工具&#xff0c;上端选项中&#xff0c;点击与选区交叉&#xff0c;连续这一项不要勾选 Step3.在需要去除的部分点击一下即可在框选范围内选中所有同颜色的区域&#x…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;1&#xff09; 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言&#xff0c;常使用配置文件来管理所有配置&#xff0c;比如 SpringBoot 的 application.y…

事件高级。

一、注册事件&#xff08;绑定事件&#xff09; 就是给元素添加事件 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 1 传统注册方式 方法监听注册事件 2、 addEventListener 事件监听方式 里面的事件类型是字符串&#xff0c;必定加引号&#xff0c;而且不带o…

VScode 修改 Markdown Preview Enhanced 主题与字体

VScode 修改 Markdown Preview Enhanced 主题与字体 1. 修改前后效果对比2. 修改主题2.1 更改默认主题2.2 修改背景色 3. 修改字体 VS Code基础入门使用可查看&#xff1a; VS Code 基础入门使用&#xff08;配置&#xff09;教程 其他Vs Code 配置可关注查看&#xff1a; Vs C…

C++:9.scanf扩展——原来这么好用!

——scanf&#xff1a;我**不常用了&#xff1f; 有一天看到了一道题&#xff1a; C 输入一个时间&#xff0c;输出它属于&#xff0c;白天&#xff0c;下午还是黑夜。 输入样例&#xff1a; 15:20 00:00 13:14 05:20 11:45 14:00 ……??? 大胆题目小瞧我的编程水平!!!!!…

[图解]实现领域驱动设计译文暴露的问题02

0 00:00:00,500 --> 00:00:02,190 今天呢&#xff0c;我们 1 00:00:02,470 --> 00:00:04,820 继续来谈一谈 2 00:00:05,150 --> 00:00:07,790 实现领域驱动设计的中译本 3 00:00:08,630 --> 00:00:09,690 的译文 4 00:00:10,070 --> 00:00:11,710 暴露的问题…