打印
[应用相关]

STM32-NVIC

[复制链接]
42|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-1-15 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、NVIC是什么
NVIC(Nested Vectored Interrupt Controller)是嵌套向量中断控制器,用于管理STM32微控制器中的中断。它控制着整个STM32芯片中断相关的功能,与Cortex-M3内核紧密联系,是内核里面的一个外设。
‘ ‘ 可看作中断排序器 ‘ ‘ ``可看作中断排序器` `
‘‘可看作中断排序器‘‘

NVIC的主要功能包括:

管理中断的使能和禁用
设置中断优先级
处理中断请求和中断响应
二、NVIC优先级分组
抢占优先级(Preemption Priority)
作用:决定中断的抢占能力。
效果:高优先级的中断可以打断低优先级的中断。
数值越小,优先级越高:抢占优先级为0的中断比抢占优先级为1的中断优先级高。
示例:如果一个高优先级中断发生时,CPU正在处理一个低优先级中断,高优先级中断会打断低优先级中断,先处理高优先级中断。

响应优先级(Sub Priority)
作用:在抢占优先级相同的情况下,决定中断的处理顺序。
效果:仅在抢占优先级相同的情况下生效,高优先级的中断会先被处理。
数值越小,优先级越高:响应优先级为0的中断比响应优先级为1的中断优先级高。
示例:如果多个中断的抢占优先级相同,响应优先级高的中断会先被处理。如果响应优先级也相同,则按中断号(IRQn)从小到大的顺序处理。
NVIC的优先级分组用于配置中断的抢占优先级和响应优先级。STM32的NVIC使用4位寄存器来设置优先级,这4位可以分为抢占优先级和子优先级。不同的分组方式决定了这4位如何分配:

即:抢占可以打断,响应只是排队

注:级别是从0开始

优先级分组0
抢占优先级位数:0位
响应优先级位数:4位
优先级级别:16级响应优先级(0-15)
适用场景:不需要抢占优先级区分,所有中断共享相同的抢占优先级,仅通过响应优先级区分。
优先级分组1
抢占优先级位数:1位
响应优先级位数:3位
优先级级别:2级抢占优先级(0,1),8级响应优先级(0-7)
适用场景:需要简单抢占优先级区分,可以区分两个优先级层次。
优先级分组2
抢占优先级位数:2位
响应优先级位数:2位
优先级级别:4级抢占优先级(0-3),4级响应优先级(0-3)
适用场景:需要中等程度抢占优先级区分,可以区分四个优先级层次。
优先级分组3
抢占优先级位数:3位
响应优先级位数:1位
优先级级别:8级抢占优先级,2级响应优先级
适用场景:需要较细致抢占优先级区分,可以区分八个优先级层次。
优先级分组4
抢占优先级位数:4位
响应优先级位数:0位
优先级级别:16级抢占优先级
适用场景:需要非常细致抢占优先级区分,所有中断共享相同的响应优先级。
例如,选择第1组优先级分组:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 选择第1组优先级分组


三、优先级计算
有效优先级计算公式:

优先级分组0:EffectivePriority=SubPriority
优先级分组1:EffectivePriority=(PreemptionPriority×8)+SubPriority
优先级分组2:EffectivePriority=(PreemptionPriority×4)+SubPriority
优先级分组3:EffectivePriority=(PreemptionPriority×2)+SubPriority
优先级分组4:EffectivePriority=PreemptionPriority
优先级顺序:

抢占优先级不同:抢占优先级高的中断先处理。
抢占优先级相同:响应优先级高的中断先处理。
抢占优先级和响应优先级都相同:按照中断号(IRQn)从小到大的顺序处理。
示例:假设你有以下中断配置:

中断A:抢占优先级1,响应优先级1
中断B:抢占优先级0,响应优先级0
中断C:抢占优先级1,响应优先级0
中断D:抢占优先级1,响应优先级1
计算有效优先级:
中断A:(1×8)+1=9
中断B:(0×8)+0=0
中断C:(1×8)+0=8
中断D:(1×8)+1=9
优先级顺序:
中断B:有效优先级0
中断C:有效优先级8
中断A:有效优先级9
中断D:有效优先级9

二、NVIC结构体参数
注:IRQn 是 "Interrupt Request Number" 的缩写,即中断请求号。
NVIC_InitTypeDef是一个结构体,用于配置和初始化中断控制器(NVIC)的相关参数。该结构体包含以下成员:

NVIC_IRQChannel:表示中断通道号,用于指定要配置的中断通道。这些通道号定义在stm32f10x.h文件的IRQn_Type枚举中。(过多此处不展开列举了)
NVIC_IRQChannelPreemptionPriority:表示抢占优先级,用于指定中断的抢占优先级,数值越低表示优先级越高。
NVIC_IRQChannelSubPriority:表示子优先级(响应优先级),用于指定中断的子优先级,数值越低表示优先级越高。
NVIC_IRQChannelCmd:表示中断使能或禁止的控制标志位,用于指定中断的使能状态。
例如,配置EXTI0中断:

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2302_80219536/article/details/145102148

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2071

主题

16025

帖子

15

粉丝