STM32——NVIC中断优先级管理分析
文章目录
- 前言
- 一、中断如何响应?NVIC如何分配优先级?
- 二、NVIC中断优先级管理详解
- 三、问题汇总
前言
个人认为本篇文章是我作总结的最好的一篇,用自己的话总结出来清晰易懂,给小白看也能一眼明了,这就是写博客的意义吧。本篇文章具体介绍了 NVIC中断优先级管理,是如何进行管理,如何根据优先级响应中断的。本篇文章仅作为个人学习笔记总结,不做权威标准。
一、中断如何响应?NVIC如何分配优先级?
那么是如何响应的呢?中断占用8bit,但是只用高四位。优先级分组为4位,有以下的分组方式:0-4,1-3,2-2,3-1,4-0,这几组中分别是响应优先级和抢占优先级的分组,例如1-3,就是响应优先级为1,抢占优先级为3。
1.抢占优先级的级别>响应优先级级别
2.数值越小优先级越高
3.抢占优先级与响应优先级都一样,那么看哪个中断先发生。
4.高优先级的抢占优先级的中断可以打断低抢占优先级的中断,但是高优先级的响应优先级的中断不能够打断低响应优先级的中断。
例子:假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。
上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!
二、NVIC中断优先级管理详解
详细NVIC中断优先级管理,以下是正点原子的详细介绍:(上面懂了下面不用看)
CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。
在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体:
typedef struct
{ __IOM uint32_t ISER[8U]; uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; uint32_t RESERVED4[56U];__IOM uint8_t IP[240U]; uint32_t RESERVED5[644U];
__OM uint32_t STIR;
} NVIC_Type;
STM32 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能方便 的使用 STM32 的中断。下面重点介绍这几个寄存器:
-
ISER[8]:ISER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。上面说了 CM3 内核支持 256 个中断,这里用 8 个32 位寄存器来控制,每个位控制一个中断。但是STM32F103 的可屏蔽中断只有 60 个,所以对我们来说,有用的就是两个(ISER[0]和 ISER[1]),总共可以表示 64 个中断。而 STM32F103 只用了其中的前 60 位。ISER[0]的 bit0~bit31 分别对应中断 0~31。ISER[1]的 bit0~27 对 应中断 32~59;这样总共 60 个中断就分别对应上了。你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。具体每一位对应哪个中断,请参考 stm32f10x.h 里面的第 140 行处(针对编译器 MDK5 来说)。
-
ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。具体为什么这么设计,请看《CM3 权威指南》第 125 页,NVIC 概览一章。
-
ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
-
ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
-
IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
-
**IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。**这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而 STM32 只用到了其中的前 60 个。IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。这里简单介绍一下 STM32 的中断分组:STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。

通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
中断优先级在程序中的配置:
以下是中断优先级设置的步骤:
①系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和响应优先级的 分配位数。设置函数为HAL_NVIC_PriorityGroupConfig。对于 HAL 库,在文件stm32f1xx_hal.c 内部定义函数 HAL_Init 中有调用 HAL_NVIC_PriorityGroupConfig 函数进行相关设置,所以我 们只需要修改 HAL_Init 内部对中断优先级分组设置即可。
② 设置单个中断的中断优先级别和使能相应中断通道,使用到的函数函数主要为函数HAL_NVIC_SetPriority 和函数HAL_NVIC_EnableIRQ。
三、问题汇总
1. ok,此时有人问了,如果中断的响应优先级和抢占优先级都一样呢?谁先发生?
根据ARM Cotex-M处理器的规范,中断请求的处理顺序将由唯一的硬件优先级标识符决定,即中断向量表中的位置。
2. 什么是中断向量表?
中断向量表中是一个存储中断服务程序地址的表格,每个中断都有唯一的中断号,每一个中断号对应中断向量表中的条目,中断号越低,此中断在表中的位置越靠前,就越先发生。
3. 我应该如何查看中断向量表?
芯片的数据手册或者参考手册,查找中断向量表的章节,查找中断向量表的起始位置,在KEIL5中搜索中断向量表的地址来查看。
4. 那么除了中断的响应优先级、抢占优先级、中断号,还有那些影响中断响应的因素呢?
中断处理函数的执行时间:如果执行时间很长,其他中断的请求有可能就被挂起,只有当前的中断处理函数执行完成,其他中断继续执行
中断屏蔽:前面简单介绍了几种中断,我们知道中断屏蔽某位置1,该中断就不能发生,即使优先级高也无法执行。
5. 那么问题又来了:某中断正在发生,是如何影响中断执行顺序的呢?
举例中断1和中断2,他们的响应和抢占相同,中断1触发但是执行时间很长,可能是数据处理运算,此时!2被触发,但是他俩响应和抢占相同,2就要等1处理完,此时2就被挂起,1结束后,NVIC就会查看在1执行的过程中是否有中断挂起,如果有就执行,这里就是2了。
6. 问题又又来了,1在执行2如何触发的:
通常情况下触发的原因是指:有中断源产生中断请求信号,那么中断被触发,此时不用考虑1是否在执行。
7. 问题又又又来了:中断触发的原因只有中断产生了中断请求这一种情况吗?
上个问题我们说到通常情况下是这样,那不通常呢?具体要取决于处理器的架构和中断控制器的功能。有以下触发原因:
1.软件触发中断:有些处理器允许软件生成中断请求信号,触发中断。
2.异常或错误中断:处理器发生异常、错误、故障的情况下,可能触发响应的中断。
3.调试中断:程序在debug调试的时候暂停,跳转,会响应中断。
8. 那么调试中断响应的是哪些中断?
1.调试监听中断
2.断点
3.数据观察暂停
如果小伙伴对NVIC中断优先级管理还有其他疑问欢迎留言讨论,如有错误还请指出!
相关文章:
STM32——NVIC中断优先级管理分析
文章目录 前言一、中断如何响应?NVIC如何分配优先级?二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇,用自己的话总结出来清晰易懂,给小白看也能一眼明了,这就是写博客的意义吧…...
YOLOV5----修改损失函数-SimAM
主要修改yolo.py、yolov5s.yaml及添加SimAM.py 一、SimAM.py import torch import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, e_lambda=1e-4):super...
MongoDB单实例安装(windows)
https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.2.zip 安装过程很简单,将下载的文件解压到安装目录。 提前创建好数据文件目录: D:\data\4000 创建配置文件mongodb.conf,配置文件需要注意的是,mongodb在6.1之后就…...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
错误描述如下所示: 我们将错误拉到最下面如下所示为导致异常的原因: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.example.reviewmybatisplus.Service.UserService available: expec…...
安卓RadioButton设置图片大小
RadioButton都不陌生,一般我们都会设置图片在里面,这就涉及一个问题,图片的大小。如果图片过大,效果很不理想。搜了很多方法,都不理想。无奈只能自己研究了 代码如下: 1,一个简单的 RadioButt…...
电脑怎么录制视频,录制的视频怎么剪辑?
在现今数字化的时代,视频成为了人们日常生活中不可或缺的一部分。因此,对于一些需要制作视频教程、录制游戏或者是进行视频演示的人来说,电脑录屏已经成为了一个必不可少的工具。那么,对于这些人来说,如何选择一个好用…...
外接式网络隔离变压器/网络隔离滤波器/网口变压器/脉冲变压器/网络隔离变压器模块
Hqst华强盛(石门盈盛)电子导读:外接式网络隔离变压器/网络隔离滤波器/网口变压器/脉冲变压器/网络隔离变压器模块,后统称网络隔离变压器,它是一种安装在电路外部的隔离变压器,主要用于隔离网络中的干扰信号…...
AI:83-基于深度学习的手势识别与实时控制
🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…...
MySQL---存储过程
存储过程的相关概念 是一组为了完成特定功能的sql语句的集合,类似于函数 写好了一个存储过程之后,我们可以像函数一样随时调用sql的集合。 复杂的,需要很多sql语句联合执行完成的任务 存储过程再执行上比sql语句的执行速度更快,…...
宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?
当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻…...
d3.js
D3:Data-Driven Documents • 通过D3提供的接口来基于数据操控文档的各个图元。 标题对于D3(本讲解)最为重要的标签,主要操作的对象(画布) HTML - 导入D3.js D3.js作为JavaScript的外库,必须先将其导入,如: Python的…...
okhttp关于header修改
在项目开发中,需要和后台定义一些规则,比如一些请求头信息,Content-Type,User-Agent。不能使用默认的,那么就得我们自己配置全局的。 基于okhttp4.0以上版本修改步骤: 创建我们自己的MediaType, create已经被废弃 val…...
pytorch代码实现注意力机制之Flatten Attention
Flatten Attention 介绍:最新注意力Flatten Attention:聚焦的线性注意力机制构建视觉 Transformer 在将 Transformer 模型应用于视觉任务时,自注意力机制 (Self-Attention) 的计算复杂度随序列长度的大小呈二次方关系,给视觉任务…...
激光雷达和人工智能
几十年来,激光雷达一直是许多行业中非常有用的工具,但直到最近,随着人工智能(AI)解决方案的引入,我们才开始认识到它的真正潜力。激光雷达,又称光探测和测距,是一种遥感技术。它利用…...
【算法练习Day44】最长递增子序列最长连续递增序列最长重复子数组
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 最长递增子序列最长连续递增…...
STM32H743XX/STM32H563XX芯片烧录一次后,再次上电无法烧录
近期在使用STM32H563ZIT6这款芯片在开发板上使用正常,烧录到自己打的板子就遇到了芯片烧录一次后,再次上电无法烧录的问题。 遇到问题需要从以下5点进行分析。 首先看下开发板的原理图 1.BOOT0需要拉高。 2.NRST脚在开发板上是悬空的。这里我建议大家…...
21. 合并两个有序链表 --力扣 --JAVA
题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 判断特殊情况,如:两个列表中其中一个为空;创建一个初始节点用于返回;通过while循环来逐个遍历链表࿰…...
Linux 基本语句_10_进程
进程和程序的区别: 程序是一段静态的代码,是保存在非易失储存器上的制令和数据的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序的一次执行过程,包括了动态创建、调度、执行和消亡的整个过程…...
矩阵起源加入 OpenCloudOS 操作系统开源社区,完成技术兼容互认证
近日,超融合异构云原生数据库 MatrixOne企业版软件 V1.0 完成了与 OpenCloudOS 的相互兼容认证,测试期间,整体运行稳定,在功能、性能及兼容性方面表现良好。 一、产品简介 矩阵起源 MatrixOrigin 致力于建设开放的技术开源社区和…...
3D物理模拟和视觉特效软件SideFX Houdini mac中文介绍
SideFX Houdini for mac是一款3D物理模拟和视觉特效软件,几乎所有好莱坞特效电影里的物理模拟,包括碎裂,烟尘,碰撞,火焰,流体等模拟,都看得到它的身影。其独特的节点式操作方式,尤其…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
