1. 程式人生 > >STM32學習之路-中斷優先順序

STM32學習之路-中斷優先順序

優先順序的問題可以分為以下情況:

搶佔優先順序和響應優先順序

(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中可以看到