STM32之NVIC

本文详细介绍了STM32微控制器NVIC中断向量控制器的使用方法,包括优先级分组设置、中断嵌套原理及不可屏蔽中断特性等。通过实例展示了如何配置中断向量表,并解释了主优先级与辅优先级的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好了,我们再来看下NVIC,STM32 NVIC的使用可以说用很多好处,在以后的应用中可能就有所体会了

 

我们先来看一下Reference Datasheet中是如何说的:

 

 

SCB->AIRCR中目前只用到4位,也就是最高能有16级中断嵌套,如果全使用的话可以达到256级

 

选用优先级分组(实际就是选几位用于主优先级几位用于辅优先级)

注意,我们在一个工程中只能用一种分组方式

 

The table below gives the allowed values of the pre-emption priority and subpriority according
 to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
  ===========================================================================
    NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
  ===========================================================================
   NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                                       |                                    |                                |   4 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------
   NVIC_PriorityGroup_1  |                0-1               |            0-7              |   1 bits for pre-emption priority
                                       |                                     |                               |   3 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------   
   NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                                       |                                     |                               |   2 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------   
   NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                                       |                                      |                               |   1 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------   
   NVIC_PriorityGroup_4  |                0-15              |            0                 |   4 bits for pre-emption priority
                                        |                                     |                              |   0 bits for subpriority

以上是我提取库中misc.h中的说明便于大家理解

 

 

如果要使用中断那就得把中断向量表先存储到存储器,我们先来一段程序看一下吧

 

void NVIC_Configuration(void)
{
         NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
         NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
         NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

         NVIC_Init(&NVIC_InitStructure); 
}

这里边包含一个条件编译,如果我们要把中断向量表存储在RAM或者FLASH就要定义相关的宏

后边选用优先级分组的0组,也就是0位用于主优先级,4位用于辅优先级

 

主优先级可以中断嵌套(可以抢占)

辅优先级不可以中断嵌套,只能当前中断完成之后再相应优先级最高的

如果辅优先级相同则相应中断向量表靠前的

 

NVIC_IRQChannel 是说明用的哪种中断,包括所有的中断与异常(NVIC都管理,包括内核的)

 

讲到这里我们要提一下不可屏蔽中断,这个中断是不能屏蔽的NMI是不能屏蔽的,其他中断都是可以屏蔽的

 

 

好了,就先说到这里吧

 

                                                                                            如有错误敬请指正------by swei.fu

 

### 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、付费专栏及课程。

余额充值