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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...