使用NVIC時,是為了多個中斷分個優先次序
1.進行中斷分組
分組函數:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
假設,要使中斷分組為2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
2.設置中斷的優先級別(搶占優先級和子優先級)
中斷初始化函數:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
假設,要設置串口1的中斷,同時設置搶占優先級為1,子優先級為2
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 寄存器
對於STM32 NVIC中斷優先級管理
由於我的芯片是STM32F103,里面只有60個可屏蔽中斷,也就是說只用了ISER[0]和ISER[1](CM3內核ISER共有8個,即ISER[8])
同時,對於中斷分組
例如組設置為 3,那么此時所有的 60 個中斷,每個中斷的中斷優先寄存器的高四位中的最高 3 位是搶占優先級,低 1 位是響應優先級。每個中斷,你可以設置搶占優先級為 0~7,響應優先級為 1 或 0。搶占優先級的級別高於響應優先級。而數值越小所代表的優先級就越高。
個人理解:由數據的第10~8位確定第幾組,后由第7~4位確定搶占優先級和響應優先級,數值越小,優先級越高。
這時需要注意兩點:
1、如果兩個中斷的搶占優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;
2、高優先級的搶占優先級是可以打斷正在進行的低搶占優先級
中斷的。而搶占優先級相同的中斷,高優先級的響應優先級不可以打斷低響應優先級的中斷;
假定設置中斷優先級組為 2,然后設置中斷 3(RTC 中斷)的搶占優先級為 2,響應優先級為 1。中斷 6(外部中斷 0)的搶占優先級為 3,響應優先級為 0。中斷 7(外部中斷 1)的搶占優先級為 2,響應優先級為 0。那么這 3 個中斷的優先級順序為:中斷 7>中斷 3>中斷 6。