首页 > 代码库 > STM32学习之路-中断优先级<NIVC(2)>

STM32学习之路-中断优先级<NIVC(2)>

优先级的问题可以分为以下情况:

抢占优先级和响应优先级

(1)抢占优先级高的可以打断抢占优先级低的,形成嵌套.

(2)抢占优先级相同时,看响应优先级.如果两个中断前后发生的话,后来的中断不能打断前一个中断

只能等,如果两个中断同时发生的话,则响应优先级高的先响应.

(3)抢占级别和响应级别都一样时,按照中断的地址来响应,地址低的先响应

这样就解决了优先级的问题.

哪个级别高呢?  0>1>2>...... 

STM32共有5组分别是0-4组,还是借那个图


可以看到第4组所有的位都用来设置抢占式优先级了(占先式),所以它能嵌套15个中断,然后自身一个中断,一次类推

0组只有响应式优先级,所以它不能嵌套任何中断,也就是这个组别的中断不能打断任何的其他在运行的中断.

配置NIVC的例子

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
    
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置组别
  
  /* Enable the EXTI9-5 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn;	     //配置哪个中断			 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级	     
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	    //优先响应级		   
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	    //使能			 
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;				
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	     
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;				 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	     
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			   
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				
  NVIC_Init(&NVIC_InitStructure);
}
这里的配置中3个中断的抢占级别是一样的,都是0,所以谁都不能打断谁,优先响应级别是EXTI3_IRQn最高,

EXTI3_IRQn的值是多少呢,在stm32f10x.h中可以看到