stm32學習(3)——NVIC中斷優先級分組

相信大多數鐵汁在學習stm32的時候都瞭解過51單片機的基本內容,對於51單片機來說,中斷就那麼幾個:

  1. 外部中斷0
  2. 定時器/計數器0中斷
  3. 外部中斷1
  4. 定時器/計數器1中斷
  5. 串口中斷

它們在51單片機中的優先級也是按自上而下的順序,中斷少且優先級明確,這就是大家瞭解的51單片機中斷系統,又順便複習了一波老知識。

而在stm32f103系列芯片中有60個可屏蔽中斷(可屏蔽中斷簡單來說就是可以由寄存器控制是否產生中斷的中斷,skr~),從《stm32中文參考手冊》中可以看到有這麼0-59號一共60個可屏蔽中斷。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

NVIC中斷優先級分組

對於數量如此之多的中斷源怎麼來進行中斷管理也是一個問題,但是stm32給出了很好地解決辦法,NVIC中斷優先級分組(NVIC不懂沒關係,我也不懂,懂分組就行了)
在這裏插入圖片描述
從圖中可以看到(application interrupt and reset control register應用中斷和復位控制寄存器AIRCR[10:8]這三位,也就是下圖中綠色的三位,由這三位共同決定分組配置。
在這裏插入圖片描述
還要了解搶佔優先級與響應優先級的基本概念:

  1. 高優先級的搶佔優先級是可以打斷正在進行的低搶佔優先級中斷的
  2. 搶佔優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷
  3. 搶佔優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行
  4. 如果兩個中斷的搶佔優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行
  5. 優先級數字越小,優先級越高,越先被執行

瞭解了搶佔與響應兩個優先級的基本概念後再看上面的表就會發現,可以設置5中不同的優先級分組,每種都是4位也就是16種不同的優先級設置。

NVIC中斷優先級設置

一般情況下,系統代碼執行過程中,只設置一次中斷優先級分組(並且是在main函數比較靠前的位置設置),設置好分組之後一般不會再改變分組。若是在多處進行了分組,程序會以最後一次的分組爲準,並且之前設置的分組全部失效。隨意改變分組會導致中斷管理混亂,程序出現意想不到的執行結果。
在stm32中,關於NVIC優先級設置的函數都在misc.h裏可以看到:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

在main函數中通常使用一個中斷優先級分組設置函數

NVIC_PriorityGroupConfig();

//函數的入口參數可以選擇這些,也就是對應上表的幾種分組
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \
                                       ((GROUP) == NVIC_PriorityGroup_1) || \
                                       ((GROUP) == NVIC_PriorityGroup_2) || \
                                       ((GROUP) == NVIC_PriorityGroup_3) || \
                                       ((GROUP) == NVIC_PriorityGroup_4))

在單箇中斷設置搶佔和響應優先級時通常用:

 NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

//入口參數有三個
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));		//中斷使能
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); 		//搶佔優先級設置 
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));		//響應優先級設置

關於NVIC中斷優先級分組的介紹就到這了,砰~,水遁消失。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章