新聞中心

        了解Cortex-M3的中斷

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        在第一個(gè)函數(shù)SystemInit()的下一行,會(huì)有常見(jiàn)的另一個(gè)函數(shù)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X代表數(shù)字1,2,3...)。此函數(shù)跟中斷配置相關(guān),配置中斷優(yōu)先級(jí),包括搶占優(yōu)先級(jí)與子優(yōu)先級(jí)。

        關(guān)于NVIC(中斷向量控制器)的介紹STM32參考手冊(cè)中是找不到的。需要看《Cortex-M3權(quán)威指南》,這本書(shū)是著重描述此M3內(nèi)核相關(guān)的東西。NVIC也在其中,因?yàn)樗莾?nèi)核中很重要的一部分。

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

        看了下這本書(shū),對(duì)于NVIC描述的很詳細(xì)。我就直接截圖咯。

        跟NVIC打交道的寄存器截圖說(shuō)明。操作NVIC,這些寄存器都是需要掌握的,尤其是需要“掛號(hào)”的那四個(gè)寄存器。

        關(guān)于中斷使能與禁能

        這個(gè)的話Cortex-M3分別使用了兩個(gè)寄存器控制,一個(gè)負(fù)責(zé)使能與禁能,不像一些簡(jiǎn)單的單片機(jī)一個(gè)BIT位就搞定這兩個(gè)功能,此功能帶來(lái)的好處就是安全了,不用害怕?lián)淖约旱恼`操作。因?yàn)榇思拇嫫鞫际菍?xiě)1有效,寫(xiě)0無(wú)效。使能某寄存器則需向使能寄存器寫(xiě)1,禁能需向禁能寄存器寫(xiě)1。

        下面的截圖說(shuō)的是關(guān)于懸起與解懸寄存器

        中斷優(yōu)先級(jí)

        每個(gè)外部中斷的優(yōu)先級(jí)寄存器占8位,但是允許最少只使用最高3位。STM32的話就是使用了最高4位。并且4個(gè)相鄰的優(yōu)先級(jí)寄存器拼接成一個(gè)32位寄存器。中斷優(yōu)先級(jí)又分為搶占優(yōu)先級(jí)和子優(yōu)先級(jí)。STM32中,優(yōu)先級(jí)寄存器中高四位中的高兩位說(shuō)明搶占優(yōu)先級(jí),低兩位說(shuō)明子優(yōu)先級(jí)。搶占優(yōu)先級(jí)的話就是能打斷低搶占優(yōu)先級(jí)的中斷,從而實(shí)現(xiàn)中斷嵌套。

        下面也是截圖看看優(yōu)先級(jí)有哪幾種分配情況。

        下面的截圖說(shuō)明優(yōu)先級(jí)如何確定和嵌套規(guī)則。

        關(guān)于那幾個(gè)需要掌握的與中斷寄存器,還有一個(gè)截圖:

        下面的截圖關(guān)于中斷是如何建立的:

        當(dāng)然還有一些其它跟中斷相關(guān)的寄存器,不是很常用,就沒(méi)寫(xiě)在這里了。

        那么現(xiàn)在具體說(shuō)說(shuō)這個(gè)優(yōu)先級(jí)配置函數(shù),函數(shù)定義實(shí)現(xiàn)如下:

        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. }

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

        1. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

        assert_param是定義的一個(gè)宏,用來(lái)檢測(cè)表達(dá)式的正確性。如果表達(dá)式正確則什么也不做,繼續(xù)執(zhí)行下面的語(yǔ)句。如果參數(shù)有錯(cuò),就會(huì)在當(dāng)前行報(bào)錯(cuò)。這里主要檢測(cè)我們輸入的NVIC配置優(yōu)先級(jí)是否有效。

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

        這句話才是關(guān)鍵,實(shí)現(xiàn)了優(yōu)先級(jí)的配置。其中AIRCR_VECTKEY_MASK相當(dāng)于個(gè)鑰匙,用一個(gè)宏實(shí)現(xiàn)。在此源文件的開(kāi)始處聲明,其值為:

        1. #defineAIRCR_VECTKEY_MASK((uint32_t)0x05FA0000)

        因?yàn)镹VIC是個(gè)很關(guān)鍵的寄存器,不能隨便配置,于是需要一個(gè)輸入標(biāo)記才能進(jìn)行正確配置,此標(biāo)記就相當(dāng)于一把鑰匙。其中NVIC_PriorityGroup值的選擇就是函數(shù)上方中那些宏,一共有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. */

        另外發(fā)現(xiàn)現(xiàn)在有很多實(shí)時(shí)系統(tǒng)都是根據(jù)Cortex-M3內(nèi)核量身訂造的,想必其強(qiáng)大的NVIC就是其中一個(gè)原因吧。


        關(guān)鍵詞: Cortex-M3中

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 兴宁市| 兰考县| 本溪市| 丰顺县| 德州市| 页游| 蓝山县| 长子县| 青田县| 晋州市| 无为县| 保亭| 襄垣县| 如东县| 东山县| 卢氏县| 通江县| 昭平县| 松滋市| 南康市| 洞头县| 中牟县| 新野县| 南漳县| 建瓯市| 香港| 大渡口区| 湘阴县| 嘉荫县| 卓尼县| 子长县| 塔河县| 莎车县| 新丰县| 视频| 岳西县| 会理县| 迁西县| 武城县| 米林县| 庐江县|