当前位置: 首页 > news >正文

深入理解STM32中断处理机制

深入理解STM32中断及其使用方法(基于HAL库)

STM32微控制器作为一款强大的嵌入式系统芯片,在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如何在STM32CubeMX中配置和使用中断功能。

什么是中断?

中断是一种处理器的机制,用于在处理器执行任务的过程中暂停当前的操作,转而处理发生的某个事件或者请求,处理完毕后再返回原来的任务。在嵌入式系统中,中断是一种非常重要的事件处理机制,能够及时响应外部设备的请求,提高系统的实时性和响应性。

STM32中断体系结构

STM32微控制器提供了丰富的中断资源,包括但不限于外部中断、定时器中断、串口中断等。这些中断资源通过中断向量表和中断优先级来进行管理和调度。

中断向量表

中断向量表是一个存储中断服务函数地址的表格,当中断事件发生时,处理器会根据中断向量表中的地址跳转到相应的中断服务函数来处理中断事件。

中断优先级

中断优先级用于确定当多个中断同时发生时,哪个中断会被优先处理。STM32中断优先级的设置是通过NVIC(Nested Vectored Interrupt Controller)来完成的,可以通过设置优先级组(Priority Group)以及具体中断的优先级来管理中断的优先级。

HAL库中的中断处理

在STM32中,使用HAL库配置外部中断的流程相对简单明了

1. 初始化HAL库

main() 函数中,首先需要调用 HAL_Init() 函数来初始化HAL库。这将初始化HAL库的各种系统资源和配置。

int main(void) {HAL_Init();// 其他初始化代码
}

2. 初始化外部中断引脚

在进行外部中断配置之前,需要初始化相应的GPIO引脚作为外部中断引脚,并配置其工作模式和上拉/下拉等参数。

GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟GPIO_InitStruct.Pin = GPIO_PIN_0; // 外部中断引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉/下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA

3. 配置外部中断线

使用 HAL_SYSCFG_ExtiLineConfig() 函数配置外部中断线,将GPIO引脚与对应的外部中断线相连。

HAL_SYSCFG_ExtiLineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 配置外部中断线

4. 配置外部中断触发方式

使用 EXTI_InitTypeDef 结构体配置外部中断的触发方式,包括触发边沿和触发模式。

EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.Line = EXTI_LINE_0; // 外部中断线0
EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT; // 中断模式
EXTI_InitStruct.Trigger = EXTI_TRIGGER_RISING; // 上升沿触发
EXTI_InitStruct.LineCmd = ENABLE; // 使能外部中断线0
HAL_EXTI_Init(&EXTI_InitStruct); // 初始化外部中断

5. 设置中断优先级并使能中断

使用 HAL_NVIC_SetPriority() 函数设置外部中断的优先级,并通过 HAL_NVIC_EnableIRQ() 函数使能外部中断。

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能外部中断

6. 编写中断处理函数

最后,编写外部中断的中断服务函数,并在其中处理外部中断事件。

void EXTI0_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 处理外部中断
}

7. 主循环

main() 函数中添加一个无限循环,使程序持续运行,等待外部中断事件的发生。

while (1) {// 主循环代码
}

示例

下面是一个使用HAL库配置外部中断的示例代码:

#include "stm32f4xx_hal.h"void EXTI0_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 处理外部中断
}int main(void)
{HAL_Init(); // 初始化HAL库// 定义外部中断GPIO结构体GPIO_InitTypeDef GPIO_InitStruct;EXTI_InitTypeDef EXTI_InitStruct;HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置中断优先级HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断// 使能GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 配置GPIO引脚为输入模式GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置外部中断线HAL_SYSCFG_ExtiLineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);EXTI_InitStruct.Line = EXTI_LINE_0;EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT;EXTI_InitStruct.Trigger = EXTI_TRIGGER_RISING;EXTI_InitStruct.LineCmd = ENABLE;HAL_EXTI_Init(&EXTI_InitStruct);while (1){// 主循环}
}

代码解析:

  • EXTI0_IRQHandler() 是外部中断的中断服务函数,当外部中断触发时会自动调用该函数进行处理。
  • main() 函数中,我们首先初始化了HAL库,并配置了外部中断的GPIO引脚、中断优先级和触发方式。
  • 使用 HAL_NVIC_SetPriority() 函数设置了外部中断的优先级,并通过 HAL_NVIC_EnableIRQ() 函数使能了外部中断。
  • 使用 HAL_GPIO_Init() 函数初始化了GPIO引脚,并通过 HAL_SYSCFG_ExtiLineConfig() 函数配置了外部中断线。
  • 最后,在主循环中等待外部中断的触发事件。

在STM32CubeMX中配置中断

STM32CubeMX是STMicroelectronics提供的一款用于配置STM32微控制器的图形化工具,可以方便地生成初始化代码和配置文件。在STM32CubeMX中,用户可以直观地配置中断资源,包括中断优先级、中断触发方式等。

配置步骤

  1. 打开STM32CubeMX,并创建一个新工程。
    在这里插入图片描述

  2. 在Pinout & Configuration选项卡中配置外部中断引脚,选择对应的GPIO引脚和中断触发方式。
    在这里插入图片描述
    在这里插入图片描述

  3. 在Configuration选项卡中配置中断优先级组和具体中断的优先级。
    在这里插入图片描述

  4. 生成代码,并在中断处理函数中实现相应的功能。
    在这里插入图片描述

总结

中断作为嵌入式系统中一种重要的事件处理机制,在实际应用中扮演着至关重要的角色。通过合理地配置和使用中断资源,可以提高系统的实时性和响应性,使系统更加稳定和可靠。

相关文章:

深入理解STM32中断处理机制

深入理解STM32中断及其使用方法(基于HAL库) STM32微控制器作为一款强大的嵌入式系统芯片,在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如何在STM32CubeMX中配置和使用…...

基于机器学习的地震预测(Earthquake Prediction with Machine Learning)

基于机器学习的地震预测(Earthquake Prediction with Machine Learning) 一、地震是什么二、数据组三、使用的工具和库四、预测要求五、机器学习进行地震检测的步骤六、总结 一、地震是什么 地震几乎是每个人都听说过或经历过的事情。地震基本上是一种自…...

《30天自制操作系统》 第一周(D1-D7) 笔记

前言:这是我2023年5月份做的一个小项目,最终是完成了整个OS。笔记的话,只记录了第一周。想完善,却扔在草稿箱里许久。最终决定,还是发出来存个档吧。 一、汇编语言 基础指令 MOV: move赋值,数据传送指令…...

SQL注入:报错注入

SQL注入系列文章:初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入? 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand(随机数) floor(向上取整&…...

K8s 安装部署-Master和Minion(Node)文档

K8s 安装部署-Master和Minion(Node)文档 操作系统版本:CentOS 7.4 Master :172.20.26.167 Minion-1:172.20.26.198 Minion-2:172.20.26.210(后增加节点) ETCD:172.20.27.218 先安装部署ETC…...

OpenAI 降低价格并修复拒绝工作的“懒惰”GPT-4,另外ChatGPT 新增了两个小功能

OpenAI降低了GPT-3.5 Turbo模型的API访问价格,输入和输出价格分别降低了50%和25%。这对于使用API进行文本密集型应用程序的用户来说是一个好消息。 OpenAI官网:OpenAI AIGC专区:aigc 教程专区:AI绘画,AI视频&#x…...

springboot+value静态属性获取配置文件中的值的操作方法

1.配置类需要让spring管理 2.set方法不要加static 3.如果静态属性是private修饰,则在使用的时候,需要 类名.getXXX方法 如果静态属性是public修饰,则在使用的时候,需要 类名.属性名 import org.springframework.beans.factory.an…...

Prometheus 架构全面解析

在本指南中,我们将详细介绍 Prometheus 架构。 Prometheus 是一个用 Golang 编写的开源监控和告警系统,能够收集和处理来自各种目标的指标。您还可以查询、查看、分析指标,并根据阈值收到警报。 此外,在当今世界,可观…...

把批量M3U8网络视频地址转为MP4视频

在数字媒体时代,视频格式的转换已成为一项常见的需求。尤其对于那些经常处理网络视频的用户来说,将M3U8格式的视频转换为更常见的MP4格式是一项必备技能。幸运的是,现在有了固乔剪辑助手这款强大的工具,这一过程变得异常简单。下面…...

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …...

Keycloak - docker 运行 前端集成

Keycloak - docker 运行 & 前端集成 这里的记录主要是跟我们的项目相关的一些本地运行/测试,云端用的 keycloak 版本不一样,不过本地我能找到的最简单的配置是这样的 docker 配置 & 运行 keycloak keycloak 有官方(Red Hat Inc.)的镜像&#…...

架构篇27:如何设计计算高可用架构?

文章目录 主备主从集群小结计算高可用的主要设计目标是:当出现部分硬件损坏时,计算任务能够继续正常运行。因此计算高可用的本质是通过冗余来规避部分故障的风险,单台服务器是无论如何都达不到这个目标的。所以计算高可用的设计思想很简单:通过增加更多服务器来达到计算高可…...

Python 有用的库模块

简介 Python中有许多常用的库或者模块,在写代码的时候或多或少会遇到,本文对其进行总结,方便日后查阅。 pprint Python中的pprint模块是用于打印数据结构(如字典,列表等)的模块,提供了一种以…...

vivado DDS学习

实现DDS通常有两种方式,一种是读取ROM存放的正弦/余弦信号的查表法,另一种是用DDS IP核。这篇学习笔记中,我们要讲解说明的是VIVADO DDS IP核的应用。 目前本篇默认Phase Generator and SIN/COS LUT(DDS)的standard模式…...

微信小程序(十六)slot插槽

注释很详细&#xff0c;直接上代码 上一篇 温馨提醒&#xff1a;此篇需要自定义组件的基础&#xff0c;如果不清楚请先看上一篇 新增内容&#xff1a; 1.单个插槽 2.多个插槽 单个插糟 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class">…...

gtest 单元测试

文章目录 前言一、Google Test介绍1.1 gtest源码下载编译1.2 常用API介绍1.3 gtest运行参数介绍 二、Google Mock参考资料 前言 Google Test&#xff08;简称gtest&#xff09;是一个开源的C单元测试框架。和常见的测试工具一样&#xff0c;gtest提供了单体测试常见的工具和组…...

掌握assert的使用:断言在错误检查和调试中不可或缺

断言在错误检查和调试中不可或缺 一、简介二、断言的基本语法和用法三、错误检查与断言四、 调试与断言五、避免滥用断言六、总结 一、简介 断言是一种在程序中用于检查特定条件是否满足的工具。一般用于验证开发者的假设&#xff0c;如果条件不成立&#xff0c;就会导致程序报…...

概念杂记--到底啥是啥?(数据库篇)

文章目录 1.聚集索引&#xff08;clustered index&#xff09;2.非聚集索引&#xff08;Non-clustered index&#xff09;3.聚集索引和非聚集索引区别&#xff1f;4.覆盖索引&#xff08;covering index&#xff09;5、复合索引 &#xff08;Composite Index&#xff09;6.索引…...

Ubuntu20.4 Mono C# gtk 编程习练笔记(四)

连续实时绘图 图看上去不是很清晰&#xff0c;KAZAM录屏AVI尺寸80MB&#xff0c; 转换成gif后10MB, 按CSDN对GIF要求&#xff0c;把它剪裁缩小压缩成了上面的GIF&#xff0c;图像质量大不如原屏AVI&#xff0c;但应该能说明原意&#xff1a;随机数据随时间绘制在 gtk 的 drawin…...

1 月 26日算法练习

文章目录 九宫幻方穿越雷区走迷宫 九宫幻方 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三阶幻方指的是将1~9不重复的填入一个33的矩阵当中&#xff0c;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...