• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 了解Cortex-M3的中斷

    了解Cortex-M3的中斷

    作者: 時間:2016-11-21 來源:網絡 收藏
    在第一個函數SystemInit()的下一行,會有常見的另一個函數NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X代表數字1,2,3...)。此函數跟中斷配置相關,配置中斷優先級,包括搶占優先級與子優先級。

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

    本文引用地址:http://www.czjhyjcfj.com/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就是其中一個原因吧。


    關鍵詞: Cortex-M3中

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 黔南| 宜宾县| 蓝田县| 东乡县| 西青区| 辛集市| 同心县| 宁波市| 宝鸡市| 固原市| 彭水| 荣成市| 巫山县| 淳安县| 弥渡县| 杭锦后旗| 叙永县| 岚皋县| 鄂伦春自治旗| 永宁县| 克山县| 怀集县| 博罗县| 沂南县| 福清市| 蛟河市| 沾化县| 白城市| 凯里市| 阿克苏市| 宿州市| 怀安县| 淅川县| 汪清县| 西安市| 陈巴尔虎旗| 贡觉县| 清涧县| 民和| 灵台县| 中方县|