CM3內核支持256箇中斷,其中包含了16個內核中斷和240個外部中斷,並且具有256級的可編程中斷設置。但是STM32並沒有使用CM3內核的全部東西,而是隻用了它的一部分。STM32有84箇中斷,包括16個內核中斷和68個可屏蔽中斷,具有16級可編程的中斷優先級。在STM32F103系列上,只有60個(在107系列纔有68個)。
搶佔優先級的級別高於響應優先級,而數值越小所代表的優先級就越高。
注意:第一,如果兩個中斷的搶佔優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;
第二,高搶佔優先級是可以打斷正在進行的低搶佔優先級中斷。而搶佔優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷
NVIC中斷管理函數主要在misc.c文件裏面
中斷優先級分組函數NVIC_PriorityGroupGonfig
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
//eg:分組範圍爲0~4,假設設置整個系統的中斷優先級分組值爲2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//這樣就確定了一共爲"2位搶佔優先級, 2位響應優先級"。
這個函數在系統中只能被調用一次,一旦分組確定就最好不要更改。
對每個中斷我們如何確定它的搶佔優先級和響應優先級呢?
中斷初始化函數NVIC_Initvoid NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
NVIC_InitTypeDef的成員變量:
typedef struct
{
uint8_t NVIC_IRQChannel; //初始化哪個中斷
uint8_t NVIC_IRQChannelPreemptionPriority; //定義這個中斷搶佔優先級
uint8_t NVIC_IRQChannelSubPriority; //定義子優先級
FunctionalState NVIC_IRQChannelCmd; //中斷是否使能
}NVIC_InitTypeDef;
以上是中斷分組分概念以及設定優先級值的方法,每種優先級還有一些關於清除中斷,查看中斷狀態等。
中斷優先級設置的步驟:
- 系統運行開始的時候設置中斷分組。確定組號,也就是確定搶佔優先級和子優先級的分配位數。調用函數爲NVIC_PriorityGroupConfig();
- 設置所用到的中斷的中斷優先級別。對每個中斷調用函數爲NVIC_Init();