stm32 NVIC中断优先级

本文深入探讨了STM32中NVIC(Nested Vectored Interrupt Controller)的中断优先级设置,包括抢占优先级和响应优先级的概念,以及如何通过STM32CubeMX等工具进行正确配置,避免中断配置错误导致的程序bug。

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

stm32 NVIC中断优先级


  在使用IIC、串口等功能时一定会涉及NVIC中断的设置,NVIC(Nested Vectored Interrupt Controller)即内嵌向量中断控制器,该设置主要用来判定当两个中断同时发生,或者在一个中断进行的时候产生了另一给中断该如何处理的问题。
  以串口的中断初始化为例

	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//响应优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据上述参数初始化NVIC寄存器

  该中断初始化过程中有四个变量,其中比较难理解的是NVIC_IRQChannelPreemptionPriority和IRQChannelSubPriority。
   NVIC_IRQChannelPreemptionPriority是指抢占优先级,数字越小优先级越高,当优先级低的中断进行时发生了一个优先级高的中断会产生嵌套中断,先执行优先级高的中断,在执行完优先级高的中断之后,继续执行优先级低的中断,当所有中断完成之后继续返回主函数执行任务。
   IRQChannelSubPriority是响应优先级,当两个中断同时发生时,在抢占优先级相同的情况下,先执行响应优先级高的中断,如果在一个中断进行的时候产生了一个同抢占优先级的中断,即使该中断的响应优先级更高,也不会产生二次中断。
  系统总共提供了四位寄存器用来进行NVIC中断优先级设置(Cortex-M3提供了8位,但stm32只使用了四位), 中断优先级分组(NVIC_PriorityGroupConfig)的选择将确定这四位中几位用于抢占优先级,几位用于响应优先级。

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组

  中断优先级分组函数一般一个程序只执行一次,并位于其他中断初始化前,NVIC_PriorityGroup共有5种,具体如下(以下代码位于misc.h的78行)

@code  
 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                       
  ============================================================================================================================
@endcode

  如果NVIC初始化的分组与你优先级的等级赋值相矛盾,如中断分组为NVIC_PriorityGroup_3 ,但你的中断响应优先级(NVIC_IRQChannelSubPriority)赋值为3。由于NVIC_PriorityGroup_3 的中断优先级范围为0-1,因此很明显的中断响应优先级溢出了 ,但系统并不会报warning和error,这个错误也不会影响你中断的触发,但当几个中断同时发生时会发生一些奇怪的bug,因此在项目中需尽量确保中断配置的正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值