【STM32】NVIC中斷優先級的理解

大千世界,無所不有,而前後順序,等級順序,則一直伴隨左右。而STM32也不例外。

 

我們在學習STM32中串口啊,定時器啊等等,都會遇到設置相應的優先級。下面來揭下這個神祕的面具。

我們知道優先級有兩種:搶佔式優先級PreemptionPriority 和 子優先級(響應優先級)SubPriority。

具有高優先級的中斷可以在低優先級正在運行時打斷其運行,然後執行自己的程序,運行完後再回來繼續運行低優先級。是不是有點像弱肉強食的現象,沒錯!!!    而這個有個專業的名稱,叫做中斷嵌套

當兩個中斷的優先級是相同的話,就要看先來後到。比如:一箇中斷正在執行時,剛好另外一箇中斷來了,肯定是先將正在執行的運行完後才執行新來的中斷。如果兩個中斷的搶佔優先級相同的話,而正好同時要運行,(這不是想把處理器逼瘋麼?)這時候就要出動另外一個大哥響應優先級了,根據響應優先級的高低去決定處理哪一個。又如果搶佔優先級和響應優先級都相同怎麼辦?(處理器已哭暈)這時候就要根據他們在中斷向量中的排列順序來決定處理哪一個。

注:  搶佔優先級高的是可以打斷搶佔優先級低執行,但是響應優先級高的是不可以打斷響應優先級低的。(這時候就會有疑惑,那到底響應優先級有什麼用呢,響應優先級高低是用在當搶佔優先級相同時,誰的響應優先級誰先執行  )

中斷向量表:

CM3 內核支持 256 箇中斷,其中包含了 16 個內核中斷和 240 個外部中斷,並且具有 256級的可編程中斷設置。但 STM32 並沒有使用 CM3 內核的全部東西,而是隻用了它的一部分。STM32 有 84 箇中斷,包括 16 個內核中斷和 68 個可屏蔽中斷,具有 16 級可編程的中斷優先級。而我們常用的就是這 68 個可屏蔽中斷,但是 STM32 的 68 個可屏蔽中斷,在 STM32F103 系列上面,又只有 60 個(在 107 系列纔有 68 個)。

 

介紹完優先級的前世今生,下面介紹下優先級都有哪些設置。

我們在代碼中都會發現有一個名爲NVIC優先級分組(NVIC_PriorityGroup)的概念

:我們設置中斷優先級分組只設置一次,在代碼開頭處設置,設置完分組後不要隨意更改,避免中斷管理混亂

注:0是最高,15是最低

通過上面的表格,我們可以發現NVIC中斷優先級分組可以分爲5組,就那分組2爲例:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//在misc.c文件中

則表示有2位搶佔優先級2位響應優先級

搶佔優先級PreemptionPriority   可以設置爲 0,1,2,3

    響應優先級Subpriority               可以設置爲 0,1,2,3

 

舉個例:

①假如設置中斷優先級分組爲2timer中斷搶佔優先級爲0,響應優先級爲1,而uart中斷搶佔優先級爲1,響應優先級爲0

我們可以發現timer中斷的搶佔優先級高

則當uart中斷在執行的時候,timer中斷剛好也來了,這時由於timer中斷的搶佔優先級比uart中斷的搶佔優先級高,因此可以打斷其運行而執行自己的代碼。

②假如設置中斷優先級分組爲2timer中斷搶佔優先級爲0,響應優先級爲1,而uart中斷搶佔優先級爲0,響應優先級爲0

我們可以發現兩者中斷的搶佔優先級相同,而uart中斷的響應優先級高

則當timer中斷在執行的時候,uart中斷來了,是不能打斷timer中斷執行的,

而當timer中斷和uart中斷同時來的時候先執行響應優先級高的uart中斷

 

這樣的話,我們就可以設置我們的優先級啦~

比如

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組爲2

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //搶佔優先級爲3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //響應優先級爲3                

 

 

下面講講中斷的相關寄存器:

ISER(Interrupt Set-Enable Registers):中斷使能寄存器組

用8個32位寄存器控制256箇中斷,而STM32F103只有60個可屏蔽中斷,因此只用ISER[0](0~31)和ISER[1](32~59),通過設置相應的ISER位爲1,進行使能。

ICER(Interrupt Clear-Enable Registers):中斷除能寄存器組(相當於Disable)

ISPR(Interrupt Set-Pending Registers):中斷掛起控制寄存器組

通過設置相應的ISER位爲1,進行掛起,而執行同級或者更高級別的中斷,寫0是無效的。

ICPR(Interrupt Clear-Pending Registers):中斷解掛控制寄存器組

通過設置 1,可以將掛起的中斷接掛。

IABR(Interrupt Active Bit Registers):中斷激活標誌位寄存器組

通過它可以知道當前在執行的中斷是哪一個。在中斷執行完了由硬件自動清零。

IP(Interrupt Priority Registers):中斷優先級控制的寄存器組(very important !!!)

IP 寄存器組由 240 個 8bit 的寄存器組成,每個可屏蔽中斷佔用 8bit,這樣總共可以表示 240 個可屏蔽中斷。而 STM32 只用到了其中的前 60 個。IP[59]~IP[0]分別對應中斷 59~0。而每個可屏蔽中斷佔用的 8bit 並沒有全部使用,而是 只用了高 4 位。這4位就是我們的搶佔優先級和響應優先級啦。搶佔優先級在前,響應優先級在後。

假如組2

則搶佔優先級有2²=4(0,1,2,3),響應優先級有2²=4(0,1,2,3)。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章