零基础国产GD32单片机编程入门(二)GPIO输入中断含源码

文章目录

    • 一.概要
    • 二.可嵌套的向量中断控制器 (NVIC)
    • 三.中断向量表
    • 四.中断优先级详解
    • 五.GD32外部中断控制器(EXTI)
      • 1.EXTI简介
      • 2.EXTI在中断向量表的位置
      • 3.EXTI外部中断产生的信号流向
      • 4.EXTI中断产生后的中断服务程序
    • 六.GPIO输入中断的例程实验
    • 七.工程源代码下载
    • 八.小结

一.概要

中断是指单片机正在处理某个事件A,发生了另一件事件B,请求单片机迅速去处理(中断发生),单片机暂时停止当前的工作(中断响应),转去处理事件B(中断服务),待单片机处理事件B完成后,再回到原来的事件A(断点)继续执行,这一过程称之为中断。
GD32单片机的中断系统支持多种中断类型,包括内部中断和外部中断。内部中断通常由处理器内部的事件引发,如定时器溢出、除零错误等,而外部中断则由外部硬件或设备触发的事件引发,如按键按下、传感器触发等。

二.可嵌套的向量中断控制器 (NVIC)

CortexM3当中有一个强大而方便的NVIC即嵌套向量中断控制器(Nested Vectored Interrupt Controller),它是属于Cortex内核的器件,中断向量表中60多个中断都由它来处理。NVIC是Cortex-M3核心的一部分,Cortex-M3的向量中断统一由NVIC管理。

NVIC的核心功能是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,它控制着GD32中断向量表中中断号为0-67的68个中断!外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能。

三.中断向量表

在中断向量表里给我们列出了各种外部中断

下图是内核的中断
在这里插入图片描述
在这里插入图片描述

外设相关的外部中断
在这里插入图片描述

四.中断优先级详解

中断优先级分为抢占优先级和子优先级两部分,用于确定中断的响应顺序和执行顺序。抢占优先级用于确定中断的响应优先级,而子优先级用于确定中断的实际执行优先级。当多个中断同时触发时,系统会优先处理抢占优先级较高的中断,而在相同抢占优先级的情况下,会根据子优先级来确定中断的执行顺序
在这里插入图片描述

五.GD32外部中断控制器(EXTI)

1.EXTI简介

GD32单片机的外部中断/事件控制器(External Interrupt/Event Controller,简称EXTI),使得微控制器能够高效地响应外部事件并执行相应的任务,EXTI允许GD32微控制器对外部事件进行监测和响应,这些事件可以是来自GPIO引脚的电平变化信号。当外部事件发生时,EXTI能够立即唤醒微控制器,并执行预定义的中断服务程序(ISR)或者事件处理函数,我们接下去对EXTI外部中断进行详细介绍。
EXTI(中断/事件控制器)包括20个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。

2.EXTI在中断向量表的位置

GPIO口外部中断在中断向量表中分配了16个中断向量(EXTI0~EXTI4)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GPIO对应的外部中断,例如PA0,PB0,PC0对应的中断服务程序都是EXTI0_IRQHandler,一般设计只能选择其中一个引脚作为EXTI0中断输入脚。
在这里插入图片描述

3.EXTI外部中断产生的信号流向

如下图是外部中断的信号流向

1.外部中断可以是GPIO的任意一个引脚,就是高低电平信号输入脚。
2.外部信号经过一个边沿检测电路,通过极性控制器选择边沿,检测到了就在后面的或门处给个1,中断屏蔽寄存器设置为1表示开放中断,电路输出的信号会被保存到挂起寄存器(EXTI_PD)内,出来的信号发送到内核NVIC中请求产生中断,并跳转到中断服务函数。

在这里插入图片描述

4.EXTI中断产生后的中断服务程序

中断向量表中的中断服务函数就是下面几个,中断产生后就会跳入相应函数,我们应用程序就可以对中断后需要做的事进行修改。
在这里插入图片描述

我们应用过程中一般在gd32f10x_it.c中对中断服务函数进行应用修改就可以

void EXTI0_IRQHandler(void)
{exti_interrupt_flag_clear(EXTI_0);IntFlag=0x55;
}

六.GPIO输入中断的例程实验

硬件准备:

STLINK接GD32F103C8T6开发板,STLINK接电脑USB口。

在这里插入图片描述

实验原理:通过板子的 PA0 引脚配置成中断输入引脚,PB4 引脚配置成输出,按下按键,PA0 引脚就会进入一次外部中断,检测到外部中断,改变 PB4 输出电平的高低,从而实现 LED 灯的亮灭。

主要代码:

#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"uint8_t IntFlag;//是否产生中断标志
void EXTI0_IRQHandler(void)//外部中断0中断服务程序
{exti_interrupt_flag_clear(EXTI_0);IntFlag=0x55;//中断标志产生
}
extern uint8_t IntFlag;
int main(void)
{rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_HXTAL         (uint32_t)(108000000)),8M外部晶振  (#define HXTAL_VALUE    ((uint32_t)8000000))systick_config();//配置1ms SysTickrcu_periph_clock_enable(RCU_AF);//AF时钟使能 gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//下载口NJTRST引脚当做普通I/O口rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟打开gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成输出//配置PA0外部中断rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, GPIO_PIN_0);/* enable and set key EXTI interrupt to the lowest priority */nvic_irq_enable(EXTI0_IRQn, 2U, 0U);//外部中断0使能/* connect key EXTI line to key GPIO pin */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);//PA0作为外部中断0/* configure key EXTI line */exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_RISING);//上升沿中断exti_interrupt_flag_clear(EXTI_0);while(1){if(gpio_input_bit_get(GPIOA,GPIO_PIN_0)==SET && IntFlag==0x55)//如果产生中断,按键被按下,灯闪烁{delay_1ms(100);gpio_bit_set(GPIOB, GPIO_PIN_4);//LED灯灭delay_1ms(100);gpio_bit_reset(GPIOB, GPIO_PIN_4);//LED灯亮}}}

七.工程源代码下载

通过百度网盘分享的文件:2.GPIO外部中断输入.zip
链接:https://pan.baidu.com/s/1CS4bHB08B_y84rlAfMmcAw
提取码:hz8l
如果链接失效,可以联系博主给最新链接

程序下载下来之后解压就行

CSDN代码

八.小结

中断是GD32单片机开发中经常会用到的功能,对中断有了一定了解,在开发中应用中断,在程序中应用中断能使单片机的运行效率提升很多。

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

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

相关文章

Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行

需求背景 一、 系统目标与功能概述 脚本管理: 系统需要能够组织和存储所有通过playwright官方插件录制的脚本。这包括脚本的上传、编辑、删除和版本控制功能。 脚本执行: 用户应该能够在后台界面上查看所有可用的脚本,并能够通过简单的点击操作来启动特定脚本的执…

Visual Basic 6.0教程/Visual Basic从入门到实践/Visual Basic学习视频教程

Visual Basic 6.0教程/Visual Basic从入门到实践/Visual Basic学习视频教程 李天生VB从入门到精通 第一章 VisualBasic6基本介绍 第二章 VisualBasic6的数据类型与运算符表达式 第三章 VisualBasic6的内部函数 第四章 VisualBasic6的基本语句 第五章 VisualBasic6的数组 第六章…

RX 8000系显卡规格曝光,全系GDDR6纯过渡产品

原文转载修改自(更多互联网新闻/搞机小知识): RX 8000系显卡规格首曝,GDDR6显存就很骨感 前天,我们刚刚聊过有过新一代RTX 50系消息,虽然是按部就班地升级,但好在也是在升级。50系换核心升级显…

Sentinel熔断与限流

一、服务雪崩与解决方案 1.1、服务雪崩问题 一句话:微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图…

RabbitMQ 集群与高可用性

目录 单节点与集群部署 1.1. 单节点部署 1.2. 集群部署 镜像队列 1.定义与工作原理 2. 配置镜像队列 3.应用场景 4. 优缺点 5. Java 示例 分布式部署 1. 分布式部署的主要目标 2. 典型架构设计 3. RabbitMQ 分布式部署的关键技术 4. 部署策略和实践 5. 分布式部署…

前端开发学习Docker记录01镜像操作

Docker相关命令 Demo安装nginx 先搜索然后拉取,然后查看images列表是不是拉取成功 docker search nginxdocker pull nginx特定某个版本,镜像名:版本号 docker images

layui2.9 树组件默认无法修改节点图标,修改过程记录下

官方文档树组件 data 参数值&#xff0c;未提供icon属性配置 需要修改源码 layui.js, 搜索图片中标记部分 查找到之后&#xff0c;修改为 <i class“‘(i.icon || “layui-icon layui-icon-file”)’”> 如图&#xff1a; 修改完成后&#xff0c;即可在data中添加icon…

redis学习笔记 ——redis中的四大特殊数据结构

一.前言 在之前的学习中&#xff0c;我们已经介绍了Redis中常见的五种基本的数据结构&#xff0c;而今天我们就要开始介绍Redis的四种特殊的数据结构&#xff0c;它们分别是bitmap(位图)&#xff0c; HyperLogLog(基数统计),Geospatial(地理信息),Stream。 二.位图(Bitmap) …

Windows安装PostgreSQL数据库,保姆级教程

PostgreSQL 是客户端/服务器关系数据库管理系统 (RDMS)。PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff08;RDBMS&#xff09;。PostgreSQL 也有自己的查询语言&#xff0c;称为 pgsql。 此外&#xff0c;PostgreSQL 还支持过程语言&a…

CS224W—07 Machine Learning with Heterogeneous Graphs

CS224W—07 Machine Learning with Heterogeneous Graphs 本节中&#xff0c;我们将学习如何在异构图中进行图神经网络学习。 Heterogeneous Graphs 图中的节点类型/边类型不同&#xff0c;就会形成一个异构图&#xff08;Heterogeneous Graph&#xff09;&#xff0c;例如下…

基于SpringBoot的在线答疑管理系统

基于SpringBootVue的在线答疑管理系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 基于SpringBoot的在线答疑管理系…

如何使用IDEA搭建Mybatis框架环境(详细教程)

文章目录 ☕前言为什么学习框架技术Mybatis框架简介 &#x1f379;一、如何配置Mybatis框架环境1.1下载需要MyBatis的jar文件1.2部署jar文件1.3创建MyBatis核心配置文件configuration.xml1.4.创建持久类(POJO)和SQL映射文件1.5.创建测试类 &#x1f9cb;二、 MyBatis框架的优缺…

Linux下UDP编程

一.概念介绍 1.socket 是什么&#xff1f; socket&#xff08;套接字&#xff09;本质上是一个抽象的概念&#xff0c;它是一组用于网络通信的 API&#xff0c;提供了一种统一的接口&#xff0c;使得应用程序可以通过网络进行通信。在不同的操作系统中&#xff0c;socket 的实…

【Python系列】Jinja2 模板引擎

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【软件测试】软件测试生命周期与Bug

目录 &#x1f4d5; 前言 &#x1f334;软件测试的生命周期 ​编辑&#x1f332;BUG &#x1f6a9; 概念 &#x1f6a9;描述bug的要素 &#x1f6a9;bug的级别 &#x1f6a9;bug的生命周期 &#x1f3c0;先检查自身&#xff0c;是否bug描述不清楚 &#x1f3c0;站在用…

Docker 安装 SqlServer

摘要&#xff1a;我们工作当中经常需要拉取多个数据库实例出来做集群&#xff0c;做测试也好&#xff0c;通过 Docker 拉取 SqlServer 镜像&#xff0c;再通过镜像运行多个容器&#xff0c;几分钟就可以创建多个实例&#xff0c;效率是相当的高。 1. docker 拉取镜像 注意&am…

[mysql]mysql的演示使用

mysql的演示使用 几个常见操作 1&#xff1a;show databases 这里第一个information_schema代表的是数据库的基本系统信息&#xff0c;数据库名称&#xff0c;表的名称&#xff0c;存储权限 第二个是mysql&#xff0c;保存的是我们数据库运行的时候需要的系统信息&#xff0…

数据中台即将消亡,数智基建取而代之?

数据中台即将消亡&#xff0c;数智基建取而代之&#xff1f; 前言数智基建 前言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;企业的发展如同在浩瀚海洋中航行的巨轮&#xff0c;而数据则是推动这艘巨轮前行的强大动力。然而&#xff0c;如何有效地管理和利用数据&#xff0c;…

Kafka3.x 使用 KRaft 模式部署 不依赖 ZooKeeper

前言 Kafka 从 2.8.0 版本开始引入了 Kafka Raft Metadata Mode&#xff08;KRaft 模式&#xff09;&#xff0c;这个模式允许 Kafka 在不依赖 ZooKeeper 的情况下进行元数据管理。KRaft 模式在 Kafka 3.0.0 中进入了稳定版本,本文部署的 Kafka_2.12-3.6.0 单机模式 环境 Ce…

工厂andon暗灯系统数字化应用案例

在当今数字化浪潮席卷制造业的时代&#xff0c;工厂的高效运作和精益管理离不开先进的技术手段。Andon 暗灯系统作为精益制造执行中的核心工具和 MES 制造执行系统的重要组成部分&#xff0c;正以其强大的功能为工厂带来全新的变革。 某汽车零部件制造工厂&#xff0c;拥有多条…