首先,對STM32中斷進行分組,組0~4。同時,對每個中斷設置一個搶占優先級和一個響應優先級值。
這里寫圖片描述
搶占優先級&響應優先級
1.高優先級的搶占優先級是可以打斷正在進行的低搶占優先級中斷的。
2.搶占優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷。
3.搶占優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行。
4.如果兩個中斷的搶占優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行
打斷只有搶占可以
值越小越高
例如:
假定設置中斷優先級組為2,然后設置中斷3(RTC中斷)的搶占優先級為2,響應優先級為1。 中斷6(外部中斷0)的搶占優先級為3,響應優先級為0。中斷7(外部中斷1)的搶占優先級為2,響應優先級為0。
那么這3個中斷的優先級順序為:中斷7>中斷3>中斷6。
中斷設置順序
1.中斷優先級分組函數:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); //NVIC_PriorityGroup_0~4
2.中斷初始化函數:
針對每一個中斷
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
typedef struct
{
uint8_t NVIC_IRQChannel; //設置中斷通道
uint8_t NVIC_IRQChannelPreemptionPriority;//設置響應優先級
uint8_t NVIC_IRQChannelSubPriority; //設置搶占優先級
FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;
//例子
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 搶占優先級為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子優先級位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據上面指定的參數初始化NVIC寄存器