STM32中斷分配——搶佔優先級與響應優先級

大一的時候學了C語言的代碼,自己一個人兩天做完了7個人一週的課設,寫過200~300行的簡單代碼,於是好高騖遠,跟着實驗室老師做項目。老師看我也很拼,於是對我說:單片機這個東西其實很簡單,51已經被淘汰了,STM32現在是主流,你就學STM32吧。於是我就學完了C語言基礎就上手32了。結果可想而知,沒有單片機的很多基礎知識,學這種16位的較爲複雜的單片機是很痛苦的,很多東西看上好幾遍自己也理解不透,因爲對最基本的概念沒有清楚的認識。到了大三,學校開了51單片機+彙編這門課,系統的學習了8位單片機的內部結構,理解了定時器、串口、矩陣鍵盤的工作原理,再上手STM32就很容易了。
大一大二的時候,一直沒有搞清楚搶佔優先級和響應優先級的分配,直到系統的學完51單片機,對位、字節、字在單片機內部的作用有了清楚的認識。現在來捋一捋,希望能幫助到其它勤奮好學的同學,在用單片機做數據採集或者控制的時候,有時候需要一個工程開好幾個中斷,去同時控制舵機、電機、串口數據收發等等,這時候就需要對這若干個中斷進行等級劃分。
1. STM32的搶佔優先級和響應優先級:
中斷優先級寄存器NVIC_IPRx,本寄存器寬度爲8位,原則上每個外部中斷可配置的優先級爲0~255,實際上精簡了,只用到了它的高4位。這4位,又被分成了搶佔優先級和響應優先級兩組:

(1)搶佔屬性:就是打斷其它正在執行的中斷,這時就出現了中斷嵌套。搶佔屬性由NVIC_IRQChannelPreemptionPriority 的參數配置。
(2)響應屬性:如果兩個中斷的搶佔優先級相同,並且他們同時申請中斷,那麼該怎麼辦呢?則響應屬性較高的中斷優先處理。響應屬性由搶佔屬性由NVIC_IRQChannelSubPriority 的參數配置。
2.中斷數量種類:
NVIC可以配置16種中斷向量的優先級(不是16個),即2^4=16,由四位二進制數字來表示。4位二進制表示搶佔優先級和響應優先級,用Q表示搶佔優先級,用X表示響應優先級,那麼4位二進制進行中斷配置有以下5種方式:
(1) XXXX: 4位全部用來配置響應優先級,16種中斷向量都具有不同的響應優先級;
(2) QXXX:搶佔優先級有兩種,編號0或1,響應優先級有8種;
(3) QQXX;
(4) QQQX;
(5) QQQQ;
用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n)選擇中斷數量種類(n可取值0~4);
在這裏插入圖片描述
(注:編號越小,優先級別越高;
要想配置以上優先級,調用庫函數NVIC_PriorityGroupConfig(),輸入的參數可以是NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分別對應以上介紹的5種分配組;
3.
當中斷數量超過16時,那麼至少有兩個中斷向量是使用相同的中斷種類,具有相同中斷種類的中斷向量不能互相嵌套。搶佔優先級和響應優先級都相同,則比較它們的硬件中斷編號,中斷編號越小,優先級越高。(硬件中斷編號從中斷向量表當中查看)
4.eg

Int main(void){
......//省略若干
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //設置NVIC中斷分組2:2,兩位搶佔優先級,兩位響應優先級;有2^2=4種搶佔優先級,4種響應優先級。
......
}
void uart_init(u32 bound){
......
//********************Usart1 NVIC串口配置*****************************
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;   //搶佔優先級1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		 //響應優先級3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQ通道使能;
	NVIC_Init(&NVIC_InitStructure);  	//根據指定的參數初始化NVIC寄存器;
......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章