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.mzph.cn/diannao/10841.shtml

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

相关文章

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论&#xff0c;求二维梁的固有频率和振型。短边固定&#xff0c;给定长度、横截面积&#xff0c;弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通&#xff0c;可直接运行。 247 梁的振型仿真 固有频率…

Unity2D 模拟手柄实现玩家移动

1&#xff0c;创建控制器UI 2&#xff0c;挂载脚本 3&#xff0c;脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

企业级复杂前中台项目响应式处理方案

目录 01: 前言 02: 响应式下navigtionBar实现方案分析 数据 视图 小结 03: 抽离公用逻辑&#xff0c;封装系列动作 04: PC端navigationBar私有逻辑处理 05: 分析 navigationBar 闪烁问题 06: 处理 navigationBar 闪烁问题 07: category数据缓存&#xff0c;覆盖…

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…

程序员工作中常见问题,你遇到过几个?

在赛博朋克2077玩后感中&#xff0c;我提到&#xff0c;即便是在严谨的机制下&#xff0c;依然可能出现让人匪夷所思或是贻笑大方的问题。 那么今天&#xff0c;就以后端程序员的视角&#xff0c;盘点下从设计开发到上线的常见问题&#xff0c;看看大家中过几个。 01 设计与开…

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后&#xff0c;实时监控视频后台播放一段时间后&#xff0c;报错如下&#xff1a; The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下&#xff0c;直接用代码运行系统&#xff0c;视频在…

python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解

这篇文章主要介绍了python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 JDBC Request 这个 Sampler 可以向数据…

正点原子Linux学习笔记(九)在 LCD 上显示字符

在 LCD 上显示字符 23.1 原始方式&#xff1a;取模显示字符23.2 freetype 简介23.3 freetype 移植下载 FreeType 源码交叉编译 FreeType 源码安装目录下的文件移植到开发板 23.4 freetype 库的使用初始化 FreeType 库加载 face 对象设置字体大小加载字形图像 23.5 示例代码 前面…

FPGA第2篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介&#xff1a;首先&#xff0c;FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器&#xff0c;可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务&#xff0c;可以说是系统的"大脑"和"加速引擎&qu…

需求规格说明书设计规范(编制实际项目案例-word)

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 5.5 其他需求 六、…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化 引言 在数字化时代&#xff0c;网站和应用程序必须跨越地域限制&#xff0c;服务于全球…

Qt---事件

一、Qt中的事件 鼠标事件 鼠标进入事件enterEvent 鼠标离开事件leaveEvent 鼠标按下mousePressEvent ( QMouseEvent ev) 鼠标释放mouseReleaseEvent 鼠标移动mouseMoveEvent ev->x()&#xff1a;坐标 ev->y()&#xff1a;y坐标 ev->bu…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符&#xff08;变量、函数、属性或函数参数的名称&#xff09;&#xff1a;一般使用驼峰法命名&#xff0c;关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线&#xff08;_&#xff09;或美元符号…

docker 部署SSM项目(包含打包)

一&#xff1a;SSM项目打包 1.这个一定要勾选防止静态资源没打包上 2.第二步 3.第三步 4.更改名字(注意部署到线上的时候这里如果用docker或者window部署的话需要带这个项目名&#xff0c;不然会出现找不到接口的情况) ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

MCU通过UART/SPI等接口更新flash的方法

MCU可提供一种方便的方式来更新flash内容以进行错误修复bugfix或产品更新update。可以使用以下任何模式更新flash内容: •系统内编程(ISP,In-System Programming):用于使用内部bootloader程序和UART/SPI对片上闪存进行编程program或重新编程reprogram。 •应用程序内编程…

comfyui安装deforum启动不了,多半是ffmpeg的问题

如果报错中出现imageio 和 ffmpeg 的字样&#xff0c;去装requirement也没啥用 这里最好到cmd中&#xff0c;进入comfyui的python环境&#xff0c;运行以下两句&#xff1a; import imageio imageio.plugins.ffmpeg.download() 图例&#xff1a; 如果节点不报错了&#xff0…

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

java项目之企业OA管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业OA管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 企业OA管理系统的主要使用…

Nios-II编程入门实验

文章目录 一 Verilog实现流水灯二 Nios实现流水灯2.1 创建项目2.2 SOPC添加模块2.3 SOPC输入输出连接2.4 Generate2.5 软件部分2.6 运行结果 三 Verilog实现串口3.1 代码3.2 引脚3.3 效果 四 Nios2实现串口4.1 sopc硬件设计4.2 top文件4.3 软件代码4.4 实现效果 五 参考资料六 …