一、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
|