STM32基础--NVIC中断控制器
一、NVIC是什么?
NVIC是一种中断控制器。当一个中断正在处理时,另一个更高优先级的中断可以打断当前中断的执行,并立即得到处理。这种机制使得处理器在高速运行的同时,能够及时响应不同优先级的中断请求。
二、有哪些优先级?(只有抢占优先级才会发生中断嵌套!!)
抢占优先级: 抢占优先级是指中断的打断优先级,抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级: 响应优先级是指中断的响应顺序,响应优先级只有在抢占优先级相同的情况下才有意义。当抢占优先级相同时,俩个中断同时发生,响应优先级高的中断先响应。
自然优先级: 按照自带的优先级编号(硬件固定)在抢占和响应优先级相同的情况下决定先执行哪个中断,数字越小级别越高。这个是由厂家设计好的。
每个中断源的抢占优先级和响应优先级由用户决定(软件设置),而自然优先级已经被硬件固定, 不可更改。优先级越高其对应的值越低。数字越小,优先级越高。
三、什么是中断嵌套?
答:通俗来讲就是停止当前正在进行的任务去执行抢占优先级更高的中断任务。
例如:A的抢占优先级为0,B的抢占优先级为1。则当两个中断请求同时发生时,先执行抢占优先级高的A。但是当CPU正处理B时发生了A的中断请求,则停止执行B,先去执行A的中断,当执行完A中断后再去执行剩下的B程序。这就是中断嵌套。
四、优先级的优先等级(序号越低,优先级越高)
(1)优先级大小:抢占优先级>响应优先级>自然优先级。
(2)抢占优先级相同,响应优先级不同,则先处理响应优先级高的。但是响应优先级没有中断嵌套。
例:如果A的抢占优先级为0,B的抢占优先级也为0。A的响应优先级为0,B的响应优先级为1。则两个同时发生中断请求时,在抢占优先级相同时先处理响应优先级高的A。但是如果CPU正在处理B时发生了A的中断请求,则继续执行B,当B完成后再执行A。因为响应优先级不会发生中断嵌套。
(3)如果抢占优先级和响应优先级都相同,则比较它们的硬件中断编号(自然优先级),中断编号越小,优先级越高。(硬件中断编号从中断向量表中查看)
五、优先级分组
Core-M4内核最多支持256级的可编程优先级。用8位来表示优先级级别,,优先级级别分为8组,分别是组0~组7。但是ST公司设计STM32F407ZGT6时,为了精简设计,只用了16 个可编程优先级(使用了 高四位4 位来设置中断优先级,设置低四位的值是无效的)。所以不同的芯片优先级分组会有不同。
以STM32F407ZGT6为例:
分组配置寄存器SCB->AIRCR。
由 3bit ( AIRCR[10:8] ) 控制抢占优先级与响应优先级分别占几位。
由 4bit ( IP bit[7:4] ) 控制不同的优先级决定中断发生的先后。

IP bit[7:0]:

STM32的中断优先级使用4~7共4个位控制。抢占优先级占2位有4种选择,响应优先级占2位有4种选择,故中断共可配置16种优先级。
例如:要配置2位抢占优先级,2位响应优先级,就需先配置 寄存器AIRCR[10:8]的数值为101。
注意:一般情况下,系统代码执行过程中,只设置一次中断优先级分组,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。如果设置了多次,则以最后一次为准。
六、优先级设置示例
例如在同一工程项目中有TIM3_IRQn、USART1_IRQn。优先级配置如下(可根据自己目的修改)。
(1)方式一:用结构体配置
●TIM3_IRQn优先级设置:
NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //选择通道(要中断的对象)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能NVIC_Init(&NVIC_InitStructure); //根据以上参数初始化NVIC寄存器
●USART1_IRQn优先级设置:
NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器**
●该方式相应的优先级分组函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组,一般在初始化中进行
如当我们选择优先级分组为2时,则有2个位决定抢占优先级,2个位决定响应优先级。抢占优先级两个位有4种选择值:00、01、10、11。分别是0~3(不能超过,除非先修改优先级组)。响应优先级同理。
●优先级分组在主函数中初始化:
这个函数: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
参数可选:(序号对应下图的组)
NVIC_PriorityGroup_0
NVIC_PriorityGroup_1
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4
●主函数:
int main(void) {// 配置中断优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 其他初始化工作// 主循环或其他操作while (1) {// 主程序逻辑}
}
当配置好优先级后,当中断响应时就可以根据优先级响应规则进行处理。规则如上文标题四中所示。
(2)方式二:直接用函数配置
●合成优先级值函数:
NVIC_EncodePriority(5,1,2);
NVIC_EncodePriority() 由三个参数组成: 5 表示优先级组号(下图中红框圈住的号,而不是红框前面的组的数字),1 表示抢占优先级,2 表示响应优先级。


●如配置SysTick_IRQn中断优先级代码如下:
NVIC_SetPriority(SysTick_IRQn,NVIC_EncodePriority(5,1,2)); // 设置SysTick_IRQn中断优先级NVIC_EnableIRQ(SysTick_IRQn); //使能SysTick_IRQn的NVIC响应。
NVIC_SetPriority ()函数的第一个参数是中断号,这里是 SysTick_IRQn,表示 SysTick 定时器的中断。第二个参数是优先级值,通过 NVIC_EncodePriority() 函数生成。该函数用于设置优先级。
NVIC_EnableIRQ(SysTick_IRQn) :这行代码用于使能 SysTick 中断。通过这个函数,你告诉 NVIC 可以响应 SysTick 中断。
●该方式相应的设置优先组函数:
NVIC_SetPriorityGrouping(5);
该函数参数和NVIC_EncodePriority函数第一个参数一致,具体参数设置如上述NVIC_EncodePriority函数第一个参数所示。
●主函数:
int main(void) {// 配置中断优先级分组NVIC_SetPriorityGrouping(5);// 其他初始化工作// 主循环或其他操作while (1) {// 主程序逻辑}
}
相关文章:
STM32基础--NVIC中断控制器
一、NVIC是什么? NVIC是一种中断控制器。当一个中断正在处理时,另一个更高优先级的中断可以打断当前中断的执行,并立即得到处理。这种机制使得处理器在高速运行的同时,能够及时响应不同优先级的中断请求。 二、有哪些优先级&…...
使用matlab实现图像信号的色彩空间转换
利用matlab对图像信号进行读取,并对RGB空间进行转换,如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后,进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像;但是爆出了 Untitled5(line 5)hsi rgb2h…...
Vatee万腾科技决策力的引领创新:Vatee数字化视野的崭新天地
在数字时代的激烈竞争中,Vatee万腾以其科技决策力的引领,开创了数字化视野的崭新天地。这并不仅仅是一场技术的飞跃,更是一次对未来的深刻洞察和引领创新的勇敢实践。 Vatee万腾的科技决策力不仅仅停留在数据分析和算法的运用,更是…...
Go语言安装教程
【Go系列-1】-Go安装教程 环境提前准备 安装的时候可以选择自己的目录进行环境管理 E:\Z_Enviroment\Go创建文件夹: E:\Z_Enviroment\Go E:\Z_Enviroment\GoWorks E:\Z_Enviroment\GoWorks\bin E:\Z_Enviroment\GoWorks\pkg E:\Z_Enviroment\GoWorks\src环境变量…...
MVVM框架:图片加载有问题
一、前言:在我使用ImageView加载图片的时候添加如下代码发现报错 app:imageUrl"{viewModel.observableField.assetImg}"报错如下错误 二、原因:是啥我不太清楚好像是没有imageView的适配器,后来我看了一下确实没有 public class I…...
一篇文章搞明白js运行机制——事件循环
1、解释 JavaScript 的执行机制。 JavaScript 的执行机制基于事件循环。事件循环包括一个任务队列(Task Queue)和一个微任务队列(Microtask Queue)。当一个函数被调用时,它被添加到微任务队列中。事件循环每次迭代都会…...
Leetcode 第 371 场周赛题解
Leetcode 第 371 场周赛题解 Leetcode 第 371 场周赛题解题目1:100120. 找出强数对的最大异或值 I思路代码复杂度分析 题目2:100128. 高访问员工思路代码复杂度分析 题目3:100117. 最大化数组末位元素的最少操作次数思路代码复杂度分析 题目4…...
keras转onnx,TensorFlow转tf.keras.models.load_model,onnx精度转换
参考: https://blog.csdn.net/Deaohst/article/details/126864267 转onnx 别直接转onnx。 先转PB: import tensorflow as tfmodel_path ./models/model.h5 # 模型文件 model tf.keras.models.load_model(model_path) model.sa…...
高可用架构设计
1. 引言 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,本篇讨论高可用 高可用技术的重要性在于保证系统的连续可用性,提高系统的稳定性和可靠性。它可以应对高并发和大规…...
qemu 之 uboot、linux 启动
目录 编译uboot、kernel 编译启动从 uboot 中引导启动 linux注参考 本文主要说明 arm64 在 qemu 上的相关启动。 编译 使用的是 qemu-8.1.1 版本,编译命令如下: ../configure --cc/usr/local/bin/gcc --prefix/home/XXX/qemu_out --enable-virtfs --enable-slir…...
C语言--每日五道选择题--Day8
第一题 1、下列程序的输出是( ) #include<stdio.h> int main() {int a[12] {1,2,3,4,5,6,7,8,9,10,11,12};int *p[4];int i;for(i0;i<4;i){p[i]&a[i*3];}printf("%d\n",p[3][2]);return 0; } A: 上述程序有错误 B: 6…...
Outlook如何删除邮箱账户
Outlook如何删除邮箱账户 说明: 最近有用户询问到“我的Outlook登陆了很多个邮箱账号,不知道怎么退出”接下来将具体操作步骤加以说明 操作指引: 1、首先打开Outlook该软件,然后点击“文件” 2、点击账户设置下拉菜单 3、在下拉…...
ultrascale+mpsoc系列的ZYNQ中DDR4参数设置说明
ultrascalempsoc系列的ZYNQ中DDR4参数设置说明 标题1 概述标题2 讲述平台标题3 ZYNQ的DDR设置界面参数标题4 DDR参数界面说明如下 标题1 概述 本文用于讲诉ultrascalempsoc系列中的ZYNQ的DDR4的参数设置与实际硬件中的DDR选型之间的关系,为FPGA设计人员探明道路。 …...
maven-六类属性
Maven的六类属性_maven内置属性-CSDN博客 系统变量指的是java系统的变量,环境变量指的系统变量和用户变量 java系统仅针对java程序,环境变量是全局的。两者都可以传进java进程。 参考 01.java环境变量(env)和系统属性…...
微服务概念
微服务 微服务是什么 In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource A…...
响应式摄影科技传媒网站模板源码带后台
模板信息: 模板编号:540 模板编码:UTF8 模板颜色:黑白 模板分类:摄像、婚庆、家政、保洁 适合行业: 模板介绍: 本模板自带eyoucms内核,无需再下载eyou系统,原创设计、手…...
探索C#事件(Event)的强大应用
摘要 在现代软件开发中,对象之间的通信和交互是一个常见而重要的问题。为了解决这个问题,C#作为一种面向对象的编程语言提供了一种强大的特性:事件(Event)。事件可以帮助开发人员实现对象间的松耦合,提高代…...
学习c#的第四天
目录 C# 变量 C# 中的变量定义与初始化 接受来自用户的值 C# 中的 Lvalues 和 Rvalues 不同类型变量进行运算 静态变量 局部变量 C# 常量 整数常量 浮点常量 字符常量 字符串常量 定义常量 扩展知识 Convert.ToDouble 与 Double.Parse 的区别 静态常量和动态常…...
解析JSON字符串:属性值为null的时候不被序列化
如果希望属性值为null及不序列化,只序列化不为null的值。 1、测试代码 配置代码: mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 或者通过注解JsonInclude(JsonInclude.Include.NON_NULL) //常见问题2:属性为null&a…...
短视频短剧小程序系统:用技术丰富你的碎片时间
在当今快节奏的生活中,人们的休闲时间变得越来越碎片化。短视频短剧小程序系统正是利用这一现象,通过技术手段为人们提供了丰富多样的娱乐内容,让碎片时间变得更加充实。 一、短视频短剧小程序系统的技术特点 高效加载与流畅播放࿱…...
ai辅助开发:让快马智能生成win11安装openclaw的交互式诊断助手
最近在折腾Win11系统上安装OpenClaw这个工具时,发现手动安装过程特别容易踩坑。从依赖版本冲突到权限问题,稍不注意就会卡住。后来尝试用InsCode(快马)平台的AI辅助功能,意外发现它能生成一个智能安装助手,把整个流程变得特别顺畅…...
如何在 Laravel Eloquent 中准确检测两个日期时间范围是否重叠
本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题,提供简洁可靠的数据库查询方案及完整代码示例。 本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题&…...
k8s与docker compose的思考
1.稍微复杂2.ip会漂移,各种端口转发性能有所损失。3.占用一定的资源4.master需要高可用5.更适合web无状态docker-compose则比较简单,搭建本地环境就一个配置文件的事情,简直是本地test环境神器。...
【EI复现】【基于改进粒子群算法求解】一种建筑集成光储系统规划运行综合优化方法附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...
LangBot+DeepSeek R1 QQ机器人保姆级配置教程:从下载懒人包到绕过API报错全流程
LangBotDeepSeek R1 QQ机器人保姆级配置教程:从下载懒人包到绕过API报错全流程 最近在折腾QQ聊天机器人,发现LangBotDeepSeek R1的组合特别适合像我这样的懒人。不过实际操作起来还是踩了不少坑,特别是API配置那块,简直让人抓狂。…...
seo关键字价格便宜的方法有哪些
价格便宜的方法有哪些 在当今市场竞争激烈的环境中,降低成本成为企业提升竞争力的关键之一。价格便宜的方法有哪些呢?本文将从问题分析、原因说明、解决方法、注意事项和实用建议五个方面来详细探讨这一话题。 问题分析 我们需要明确什么是“价格便宜…...
【C++第二十六章】特殊类设计
前言 🚀“特殊类设计”这一章看起来内容不多,但背后其实在讨论一个很典型、也很有代表性的 C 设计问题:类到底能不能限制对象的创建位置,能不能强制某个对象只能在堆上创建,或者只能在栈上创建。 这不是语法技巧题&…...
ModTheSpire技术深度解析:Java字节码注入与游戏模组加载器架构剖析
ModTheSpire技术深度解析:Java字节码注入与游戏模组加载器架构剖析 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire作为《杀戮尖塔》游戏社区的核心技术基础设施…...
若依RuoYi-Vue集成wangEditor:从零到一构建富文本内容管理模块
1. 为什么选择wangEditor与若依框架组合 在前后端分离的开发模式中,富文本编辑器是内容管理系统的核心组件。我实测过市面上主流的编辑器,wangEditor以其轻量级、易扩展的特性脱颖而出。特别是对于使用若依(RuoYi-Vue)框架的开发者来说,这个组…...
别让格式拖垮论文!Paperxie AI 一键盘活你的毕业定稿
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 凌晨两点的宿舍,键盘敲击声断断续续,桌前的本科生盯着屏幕上的论文文档叹气 —— 内…...
