欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32 NVIC中断优先级

程序员文章站 2022-07-02 12:30:08
...

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,因此在项目中需尽量确保中断配置的正确。