STM32中斷優(yōu)先級(默認和不默認情況)
二,開(kāi)關(guān)總中斷:
在STM32/Cortex-M3中是通過(guò)改變CPU的當前優(yōu)先級來(lái)允許或禁止中斷。
PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當前CPU優(yōu)先級=0)。
FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當前CPU優(yōu)先級=-1)。
在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個(gè)函數操作PRIMASK位和FAULTMASK位,改變CPU的當前優(yōu)先級,從而達到控制所有中斷的目的。
新庫中下面兩個(gè)函數等效于關(guān)閉總中斷:
void__disable_irq (void);
void __disable_fault_irq (void);
下面兩個(gè)函數等效于開(kāi)放總中斷:
void __enable_irq (void);
void __enable_fault_irq (void);
上面兩組函數要成對使用,不能交叉使用。
例如:
第一種方法:
PRIMASK 用于除能在NMI 和硬fault 之外的所有異常,它有效地把當前優(yōu)先級改為0(可編程優(yōu)先級中的最高優(yōu)先級)。
void__disable_irq (void);//關(guān)閉總中斷
void __enable_irq (void);//開(kāi)放總中斷
__set_PRIMASK(1);
__set_PRIMASK(0);
第二種方法:
FAULTMASK 更絕,它把當前優(yōu)先級改為‐ 1 。這么一來(lái),連硬fault 都被掩蔽了。使用方案與PRIMASK 的相似。但要注意的是,FAULTMASK 會(huì )在異常退出時(shí)自動(dòng)清零。
void __disable_fault_irq (void); //關(guān)閉總中斷
void __enable_fault_irq (void);//開(kāi)放總中斷
__set_FAULTMASK(1);
__set_FAULTMASK(0);
常常使用
void__disable_irq (void);//關(guān)閉總中斷
void __enable_irq (void);//開(kāi)放總中斷
呵呵
上面說(shuō)的可能大家看完之后第一感覺(jué)就是一頭霧水,可能有點(diǎn)繞,下面我就結合自己的經(jīng)驗直白的談?wù)凷TM32的中斷優(yōu)先級的、
含義和結合庫函數的使用方法
庫函數中提到的PreemptionPriority含義是搶占式優(yōu)先級,subPriority含義是響應優(yōu)先級,也叫亞優(yōu)先級。何為搶占式優(yōu)先級?
顧名思義,是指在搶占式優(yōu)先級不同時(shí),搶占式優(yōu)先級高的可以中斷搶占式優(yōu)先級低的,也就是所謂的嵌套!相同的搶占式優(yōu)先級之間是不可以中斷嵌套的。打個(gè)比方,如果系統采用的是第4組優(yōu)先級分組方式,就意味著(zhù)所有的4位都被用來(lái)指定搶占式優(yōu)先級,也就是說(shuō),這樣一來(lái)?yè)屨际絻?yōu)先級就有16個(gè)等級,通過(guò)你對需要的中斷源進(jìn)行中斷優(yōu)先級賦值,就可以實(shí)現你所希望的高優(yōu)先級中斷函數在低優(yōu)先級中斷函數未執行完之前就開(kāi)始執行,即中斷嵌套,該分組方式最多可以完成1個(gè)中斷和15級嵌套。
通過(guò)上面我們知道搶占式優(yōu)先級高的可以中斷優(yōu)先級低的,但是響應優(yōu)先級跟搶占式優(yōu)先級有什么聯(lián)系呢?這里我就 打個(gè)可能不太形象的比喻,幫助大家理解一下,如果說(shuō)搶占式優(yōu)先級是某個(gè)等級的政府機關(guān)的話(huà),那響應優(yōu)先級就是這個(gè)政府機關(guān)里面的部門(mén),政府機關(guān)權力有高低之分,同樣每個(gè)部門(mén)之間也有權力大小之分。
下面的話(huà)語(yǔ)言我組織不好可能有點(diǎn)繞,但是大家一定要仔細看:
不同的政府機關(guān)(搶占式優(yōu)先級)之間可以相互中斷,但是同一個(gè)政府機關(guān)里面的不同部門(mén)(即搶占式中斷優(yōu)先級相同,響應優(yōu)先級不同)之間不能相互中斷,因為內部不能相互打架,即使響應優(yōu)先級高的來(lái)了,如果此時(shí)有響應優(yōu)先級低的中斷服務(wù)程序正在執行,他一定要等到對方執行完之后才可以執行,但是要注意一點(diǎn),雖然他不可以打斷比他響應優(yōu)先級低的中斷服務(wù)函數,但是他有“插隊”的特權,即當有多個(gè)相同搶占式優(yōu)先級同時(shí)到來(lái)的時(shí)候,響應優(yōu)先級高的雖然中斷來(lái)的比較遲,但是他有優(yōu)先執行的特權!問(wèn)題又來(lái)了,如果搶占式優(yōu)先級和響應優(yōu)先級都相同的中斷同時(shí)中斷或是排隊時(shí)孰先孰后呢,這就要看他們在中斷向量表中的位置了,也就是說(shuō)中斷入口地址低的優(yōu)先。
下面的問(wèn)題大家就很容易理解了,不同的響應優(yōu)先級不影響搶占式優(yōu)先級,打個(gè)比喻就是權力高的政府機關(guān)中最爛部門(mén)說(shuō)話(huà)都比權力低的政府機關(guān)中最好的部門(mén)說(shuō)話(huà)好使。即權力高,可以搶斷,嵌套
剛剛發(fā)現有些人把STM32的中斷通道數和外部單片機引腳數混為一談,中斷通道數跟單片機引腳個(gè)數沒(méi)有任何關(guān)系,目前M3內核無(wú)論多少引腳的單片機中斷通道數都是84個(gè),而無(wú)論引腳有多少個(gè),這些引腳只占用6個(gè)通道,即0~4線(xiàn)分別占用一個(gè)通道,5~9線(xiàn)10~15線(xiàn)占用兩個(gè)中斷通道,一個(gè)中斷通道可能對應很多外設
評論