STM32 NVIC中斷優先順序的理解

2021-09-29 23:54:38 字數 3420 閱讀 1763

我們在學習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

①假如設定中斷優先順序分組為2,timer中斷的搶占優先順序為0,響應優先順序為1,而uart中斷的搶占優先順序為1,響應優先順序為0

我們可以發現timer中斷的搶占優先順序高

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

②假如設定中斷優先順序分組為2,timer中斷的搶占優先順序為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)。

STM32NVIC中斷優先順序

cm3核心共支援256個中斷,其中包含了16個核心中斷,240個外部中斷,並且具有256級可程式設計中斷設定。但是stm32並沒有使用cm3核心全部的東西,stm32有84個中斷,其中包含了16個核心中斷,68個可遮蔽中斷,具有16級可變陳的中斷優先順序。typedef struct nvic ty...

STM32 NVIC 中斷優先順序管理

這裡以stm32f4系列為例。先簡單介紹下stm32f4的中斷分組,stm32f4將中斷分為5個組,組0 4.該分組的設定是有scb aircr暫存器的bit 10 8來定義的。具體分配關係如下表 假設說組設定為2,那麼此時每個中斷的中斷優先暫存器的高四位中的最高兩位是搶占優先順序,低兩位是響應優先...

stm32 NVIC中段優先順序

nvic stm32f103有60個遮蔽中斷 管理辦法 首先對中斷進行分組0 4,在每個中斷設定乙個搶占優先順序和乙個響應優先順序值。在scb aircr中配置 在一般的情況下是設定的是2組,由兩個搶占優先順序和兩個響應優先順序分配。搶占優先順序和響應優先順序區別 1 搶占優先順序高的可以打斷搶占優...