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

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 的中断。下面重点介绍这几个寄存器:

  1. 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 来说)。

  2. ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。具体为什么这么设计,请看《CM3 权威指南》第 125 页,NVIC 概览一章。

  3. ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。

  4. ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。

  5. IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

  6. **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语句的执行速度更快&#xff0c…...

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻…...

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循环来逐个遍历链表&#xff0…...

Linux 基本语句_10_进程

进程和程序的区别: 程序是一段静态的代码,是保存在非易失储存器上的制令和数据的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序的一次执行过程,包括了动态创建、调度、执行和消亡的整个过程…...

矩阵起源加入 OpenCloudOS 操作系统开源社区,完成技术兼容互认证

近日,超融合异构云原生数据库 MatrixOne企业版软件 V1.0 完成了与 OpenCloudOS 的相互兼容认证,测试期间,整体运行稳定,在功能、性能及兼容性方面表现良好。 一、产品简介 矩阵起源 MatrixOrigin 致力于建设开放的技术开源社区和…...

3D物理模拟和视觉特效软件SideFX Houdini mac中文介绍

SideFX Houdini for mac是一款3D物理模拟和视觉特效软件,几乎所有好莱坞特效电影里的物理模拟,包括碎裂,烟尘,碰撞,火焰,流体等模拟,都看得到它的身影。其独特的节点式操作方式,尤其…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Cursor实现用excel数据填充word模版的方法

cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...