有STM32用戶發現在操作BASEPRI特殊功能寄存器時,根本不起作用。比方,它目前配置了幾個中斷,優先級各不相同,按照STM32CubeMx里的配置分別為2、3、4不等,當他在BASEPRI寄存器里寫這幾個數字中的任意一個時,發現BASEPRI的數字始終是0,沒有任何效果。
我們知道,通過配置BASEPRI寄存器非0值來給系統中的中斷響應設置門檻,當中斷優先級低于某個級別時將不會得到CPU的響應執行,也就是說只有中斷優先級高于某個級別時才能得到響應。下面截圖是來自ARM
CORTEX M4技術手冊中有關BASEPRI寄存器的描述。
從這里可以看到該寄存器的有效配置位有8位,對其寫0無意義,或者說放棄設置中斷響應門檻功能。在ARMCORTEX-M內核系統里,中斷優先級的高低跟表示優先級的數字大小成相反關系,即數字越小的中斷優先級配置值所對應的優先級反而越高。
根據BASEPRI寄存器的定義,假設給BASEPRI寫數字5,那就意味著只有中斷優先級高于5的中斷,即中斷優先級的數字小于5的中斷可以得到響應,而其它低于優先級5的中斷將會被屏蔽。【注:這里說的優先級比較最終都體現在搶占優先級上】
另外,在ARM內核里關于每個中斷的優先級配置寄存器也是8位,并支持字節訪問。
內核里還有跟中斷優先級有關的寄存器,它把中斷優先級配置位分成2部分,用來分別設置每個中斷的組優先級和子優先級,或稱搶占優先級和響應優先級,也有稱主優先級和子優先級的,意思都一樣。個人喜歡中間的術語。
以上圖優先級分組值【PRIGROUP】等于3為例。中斷優先級寄存器中的bit0bit3用作配置該中斷的響應優先級,顯然,它的值可以是0到15的任一值。bit4bit7用來配置該中斷的強占優先級,同樣它的值也可以是0到15的任一值。若以【PRIGROUP】等于7為例,則所有可配置優先級的中斷只配置響應優先級,不區分強占優先級,或者說搶占優先級都一樣,或者說彼此不發生中斷搶占都一個意思。所謂中斷搶占即指另一中斷事件打斷正在執行的中斷服務程序而響應更高優先級的程序。
上面都基于ARM
Cortex-M內核的最初設計來說的,我們知道,STM32是基于ARM內核添加ST的外設而成,ST在設計芯片的中斷優先級這個地方,在AMR核的設計基礎上做了些針對性的調整,涉及中斷優先級的寄存器的有效控制位由8位變成4位,且僅使用高4位,低4位變成保留位。【下圖來自STM32
Cortex M4 編程手冊。注意紅色下劃線特別說明。】
不難理解,BASEPRI寄存器也會跟著做了調整,不然沒法跟上面調整過的中斷優先級寄存器匹配,它也只使用高4位,低4位變保留位。【下圖來自STM32F4系列編程手冊】
當然,關于優先級分組的控制寄存器的內容也做了相應調整,即針對優先級寄存器的高4位來劃分搶占優先級和響應優先級的配置。詳見下圖:
把上圖的各種優先級分組配置變得更直觀點就是下圖的樣子。綠色用于配置搶占優先級,黃色用于配置響應優先級,灰色保留位,一共有5種可能的分組情形。
聊到這里,我們得知每個可配置的STM32片內中斷,都有一個8位優先級配置寄存器與之對應,且只用到高4位。我們接著看看開篇的問題。目前STM32的有關中斷配置如下圖所示【使用STM32CubeMx工具進行】:
-
寄存器
+關注
關注
31文章
5357瀏覽量
120632 -
STM32
+關注
關注
2270文章
10906瀏覽量
356560 -
控制
+關注
關注
4文章
1012瀏覽量
122687
發布評論請先 登錄
相關推薦
評論