STM32之NVIC

    STM32有43个通道可配置中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下:

#define NVIC_PriorityGroup_0 ((u32)0x700)
#define NVIC_PriorityGroup_1 ((u32)0x600)
#define NVIC_PriorityGroup_2 ((u32)0x500)
#define NVIC_PriorityGroup_3 ((u32)0x400)
#define NVIC_PriorityGroup_4 ((u32)0x300)


在Cortex-M3中定义了8个比特位用于设置中断源的优先级,而STM32用4位指定指定中断优先级

STM32中优先级分组:

第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级


形象化的理解是:

你是上帝,
造了43个人,这么多人要分社会阶级和社会阶层了;
因为“阶级”的词性比较重;"阶层"比较中性,
所以preemption优先级对应“阶级”;每个阶级内部,有一些阶层,sub优先级对应“阶层”;

如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶级就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15

另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;

又有1个人SPI1_IRQChannel,设定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15

SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。

如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。

每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
还需要指定他的阶层:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1

另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。

还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

USART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。

以下的类推。
### STM32CubeMX中的NVIC配置 在STM32CubeMX中,可以通过图形化界面轻松完成嵌套向量中断控制器(Nested Vectored Interrupt Controller, NVIC)的相关配置。以下是关于如何配置NVIC优先级及相关设置的内容。 #### NVIC基本概念 NVIC是ARM Cortex-M系列微控制器的一部分,用于管理外设产生的中断请求。它支持多个中断源,并允许通过软件设定每个中断的优先级[^1]。STM32CubeMX提供了直观的方式让用户能够调整这些参数而无需手动修改寄存器。 #### 配置步骤详解 当使用STM32CubeMX进行项目初始化时,在Pinout & Configuration页面下找到System Core选项卡内的`NVIC`条目可以进入具体设置: - **Enable IRQ Channels**: 若要启用特定硬件模块(如USART2)对应的接收中断,则需勾选该通道下的Interrupt复选框来激活此功能。 - **Set Preemption Priority and Subpriority Levels**: 对于每一个被开启的IRQ channel来说,都可以单独定义抢占式(preemptive)以及子(sub-)优先级别数值。这决定了不同事件之间相互竞争CPU时间片时候的行为模式——较高preemption value意味着更强硬地打断其他较低级别的处理过程;相同level情况下则依靠sub-priority进一步区分顺序执行次序[^1]. 对于本案例提到的串口通讯场景而言,默认可能已经预填充了一些基础属性值比如波特率等信息之后再额外指定好有关interrupt handling部分即可满足需求. ```c // Example of enabling USART2_RX_IRQHandler with specific priorities via HAL Library generated code. HAL_NVIC_SetPriority(USART2_IRQn, 5, 0); // Set preemption priority to '5' and subpriority within same group to '0' HAL_NVIC_EnableIRQ(USART2_IRQn); ``` 以上片段展示了如果要编程实现同样效果的话所涉及的关键函数调用形式之一(HAL库版本). #### 注意事项 虽然工具简化了许多繁琐操作但仍需要注意几点: - 不同MCU型号可能会存在差异因此务必参照对应的数据手册确认实际可用范围; - 合理规划整个系统的整体架构避免因不当分配而导致资源冲突或者性能瓶颈等问题发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值