中斷NVIC優先級的理解


使用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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM