電子那點事: STM32F103 中斷軟硬件講解

由於 STM32F103 是基於 ARM Cortex M3 內核設計的,因此我們先了解一下 ARM Cortex M3 的中斷,M3 內核的中斷分為兩大部分,第一部分是系統中斷,一共有 16 個,第二部分是 留給芯片廠家的 240 的外設中斷(這兩部分加起來一共有 256 箇中斷)。但是芯片廠家可能 用不上 240 個外設中斷,因此會對其進行裁剪,我們的 STM32F103 只是用了 60 個外設中斷。 下面我們看一下 STM32F103 這 76 箇中斷(16 個系統中斷有些是預留的,有意義的系統中斷 為 10 個。另外中斷優先級數越小優先級別越高):

電子那點事: STM32F103 中斷軟硬件講解

電子那點事: STM32F103 中斷軟硬件講解

電子那點事: STM32F103 中斷軟硬件講解

電子那點事: STM32F103 中斷軟硬件講解

其中藍色部分是系統的 16 箇中斷,其餘 60 個為外設中斷。另外除了三個中斷優先級固 定外,剩餘的中斷優先級都是可以通過程序設置的,STM32 支持 16 個可編程優先級。 這裡說一下和中斷設置有關的名詞: 中斷使能/失能:中斷使能的意思是讓中斷有效或者說是開中斷,反之,失能則是關閉 中斷。 中斷掛起/解掛:當一箇中斷髮生時,此時單片機正在執行和該中斷同優先級或者更高 優先級的另外一箇中斷時,該中斷將被掛起,直到另一箇中斷執行完才可解掛並執行,其實 就是根據中斷優先級排隊。 中斷嵌套:正如前面圖片表述那樣,一個高優先級的中斷打斷了低優先級的中斷的過程 就是中斷嵌套,這樣做使得不同優先級的中斷能夠按照優先級的大小依次執行,可以理解為 VIP 插隊。 接下來我們看一下 STM32F103 中斷的相關寄存器(這些寄存器是用於設置 STM32F103 的 60 個外設中斷的):

電子那點事: STM32F103 中斷軟硬件講解

該段代碼位於 core_cm3.h 文件中,它定義的是就是 STM32 的中斷相關寄存器。我們依 次講解一下。

⚫ 中斷使/失能寄存器(ISER/ICER)

ISER 用於使能某個中斷,寄存器中的一個位對應著一箇中斷,寫 1 就使能,寫 0 被忽 略。由於 CM3 內核最多支持 240 個外設中斷,因此 ISER 是由 8 個 32 位的寄存器組成(只不 過剩餘的最高 16 位沒有用到),而 STM32F103 只有 60 箇中斷,因此只用到了 ISER[0]和 ISER[1]的低 28 位。 同理,ICER 用於設置 STM32 的中斷失能,寫 1 失能,寫 0 忽略。

⚫ 中斷掛起/解掛寄存器(ISPR/ICPR)

這兩組寄存器用於設置中斷掛起和解掛,操作和中斷使/失能寄存器一致。

⚫ 活動中斷標誌寄存器

字面理解就是用於記錄此時正在執行中斷的寄存器,如果一箇中斷被執行,那麼該中斷 對應位就會被置 1,即使該中斷被其他更高優先級的中斷打斷,只要該中斷沒有執行完就一 直保持 1 的狀態,直到中斷服務函數執行完才會被自動清零。

⚫ 中斷優先級寄存器(IP)

中斷優先級寄存器用於設置每個中斷的優先級,CM3 內核最大支持 240 個外設中斷併為 每個中斷分配了 8 位可編程優先級,但是 STM32F103 只用到了 60 箇中斷優先級寄存器,而 且每個中斷只用到了高四位來設置中斷優先級。這高四位又被分組為兩部分優先級:搶佔優 先級和子優先級(也可以叫響應優先級或者亞優先級)。一箇中斷是否需能夠搶佔其他中斷 由三個因素決定:搶佔優先級,子優先級,中斷編號。 先說搶佔優先級,如果中斷 A 的搶佔優先級比中斷 B 的搶佔優先級高,那麼不管這兩個 中斷的子優先級和中斷編號是什麼,A 都會搶佔 B,或者說發生 B 的時候 A 在執行,那麼 B 會被掛起。 當 A、B 兩個中斷的搶佔優先級相同的情況下,且 A 的子優先級比 B 高,那麼當他們同 時發生或者同時解掛的時候會優先執行 A,如果 A 中斷髮生的時候 B 中斷正在執行,那麼 A也不會搶佔 B,而是要掛起,等待正在執行的 B 中斷執行完成才執行 A 中斷。 當兩個中斷的搶佔優先級和子優先級都相同的情況下且兩個中斷一起發生時,則根據中 斷編號進行響應(號小的先響應)。

⚫ 軟件觸發中斷寄存器(STIR)

用戶可以通過寫該寄存器來手動的觸發對應中斷,比如寫入 0x08,則觸發中斷編號 8 的 中斷。 下面說一下中斷分組,STM32 的中斷分組由 AIRCR 寄存器的 10-8 位控制:

電子那點事: STM32F103 中斷軟硬件講解

該中斷分組設置是全局的,例如此時將中斷優先級分組設置為第三分組,那麼對於所有 的外設中斷來說,都將使用這種分組方式。STM32F103 的中斷共分為 5 組:

電子那點事: STM32F103 中斷軟硬件講解

就拿 2 組為例,此時搶佔優先級的取值範圍是 0~3,子優先級取值範圍也是 0~3, 分組的好處是可以擴展優先級的功能。我們在配置中斷的時候,一般要做兩個工作:

1. 在一開機就設置中斷分組,且在下次重啟之前最好不要再進行分組設置。我們看一下設 置中斷分組的函數(位於 misc.c):

電子那點事: STM32F103 中斷軟硬件講解

該函數先檢查參數是否合理,然後將該分組號賦給 AIRCR 寄存器,其中的 AIRCR_VECTKEY_MASK 是該寄存器的訪問秘鑰,對該寄存器寫操作就必須先填入秘鑰。我們 此時將其設置為分組 2: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

2. 設置相應外設的中斷,設置內容選擇某個外設中斷並設置它的搶佔優先級和子優先級。 代碼如下(以外部中斷 0 為例):

電子那點事: STM32F103 中斷軟硬件講解

本章需要大家掌握的是 STM32 的分組概念以及根據分組設置中斷優先級,在程序上其 實只需要兩步即可,第一步是開機分組,第二步是設置對應中斷優先級並使能。


分享到:


相關文章: