有STM32用戶發(fā)現(xiàn)在操作BASEPRI特殊功能寄存器時(shí),根本不起作用。比方,它目前配置了幾個(gè)中斷,優(yōu)先級(jí)各不相同,按照STM32CubeMx里的配置分別為2、3、4不等,當(dāng)他在BASEPRI寄存器里寫(xiě)這幾個(gè)數(shù)字中的任意一個(gè)時(shí),發(fā)現(xiàn)BASEPRI的數(shù)字始終是0,沒(méi)有任何效果。
我們知道,通過(guò)配置 BASEPRI寄存器非0值來(lái)給系統(tǒng)中的中斷響應(yīng)設(shè)置門(mén)檻,當(dāng)中斷優(yōu)先級(jí)低于某個(gè)級(jí)別時(shí)將不會(huì)得到CPU的響應(yīng)執(zhí)行,也就是說(shuō)只有中斷優(yōu)先級(jí)高于某個(gè)級(jí)別時(shí)才能得到響應(yīng)。下面截圖是來(lái)自ARM CORTEX M4技術(shù)手冊(cè)中有關(guān)BASEPRI寄存器的描述。
從這里可以看到該寄存器的有效配置位有8位,對(duì)其寫(xiě)0無(wú)意義,或者說(shuō)放棄設(shè)置中斷響應(yīng)門(mén)檻功能。在ARMCORTEX-M內(nèi)核系統(tǒng)里,中斷優(yōu)先級(jí)的高低跟表示優(yōu)先級(jí)的數(shù)字大小成相反關(guān)系,即數(shù)字越小的中斷優(yōu)先級(jí)配置值所對(duì)應(yīng)的優(yōu)先級(jí)反而越高。
根據(jù)BASEPRI寄存器的定義,假設(shè)給BASEPRI寫(xiě)數(shù)字5,那就意味著只有中斷優(yōu)先級(jí)高于5的中斷,即中斷優(yōu)先級(jí)的數(shù)字小于5的中斷可以得到響應(yīng),而其它低于優(yōu)先級(jí)5的中斷將會(huì)被屏蔽?!咀ⅲ哼@里說(shuō)的優(yōu)先級(jí)比較最終都體現(xiàn)在搶占優(yōu)先級(jí)上】
另外,在ARM內(nèi)核里關(guān)于每個(gè)中斷的優(yōu)先級(jí)配置寄存器也是8位,并支持字節(jié)訪問(wèn)。
內(nèi)核里還有跟中斷優(yōu)先級(jí)有關(guān)的寄存器,它把中斷優(yōu)先級(jí)配置位分成2部分,用來(lái)分別設(shè)置每個(gè)中斷的組優(yōu)先級(jí)和子優(yōu)先級(jí),或稱搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),也有稱主優(yōu)先級(jí)和子優(yōu)先級(jí)的,意思都一樣。個(gè)人喜歡中間的術(shù)語(yǔ)。
以上圖優(yōu)先級(jí)分組值【PRIGROUP】等于3為例。中斷優(yōu)先級(jí)寄存器中的bit0~bit3用作配置該中斷的響應(yīng)優(yōu)先級(jí),顯然,它的值可以是0到15的任一值。bit4~bit7用來(lái)配置該中斷的強(qiáng)占優(yōu)先級(jí),同樣它的值也可以是0到15的任一值。若以【PRIGROUP】等于7為例,則所有可配置優(yōu)先級(jí)的中斷只配置響應(yīng)優(yōu)先級(jí),不區(qū)分強(qiáng)占優(yōu)先級(jí),或者說(shuō)搶占優(yōu)先級(jí)都一樣,或者說(shuō)彼此不發(fā)生中斷搶占都一個(gè)意思。所謂中斷搶占即指另一中斷事件打斷正在執(zhí)行的中斷服務(wù)程序而響應(yīng)更高優(yōu)先級(jí)的程序。
上面都基于ARM Cortex-M內(nèi)核的最初設(shè)計(jì)來(lái)說(shuō)的,我們知道,STM32是基于ARM內(nèi)核添加ST的外設(shè)而成,ST在設(shè)計(jì)芯片的中斷優(yōu)先級(jí)這個(gè)地方,在AMR核的設(shè)計(jì)基礎(chǔ)上做了些針對(duì)性的調(diào)整,涉及中斷優(yōu)先級(jí)的寄存器的有效控制位由8位變成4位,且僅使用高4位,低4位變成保留位。【下圖來(lái)自STM32Cortex M4 編程手冊(cè)。注意紅色下劃線特別說(shuō)明?!?/p>
不難理解,BASEPRI寄存器也會(huì)跟著做了調(diào)整,不然沒(méi)法跟上面調(diào)整過(guò)的中斷優(yōu)先級(jí)寄存器匹配,它也只使用高4位,低4位變保留位。【下圖來(lái)自STM32F4系列編程手冊(cè)】
當(dāng)然,關(guān)于優(yōu)先級(jí)分組的控制寄存器的內(nèi)容也做了相應(yīng)調(diào)整,即針對(duì)優(yōu)先級(jí)寄存器的高4位來(lái)劃分搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的配置。詳見(jiàn)下圖:
把上圖的各種優(yōu)先級(jí)分組配置變得更直觀點(diǎn)就是下圖的樣子。綠色用于配置搶占優(yōu)先級(jí),黃色用于配置響應(yīng)優(yōu)先級(jí),灰色保留位,一共有5種可能的分組情形。
聊到這里,我們得知每個(gè)可配置的STM32片內(nèi)中斷,都有一個(gè)8位優(yōu)先級(jí)配置寄存器與之對(duì)應(yīng),且只用到高4位。我們接著看看開(kāi)篇的問(wèn)題。目前STM32的有關(guān)中斷配置如下圖所示【使用STM32CubeMx工具進(jìn)行】:
這里優(yōu)先級(jí)分組選擇的是將優(yōu)先級(jí)的4位控制位全部用作搶占優(yōu)先級(jí)的配置,響應(yīng)優(yōu)先級(jí)都一樣,即不做特別配置。那么上圖中SYSTICK/TIM2/TIM3/TIM4的中斷的搶占優(yōu)先級(jí)數(shù)據(jù)0、2、3、4其實(shí)是站在中斷優(yōu)先級(jí)寄存器的高4位而言的,那么放到整個(gè)8位優(yōu)先級(jí)寄存器來(lái)看的話,他們的優(yōu)先級(jí)應(yīng)該是0x00,0x20,0x30,0x40【其實(shí),低4位值是多少無(wú)關(guān)緊要,反正無(wú)效位】。
前面提過(guò)了,現(xiàn)在BASEPRI寄存器也只用到高4位,低4位保留。顯然,如果在給BASEPRI寄存器賦值時(shí)按照基于高4位得到數(shù)字往里面寫(xiě)的話肯定都是無(wú)效的。
比方,我們期望在主程序里將上面TIM2/TIM3/TIM4的幾個(gè)中斷都屏蔽掉,若代碼像下面截圖里這樣寫(xiě)肯定達(dá)不到目的。我這里開(kāi)啟了TIM2/TIM3/TIM4的周期性更新中斷?!颈疚拇a編譯、調(diào)試基于ARM MDK IDE】
經(jīng)過(guò)測(cè)試也的確沒(méi)有達(dá)到目的。我寫(xiě)__set_BASEPRI(2)的本意是想屏蔽掉那幾個(gè)定時(shí)器的中斷響應(yīng),結(jié)果發(fā)現(xiàn)根本沒(méi)作用。BASEPRI寄存器也沒(méi)正確寫(xiě)入,因?yàn)閿?shù)據(jù)2只能寫(xiě)到BASEPRI寄存器的低4位,這幾位恰好是無(wú)效位。不難理解,當(dāng)我們改寫(xiě)成__set_BASEPRI(0x20)時(shí)就可以達(dá)到目的了。
此時(shí),BASEPRI被正確寫(xiě)入,TIM2/TIM3/TIM4的中斷不能得到響應(yīng),倒是SYSTICK中斷可以不被影響地得到響應(yīng),因?yàn)樗膬?yōu)先級(jí)是0,BASEPRI的配置屏蔽不了它。也就是說(shuō),通過(guò)配置BASEPRI寄存器來(lái)設(shè)置中斷響應(yīng)門(mén)檻的話,是阻止不了優(yōu)先級(jí)為0或更高優(yōu)先級(jí)的中斷的響應(yīng)的。如果對(duì)BASEPRI寫(xiě)0表示放棄其設(shè)置的中斷門(mén)檻的功能。
如果希望對(duì)包括0優(yōu)先級(jí)在內(nèi)的所有可配置中斷進(jìn)行關(guān)閉或屏蔽,能否做得到呢?若可以,如何操作?
STM32芯片里的中斷如果按中斷源是來(lái)自ST外設(shè)還是ARM核處理器可以分為異常和中斷,比方下圖中灰色部分的就是異常,其它為中斷?!窘貓D來(lái)自STM32G4系列參考手冊(cè)】
平常我們統(tǒng)稱二者為中斷,不做區(qū)分。如果說(shuō)把所有中斷按其優(yōu)先級(jí)是否可以配置,又可以將中斷分為優(yōu)先級(jí)固定和優(yōu)先級(jí)可配置的中斷。其中,優(yōu)先級(jí)固定的中斷在上面表格中都明確標(biāo)示了fixed字樣,優(yōu)先級(jí)可配置的都加注了settable字樣。結(jié)合前面提到的優(yōu)先級(jí)寄存器的特性,可配置的優(yōu)先級(jí)是不會(huì)高于0級(jí),即配置的數(shù)字不會(huì)小于0的。
若我們期望對(duì)所有可配置中斷進(jìn)行關(guān)閉或屏蔽,可以操作另一個(gè)叫PRIMASK的寄存器,它只有1位有效控制位。
我們通過(guò)對(duì)PARMASK寫(xiě)1,令CPU對(duì)所有優(yōu)先級(jí)可配置的中斷不做響應(yīng);若對(duì)其寫(xiě)0表示放棄屏蔽功能。比方,我們還是接著前面的演示代碼來(lái)看看效果。
這時(shí),前面提到的4個(gè)定時(shí)器中斷都不能得到響應(yīng)了,雖打了斷點(diǎn)但過(guò)不去。我們還可以借助調(diào)試工具看到這幾個(gè)中斷的響應(yīng)情況【SYSTICK位置離得遠(yuǎn),單獨(dú)截取后插進(jìn)圖中的】。
對(duì)于上圖的部分信息我這里稍微解釋下。
圖形上方的字母E、P、A是下方Eable/Pending/Active單詞的首字母。Enable表示相應(yīng)中斷是否在NVIC端得到響應(yīng)允許;Pending表示中斷等待CPU的執(zhí)行;Active表示中斷服務(wù)程序正在被執(zhí)行。從圖中可以看出,SYSTICK/TIM2/TIM3/TIM4的中斷響應(yīng)都雖得到允許,但都處于Pending期待執(zhí)行狀態(tài)。既然沒(méi)有得到執(zhí)行,Active位自然也是0。
上圖中優(yōu)先級(jí)的數(shù)字顯然是按照高4位結(jié)合優(yōu)先級(jí)分組后來(lái)看的,那個(gè)S表示SubPriority的意思。為了看得更清晰點(diǎn),我不妨將優(yōu)先級(jí)分組采用下面的做法重新配置下,保持原搶占優(yōu)先級(jí)都不動(dòng),增加1位響應(yīng)優(yōu)先級(jí)【即子優(yōu)先級(jí)】配置。目前4位優(yōu)先級(jí)配置位拆分為3位搶占優(yōu)先級(jí)配置位和1位響應(yīng)優(yōu)先級(jí)配置位。當(dāng)前測(cè)試代碼也保持不動(dòng)。
顯然,上圖中的搶占優(yōu)先級(jí)編號(hào)2、3、4是站在分組后的高3位單獨(dú)來(lái)看的,響應(yīng)優(yōu)先級(jí)是站在分組后剩下的1位單獨(dú)來(lái)看的。如果我們把兩類優(yōu)先級(jí)的配置合在高4位一起看,優(yōu)先級(jí)數(shù)字應(yīng)該分別是十進(jìn)制數(shù)1、5、6、9。【這個(gè)地方要弄清楚,否則下面調(diào)試結(jié)果看不明白?!?/p>
基于前面測(cè)試代碼和現(xiàn)有配置,我們看看運(yùn)行后的中斷響應(yīng)情況。
剛才雖然調(diào)整了優(yōu)先級(jí)的分組配置,但這幾個(gè)中斷的搶占優(yōu)先級(jí)都沒(méi)改變,所以在PRIMASK為1的情況下都不能得到響應(yīng)。我們可以發(fā)現(xiàn)這幾個(gè)中斷的優(yōu)先級(jí)站在高4位的角度來(lái)看而得出的優(yōu)先級(jí)數(shù)字跟我上面分析的基本一致,除了SYSTICK的。
按理此時(shí)此處SYSTICK的優(yōu)先級(jí)應(yīng)該是1而不是0。為什么會(huì)這樣呢?原因就在于我基于CubeMx組織的代碼,這個(gè)過(guò)程中如果使用SYSTICK做庫(kù)代碼的TICK時(shí)鐘,其中斷優(yōu)先級(jí)的配置使用默認(rèn)配置,沒(méi)有理睬CubeMx這邊針對(duì)它子優(yōu)先級(jí)的配置。Cube庫(kù)在配置SYSTICK優(yōu)先級(jí)時(shí),默認(rèn)使用全部4位用作搶占優(yōu)先級(jí)的配置,同時(shí)將子優(yōu)先級(jí)配置為0。當(dāng)然,我們可以針對(duì)性地調(diào)整來(lái)適應(yīng)我們的需求。主要是下面這個(gè)weak特性的初始函數(shù),我們可以手動(dòng)修改這個(gè)函數(shù)里關(guān)于中斷優(yōu)先級(jí)的配置。
關(guān)于使用PRIMASK屏蔽所有可配置中斷的做法還有其它等效動(dòng)作,比如使用CPSID指令和CPSIE指令或調(diào)用相關(guān)CMSIS函數(shù)。【參見(jiàn)下圖】
它們的作用一樣,也就是我們平常所說(shuō)的開(kāi)、關(guān)總中斷,準(zhǔn)確點(diǎn)說(shuō)是屏蔽所有優(yōu)先級(jí)可配置中斷的響應(yīng)或者放棄屏蔽功能。對(duì)于開(kāi)、關(guān)總中斷的說(shuō)法,從實(shí)現(xiàn)屏蔽效果來(lái)看勉強(qiáng)可以說(shuō)能關(guān)總中斷。但整體上講,個(gè)人覺(jué)得這個(gè)說(shuō)法不太合適,還很容易給人帶來(lái)誤解,頗具誤導(dǎo)性。其實(shí),不論是操作PRIMASK還是BASEPRI寄存器,并沒(méi)有對(duì)被屏蔽中斷的原有參數(shù)和配置做任何改變。即那些暫時(shí)被屏蔽的中斷的中斷響應(yīng)允許位、中斷請(qǐng)求使能位、中斷觸發(fā)事件等都不會(huì)因?yàn)闀簳r(shí)的被屏蔽而發(fā)生改變。打個(gè)形象而不是特別貼切的比方。當(dāng)你開(kāi)著豪車愉快地跑在某條道上,聽(tīng)著歌哼著曲。突然前方有交警在對(duì)道路做臨時(shí)管制,你和其它一干人車都被攔停下來(lái)。原因是有一行高級(jí)別的人物要保障優(yōu)先通行。你等雖被攔停下來(lái),既沒(méi)人說(shuō)你無(wú)證駕駛、也沒(méi)人告知你無(wú)權(quán)走這條道,證照都在,行路權(quán)也有,就是此刻級(jí)別不夠。一旦放行,你依然可以一如既往地行使。
我倒覺(jué)得ARM技術(shù)手冊(cè)提到的優(yōu)先級(jí)提升更好理解和接受些。即通過(guò)對(duì)BASEPRI、PRIMASK這些寄存器編程提升當(dāng)前執(zhí)行程序的優(yōu)先級(jí),使得低于當(dāng)前優(yōu)先級(jí)的中斷暫時(shí)得不到響應(yīng)。適當(dāng)時(shí)候放棄優(yōu)先級(jí)升級(jí)功能,恢復(fù)原狀。
可能有人知道,還有個(gè)可以關(guān)閉或屏蔽優(yōu)先級(jí)高至-1級(jí)的HardFault異常的控制寄存器,就是FAULTMASK,也是1位有效位,操作跟PRIMASK類似。有興趣的話,可以自行進(jìn)一步研究下。
審核編輯:湯梓紅
-
ARM
+關(guān)注
關(guān)注
134文章
9084瀏覽量
367380 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355728 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41470 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14791
原文標(biāo)題:為何修改BASEPRI寄存器無(wú)效?
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論