了解Cortex-M3的中斷

2020-12-20 電子產品世界

在第一個函數SystemInit()的下一行,會有常見的另一個函數NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X代表數字1,2,3...)。此函數跟中斷配置相關,配置中斷優先級,包括搶佔優先級與子優先級。

關於NVIC(中斷向量控制器)的介紹STM32參考手冊中是找不到的。需要看《Cortex-M3權威指南》,這本書是著重描述此M3內核相關的東西。NVIC也在其中,因為它是內核中很重要的一部分。

本文引用地址:http://www.eepw.com.cn/article/201611/319099.htm

看了下這本書,對於NVIC描述的很詳細。我就直接截圖咯。

跟NVIC打交道的寄存器截圖說明。操作NVIC,這些寄存器都是需要掌握的,尤其是需要「掛號」的那四個寄存器。

關於中斷使能與禁能

這個的話Cortex-M3分別使用了兩個寄存器控制,一個負責使能與禁能,不像一些簡單的單片機一個BIT位就搞定這兩個功能,此功能帶來的好處就是安全了,不用害怕擔心自己的誤操作。因為此寄存器都是寫1有效,寫0無效。使能某寄存器則需向使能寄存器寫1,禁能需向禁能寄存器寫1。

下面的截圖說的是關於懸起與解懸寄存器

中斷優先級

每個外部中斷的優先級寄存器佔8位,但是允許最少只使用最高3位。STM32的話就是使用了最高4位。並且4個相鄰的優先級寄存器拼接成一個32位寄存器。中斷優先級又分為搶佔優先級和子優先級。STM32中,優先級寄存器中高四位中的高兩位說明搶佔優先級,低兩位說明子優先級。搶佔優先級的話就是能打斷低搶佔優先級的中斷,從而實現中斷嵌套。

下面也是截圖看看優先級有哪幾種分配情況。

下面的截圖說明優先級如何確定和嵌套規則。

關於那幾個需要掌握的與中斷寄存器,還有一個截圖:

下面的截圖關於中斷是如何建立的:

當然還有一些其它跟中斷相關的寄存器,不是很常用,就沒寫在這裡了。

那麼現在具體說說這個優先級配置函數,函數定義實現如下:

  1. /**
  2. *@briefConfigurestheprioritygrouping:pre-emptionpriorityandsubpriority.
  3. *@paramNVIC_PriorityGroup:specifiestheprioritygroupingbitslength.
  4. *Thisparametercanbeoneofthefollowingvalues:
  5. *@argNVIC_PriorityGroup_0:0bitsforpre-emptionpriority
  6. *4bitsforsubpriority
  7. *@argNVIC_PriorityGroup_1:1bitsforpre-emptionpriority
  8. *3bitsforsubpriority
  9. *@argNVIC_PriorityGroup_2:2bitsforpre-emptionpriority
  10. *2bitsforsubpriority
  11. *@argNVIC_PriorityGroup_3:3bitsforpre-emptionpriority
  12. *1bitsforsubpriority
  13. *@argNVIC_PriorityGroup_4:4bitsforpre-emptionpriority
  14. *0bitsforsubpriority
  15. *@retvalNone
  16. */
  17. voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
  18. {
  19. /*Checktheparameters*/
  20. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  21. /*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue*/
  22. SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;
  23. }

此函數在misc.c原文件中,函數只有兩句話。其中

  1. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

assert_param是定義的一個宏,用來檢測表達式的正確性。如果表達式正確則什麼也不做,繼續執行下面的語句。如果參數有錯,就會在當前行報錯。這裡主要檢測我們輸入的NVIC配置優先級是否有效。

[cpp]view plaincopy

print?

  1. /*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue*/
  2. SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;

這句話才是關鍵,實現了優先級的配置。其中AIRCR_VECTKEY_MASK相當於個鑰匙,用一個宏實現。在此源文件的開始處聲明,其值為:

  1. #defineAIRCR_VECTKEY_MASK((uint32_t)0x05FA0000)

因為NVIC是個很關鍵的寄存器,不能隨便配置,於是需要一個輸入標記才能進行正確配置,此標記就相當於一把鑰匙。其中NVIC_PriorityGroup值的選擇就是函數上方中那些宏,一共有5種情況。

  1. /**
  2. *@briefConfigurestheprioritygrouping:pre-emptionpriorityandsubpriority.
  3. *@paramNVIC_PriorityGroup:specifiestheprioritygroupingbitslength.
  4. *Thisparametercanbeoneofthefollowingvalues:
  5. *@argNVIC_PriorityGroup_0:0bitsforpre-emptionpriority
  6. *4bitsforsubpriority
  7. *@argNVIC_PriorityGroup_1:1bitsforpre-emptionpriority
  8. *3bitsforsubpriority
  9. *@argNVIC_PriorityGroup_2:2bitsforpre-emptionpriority
  10. *2bitsforsubpriority
  11. *@argNVIC_PriorityGroup_3:3bitsforpre-emptionpriority
  12. *1bitsforsubpriority
  13. *@argNVIC_PriorityGroup_4:4bitsforpre-emptionpriority
  14. *0bitsforsubpriority
  15. *@retvalNone
  16. */

另外發現現在有很多實時系統都是根據Cortex-M3內核量身訂造的,想必其強大的NVIC就是其中一個原因吧。

相關焦點

  • Arm技術文檔分享|Cortex-M 系列處理器Cortex-M3 DesignStart FPGA...
    ARM Cortex-M4 處理器是一個低能耗處理器,特點是門數低、中斷延遲短且調試成本低。Cortex-M4F 處理器與 Cortex-M4 具有相同的功能,且包括浮點運算功能。這些處理器專用於要求使用數位訊號處理功能的應用程式。ARM Cortex-M3 處理器是一個低能耗處理器,特點是門數低、中斷延遲短且調試成本低。
  • Cortex-M3 (NXP LPC1788)之外部中斷操作
    要使用LPC1788的外部中斷,要進行兩部分的操作。由於外部中斷的管腳採用I/O復用的形式,顯然我們首先要對管腳進行配置,使其工作在外部中斷輸入的模式。其次,我們需要配置中斷相關的寄存器包括中斷使能以及中斷的觸發方式等。 由於我們使用的是外部中斷0,查閱數據手冊,其GPIO管腳為P2_10,為此我們設置IOCON_P2_10寄存器的FUNC欄位,設置成001即為EINT0模式。 配置完引腳後,還需要繼續配置具體的中斷功能。
  • ARM7、ARM9、ARM11、ARM-Cortex系列的關係
    ARM7,ARM9,cortex-m3,cortex-m4,cortex-a8的區別arm系列從arm11開始,以後的就命名為cortex,並且性能上大幅度提升。從cortex開始,分為三個系列,a系列,r系列,m系列。m系列與arm7相似,不能跑作業系統(只能跑ucos2),偏向於控制方面,說白了就是一個高級的單片機。
  • STM32 (Cortex-M3) 中NVIC(嵌套向量中斷控制)的理解
    何為佔先式優先級(pre-emption priority)高佔先式優先級的中斷事件會打斷當前的主程序/中斷程序運行—搶斷式優先響應,俗稱中斷嵌套。2.何為副優先級(subpriority)在佔先式優先級相同的情況下,高副優先級的中斷優先被響應;在佔先式優先級相同的情況下,如果有低副優先級中斷正在執行, 高副優先級的中斷要等待已被響應的低副優先級中斷執行結束後才能得到響應—非搶斷式響應(不能嵌套)。3.
  • STM32 (CortexM3) 中NVIC(嵌套向量中斷控制)的理解
    何為佔先式優先級(pre-emption priority)    高佔先式優先級的中斷事件會打斷當前的主程序/中斷程序運行—搶斷式優先響應,俗稱中斷嵌套。2.何為副優先級(subpriority)    在佔先式優先級相同的情況下,高副優先級的中斷優先被響應;    在佔先式優先級相同的情況下,如果有低副優先級中斷正在執行, 高副優先級的中斷要等待已被響應的低副優先級中斷執行結束後才能得到響應—非搶斷式響應(不能嵌套)。3.
  • STM32中斷過程詳解
    1.因為cortex_m3 內核對於每一個外部中斷通道都有相應的控制字和控制位,用於單獨的和總的控制該中斷通道。它們包括有: 中斷優先級控制字:PRI_n(前面有提到過) 中斷允許設置位:在 ISER 寄存器中 中斷允許清除位:在 ICER 寄存器中 中斷懸掛 Pending(排隊等待)位置位:在 ISPR 寄存器中(類似於置中斷通道標誌位) 中斷懸掛 Pending(排隊等待)位清除:在 ICPR 寄存器中(用於清除中斷通道標誌位)
  • ARM Cortex-M3 MCU的I2C和DMA操作被中斷打斷的解決方法
    打開APP ARM Cortex-M3 MCU的I2C和DMA操作被中斷打斷的解決方法 工程師曾玲 發表於 2018-11-24 10:24:57
  • Cortex-M3簡介
    譚軍舉例說,在工控領域,用戶要求具有更快的中斷速度,Cortex-M3採用了Tail-Chaining中斷技術,完全基於硬體進行中斷處理,最多可減少12個時鐘周期數,在實際應用中可減少70% 中斷。概述單片機的另外一個特點是調試工具非常便宜,不象ARM的仿真器動輒幾千上萬。
  • STM32 的核心Cortex-M3 處理器
    簡言之,Cortex-M3 處理器擁有32 位CPU,並行總線結構,嵌套中斷向量控制單元,調試系統以及標準的存儲映射。嵌套中斷向量控制器(Nested Vector Interrupt Controller,簡稱NVIC)是Cortex-M3 處理器中一個比較關鍵的組件,它為基於Cortex-M3 的微控制器提供了標準的中斷架構和優秀的中斷響應能力,為超過240 個中斷源提供專門的中斷入口,而且可以賦予每個中斷源單獨的優先級。
  • ARM Cortex-M3 內核介紹
    3.NVIC是Cortex-M3處理器中一個完整的部分,它可以進行高度配置,為處理器提供出色的中斷處理能力。在NVIC的標準執行中,它提供了一個非屏蔽中斷(NMI)和32個通用物理中斷,這些中斷帶有8級的搶佔優先權。NVIC可以通過綜合選擇配置為1到240個物理中斷中的任何一個,並帶有多達256個優先級。
  • STM32(Cortex-M3)中的優先級理解
    具有高搶佔式優先級的中斷可以在具有低搶佔式優先級的中斷處理過程中被響應,即中斷嵌套,或者說高搶佔式優先級的中斷可以嵌套在低搶佔式優先級的中斷中。當兩個中斷源的搶佔式優先級相同時,這兩個中斷將沒有嵌套關係,當一個中斷到來後,如果正在處理另一個中斷,這個後到來的中斷就要等到前一個中斷處理完之後才能被處理。
  • 技術文章: 基於ARM Cortex-A9中斷詳解
    一般在系統中,中斷控制分為三個部分:「模塊、中斷控制器和處理器」。其中模塊通常由寄存器控制是否使能中斷和中斷觸發條件等;中斷控制器可以管理中斷的優先級等,而處理器則由寄存器設置用來響應中斷。分發器功能分發器的主要的作用是檢測各個中斷源的狀態,控制各個中斷源的行為,分發各個中斷源產生的中斷事件到指定的一個或者多個CPU接口上。雖然分發器可以管理多個中斷源,但是它總是把優先級最高的那個中斷請求送往CPU接口。分發器對中斷的控制包括:(a)中斷使能或禁能控制。
  • 基於Cortex M3的音頻播放器的設計
    2)處理器支持中斷,並且能產生定時中斷(通常在10~100 Hz之間)。3)用C語言就可以開關中斷。4)處理器支持能夠容納一定量數據(可能是幾千字節)的硬體堆棧。5)處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆棧或內存中的指令。
  • 基於Cortex―M3的自動氣象站設計
    風速採集模塊使用FY-FS風杯式風速傳感器,風吹動風杯轉動會把風速信號轉化為脈衝信號輸出,STM32使用外部中斷和定時中斷來捕獲脈衝頻率並通過計算得到實時風速值。處理完成的數據存儲在SD卡中,SD卡是一種存儲容量為1 G的FLASH產品,與STM32通過SPI協議通訊。
  • Cortex-M3學習日誌(六)-- ADC實驗
    透過並列埠接口或是微處理機連接A/D轉換器時,必須了解如何去控制或是驅動這顆A/D轉換器的問題。因此需要了解到A/D轉換器上的控制信號有哪些。4、A/D中斷使能寄存器ADINTEN,如果使用轉換完中斷時,需要配置此寄存器,它包含的使能位控制每一個A/D通道的DONE標記是否用來產生中斷。5、A/D通道n數據寄存器ADDRn,共有8個,它包含在通道n上完成的最近一次轉換結果。
  • Cortex-M3掃盲
    A: CM3是新生代32位處理器內核,如果非要了解CM3的每根毛孔不可,肯定是要學習很多內容的。但是,如果有單片機基礎和C語言基礎,只需了解很少很表面的東西,就可以開始做實驗和開發項目了。動手是極其重要的。當年超女敢唱就會紅,這裡也一樣,敢玩就會玩!其它問題,可以「邊幹邊學」——連Linux都可以《邊幹邊學》。
  • CORTEX-M3與STM32_M3內核STM32的三相多功能電能表解決方案
    Cortex-M3包含嵌套向量中斷控制器NVIC,中斷響應速度最快僅6周期,內部集成總線矩陣,支持DMA操作及位映射。 由STM32的GPIO控制AD73360的SE和RESET,並用一個外部中斷輸入腳來監聽幀同步信號,這樣才可以用程序來保證數據幀內容的字節對應關係。
  • Cortex-M3處理器出眾的控制和連通性
    眾所周知,Arm Cortex-M3處理器是一個低能耗處理器,特點是門數低、中斷延遲短且調試成本低
  • 採用ARM Cortex-M3單片機和DSP的逆變電源設計
    設計中要求人機互動模塊能處理複雜的任務調度和很強的突發訪問(中斷)處理,這就必須有較高運行速度;模塊內部還要有豐富的擴展接口提供IPS與外部即時通信;具備優越的總線控制和訪問機制等。綜合考慮上述需求,設計中選擇了意法半導體(ST)公司推出的最新32位單片機STM32F103ZET6(以下簡稱ST M32)。
  • Cortex-M3 (NXP LPC1788)之IIC控制器
    如果起始條件得到總線應答,中斷標誌SI會置位,通讀取I2C狀態寄存器I2STAT的值,如果為0x08表示可以進入發送數據的操作。 2,第一個發送的字節包含接收設備的從機地址和數據方向位。方向位(R/W)設置成0,表示進行些操作,將該字節寫入I2C數據寄存器I2CDAT進行發送。