当前位置: 首页 > 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;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…...

告别激活弹窗:KMS_VL_ALL_AIO智能激活工具完全指南

告别激活弹窗&#xff1a;KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;每次开机都看到"需要激活"的提…...

GD32F103C8T6烧录方式全解析:串口ISP、ST-Link Utility、Keil在线,哪种最适合你?

GD32F103C8T6烧录方案深度评测&#xff1a;从原型开发到量产部署的全场景指南 在嵌入式开发领域&#xff0c;选择正确的程序烧录方式往往决定着开发效率和生产成本。作为STM32F103的国产替代方案&#xff0c;GD32F103C8T6凭借其出色的性价比赢得了广泛关注。但许多开发者在迁移…...

【优化交叉口的绿灯时间】基于遗传算法的交通灯管理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

JetBrains IDE 30天试用重置:一键解决方案的完整实践指南

JetBrains IDE 30天试用重置&#xff1a;一键解决方案的完整实践指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 当您正专注于代码调试时&#xff0c;IDE突然弹出"评估期已结束"的红色警告&#xf…...

PCL2启动器离线登录按钮消失?5分钟快速修复指南

PCL2启动器离线登录按钮消失&#xff1f;5分钟快速修复指南 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher&#xff08;PCL&#xff09;。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL 你是否遇到过PCL2启动器离线登录按钮突然消失的困扰&#xff1…...

终极ThinkPad风扇控制指南:告别噪音,拥抱静音高效

终极ThinkPad风扇控制指南&#xff1a;告别噪音&#xff0c;拥抱静音高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾经因为ThinkPad风扇的"直升机起…...

KIVI开源工具箱:模块化设计赋能开发者效率提升

1. 项目概述&#xff1a;一个面向开发者的开源工具箱最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫KIVI。第一眼看到这个名字&#xff0c;我以为是某种新的UI框架或者设计系统&#xff0c;毕竟“KIVI”听起来有点像是“Kiwi”的变体&#xff0c;容易联…...

树莓派+Kali Linux+PiTFT打造便携式安全测试平台全攻略

1. 项目概述如果你和我一样&#xff0c;对网络安全和嵌入式硬件都抱有浓厚的兴趣&#xff0c;那么将Kali Linux与树莓派结合&#xff0c;再配上一块小巧的触摸屏&#xff0c;绝对是一个能让你兴奋起来的项目。这不仅仅是把两个热门技术拼在一起&#xff0c;更是打造一个真正便携…...

基于Python/Flask的洗车店业务管理系统设计与实现

1. 项目概述&#xff1a;从“洗车”到“洗车服务”的数字化重构最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“washing-cars”。光看名字&#xff0c;你可能会觉得这只是一个关于洗车的小工具或者记录表。但当我深入进去&#xff0c;才发现它远不止于此。这个项目本质上…...

Arm Neoverse-V2/V3缓存与内存参数优化指南

1. Arm Neoverse-V2/V3集群架构概述Arm Neoverse系列处理器作为数据中心和基础设施领域的重要计算引擎&#xff0c;其V2/V3代架构在缓存子系统和内存管理方面进行了显著优化。作为从业多年的系统架构师&#xff0c;我认为理解这些处理器的参数配置对性能调优至关重要。Neoverse…...