每一個(gè)外部中斷都有一個(gè)對(duì)應(yīng)的優(yōu)先級(jí)寄存器,Cortex-M0中NVIC-IPR共有8個(gè)寄存器,而每個(gè)寄存器管理4個(gè)IRQ中斷,所以M0的IRQ中斷源最多只支持32個(gè),再加上16個(gè)內(nèi)核中斷,也就是說M0最多48個(gè)中斷源。
Cortex-M0采用Armv6-M架構(gòu),優(yōu)先級(jí)寄存器配置位有8位,但是有效位只有最高2位,這個(gè)地方很多人使用了Cortex-M3后一直也認(rèn)為Cortex-M0也是最高3或4位有效位,在arm官方資料中有對(duì)比兩個(gè)版本的差別。因此Cortex-M0可編程優(yōu)先級(jí)有4個(gè),加上3個(gè)固定的優(yōu)先級(jí)(復(fù)位、NMI、HardFault),Cortex-M0總共有7個(gè)中斷優(yōu)先級(jí)。
Cortex-M0內(nèi)核的中斷優(yōu)先級(jí)寄存器是以最高位(MSB)對(duì)齊的,并且只支持字傳輸,每次訪問都會(huì)同時(shí)涉及4個(gè)中斷優(yōu)先級(jí)寄存器。見下圖:
因?yàn)锽it0 - Bit5沒有使用,所以如果沒有進(jìn)行寫操作讀出都為0。
由于不同的 Cortex-M 系列,其中斷優(yōu)先級(jí)是不一樣的,所以在 CMSIS 庫中的頭文件中可以查看優(yōu)先級(jí)的數(shù)量 \_\_NVIC\_PRIO\_BITS。
中斷優(yōu)先級(jí)寄存器的編程應(yīng)該在中斷使能之前,其通常是在程序開始時(shí)完成的。arm官方資料提示應(yīng)該避免在中斷使能之后改變中斷優(yōu)先級(jí),因?yàn)檫@種情況的結(jié)果在ARMv6-M系統(tǒng)結(jié)構(gòu)是不可預(yù)知的,并且不被Cortex-M0處理器支持。Cortex-M3/M4處理器的情況又有所不同,他們都支持中斷優(yōu)先級(jí)的動(dòng)態(tài)切換。Cortex-M3處理器和Cortex-M0處理器的另外一個(gè)區(qū)別是,Cortex-M3訪問中斷優(yōu)先級(jí)寄存器時(shí)支持字節(jié)或半字傳輸,因此可以每次只設(shè)置一個(gè)寄存器。如果需要改變優(yōu)先級(jí),程序中需要關(guān)閉中斷后再重新設(shè)置中斷優(yōu)先級(jí)寄存器。
在 Cortex-M內(nèi)核中,一個(gè)中斷的優(yōu)先級(jí)數(shù)值越低,邏輯優(yōu)先級(jí)卻越高。比如,中斷優(yōu)先級(jí)為2的中斷可以搶占中斷優(yōu)先級(jí)為3的中斷,但反過來就不行。換句話說,中斷優(yōu)先級(jí)2比中斷優(yōu)先級(jí)3的優(yōu)先級(jí)更高。
Cortex-M0處理器對(duì)中斷嵌套的支持無需任何軟件干預(yù),如果MCU已經(jīng)在運(yùn)行一個(gè)中斷,而有了新的更高優(yōu)先級(jí)的中斷請(qǐng)求,正在運(yùn)行的中斷將會(huì)被暫停,轉(zhuǎn)而執(zhí)行更高優(yōu)先級(jí)的中斷,高優(yōu)先級(jí)中斷執(zhí)行完成后又回到原來的低優(yōu)先級(jí)中斷。如果出現(xiàn)兩個(gè)同一優(yōu)先級(jí)的中斷,則是判斷誰開始發(fā)起中斷請(qǐng)求,MCU會(huì)先執(zhí)行同一優(yōu)先級(jí)中首先發(fā)起請(qǐng)求的中斷。
MM32F0130系列中斷向量表:
typedefenumIRQn{ NonMaskableInt_IRQn=-14,///2?Non?Maskable?Interrupt ????HardFault_IRQn??????????????????=?-13,??????????????????????????????????///3?Cortex-M0?Hard?Fault?Interrupt ????MemoryManagement_IRQn???????????=?-12,??????????????????????????????????///4?Cortex-M0?Memory?Management?Interrupt ????BusFault_IRQn???????????????????=?-11,??????????????????????????????????///5?Cortex-M0?Bus?Fault?Interrupt ????UsageFault_IRQn?????????????????=?-10,??????????????????????????????????///6?Cortex-M0?Usage?Fault?Interrupt ????SVC_IRQn????????????????????????=?-5,???????????????????????????????????///11?Cortex-M0?SV?Call?Interrupt ????DebugMonitor_IRQn???????????????=?-4,???????????????????????????????????///12?Cortex-M0?Debug?Monitor?Interrupt ????PendSV_IRQn?????????????????????=?-2,???????????????????????????????????///14?Cortex-M0?Pend?SV?Interrupt ????SysTick_IRQn????????????????????=?-1,???????????????????????????????????///15?Cortex-M0?System?Tick?Interrupt ????WWDG_IWDG_IRQn??????????????????=?0,????????????????????????????????????///
設(shè)置中斷優(yōu)先級(jí)的流程:先讀一個(gè)字,再修改對(duì)應(yīng)字節(jié),最后整個(gè)字寫回。
1.1 C代碼
void__NVIC_SetPriority() { unsignedlongtemp;//定義一個(gè)臨時(shí)變量 temp=*(volatileunsignedlong)(0xE000E400);//讀取IRP0值 temp&=(0xFF00FFFF|(0xC0<16));????????????//修改中斷#2優(yōu)先級(jí)為0xC0 ????*(volatile?unsigned?long)(0xE000E400)?=?temp;?//設(shè)置IPR0 }
1.2 匯編代碼
在程序中可以一次設(shè)置多個(gè)中斷優(yōu)先級(jí)。
void__NVIC_SetPriority() { LDRR0,=0xE000E100;//設(shè)置使能中斷寄存器地址 MOVSR1,#0x4;//中斷#2 STRR1,[R0];//使能#2中斷 LDRR0,=0xE000E200;//設(shè)置掛起中斷寄存器地址 MOVSR1,#0x4;//中斷#2 STRR1,[R0];//掛起#2中斷 LDRR0,=0xE000E280;//設(shè)置清除中斷掛起寄存器地址 MOVSR1,#0x4;//中斷#2 STRR1,[R0];//清除#2的掛起狀態(tài) }
1.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)
//設(shè)置中斷優(yōu)先級(jí) __STATIC_INLINEvoid__NVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority) { if((int32_t)(IRQn)>=0){ NVIC->IP[_IP_IDX(IRQn)]=((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]&~(0xFFUL<SHP[_SHP_IDX(IRQn)]=((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)]&~(0xFFUL<
這里的參數(shù)IRQn為中斷ID號(hào),可以為負(fù),也可以為正。當(dāng)IRQn為負(fù)時(shí),設(shè)置系統(tǒng)異常的優(yōu)先級(jí),當(dāng)IRQn大于等于0時(shí),設(shè)置外設(shè)中斷優(yōu)先級(jí),芯片廠商會(huì)提供中斷向量表IRQn\_Type,應(yīng)用層只需要調(diào)用即可;priority是0、1、2、3,函數(shù)內(nèi)部會(huì)自動(dòng)移位到對(duì)應(yīng)的優(yōu)先級(jí)最高2位。
方法一: voidNVIC_SetPriority(TIM1_CC_IRQn,3);//設(shè)置#14中斷的優(yōu)先級(jí)為0xC0 方法二: voidNVIC_Config(void) {NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority=3; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); }
設(shè)置好中斷優(yōu)先級(jí)后,用戶還可以讀取當(dāng)前已經(jīng)設(shè)置的中斷優(yōu)先級(jí)。
審核編輯 :李倩
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121198 -
Cortex-M0
+關(guān)注
關(guān)注
4文章
124瀏覽量
38809
原文標(biāo)題:技術(shù)分享 | Cortex-M0中斷控制和系統(tǒng)控制(二)
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
讓ADS7864的BUSY腳接DSP的外部中斷INT0,DSP通過中斷來讀取采樣數(shù)據(jù),要不要先關(guān)INT0中斷呢?
TMS320x280x、2801x、2804x DSP系統(tǒng)控制和中斷參考指南
![TMS320x280x、2801x、2804x DSP<b class='flag-5'>系統(tǒng)控制</b>和<b class='flag-5'>中斷</b>參考指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
供應(yīng)SW2335 高集成度的快充協(xié)議控制器IC
使用功率控制器件的汽車防抱死制動(dòng)系統(tǒng)控制
![使用功率<b class='flag-5'>控制</b>器件的汽車防抱死制動(dòng)<b class='flag-5'>系統(tǒng)控制</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
M0L 或 M0G:如何為您的應(yīng)用選擇合適的 MSP 微控制器
![<b class='flag-5'>M0</b>L 或 <b class='flag-5'>M0</b>G:如何為您的應(yīng)用選擇合適的 MSP 微<b class='flag-5'>控制</b>器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
LM10000 AVS系統(tǒng)控制器數(shù)據(jù)表
![LM10000 AVS<b class='flag-5'>系統(tǒng)控制</b>器數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
請(qǐng)問stm32的cortex-m0怎么樣?
中微半導(dǎo)體推出CMS32M67電機(jī)控制系列微控制器
普冉半導(dǎo)體推出一款基于32位ARM Cortex-M0+內(nèi)核的微控制器
![普冉半導(dǎo)體推出一款基于32位ARM <b class='flag-5'>Cortex-M0</b>+內(nèi)核的微<b class='flag-5'>控制</b>器](https://file1.elecfans.com/web2/M00/DE/7E/wKgZomYwZNyAEXewAAA7HoiZgmU490.png)
求助,關(guān)于cortex-M3的壓棧問題求解
瑞薩推出基于Arm Cortex-M23處理器的RA0微控制器(MCU)系列
![瑞薩推出基于Arm <b class='flag-5'>Cortex-M</b>23處理器的RA<b class='flag-5'>0</b>微<b class='flag-5'>控制</b>器(MCU)系列](https://file1.elecfans.com/web2/M00/C8/66/wKgZomYbO9iALVcsAAAU9ePae20587.jpg)
瑞薩電子推出基于Arm? Cortex?-M23處理器的RA0微控制器(MCU)
![瑞薩電子推出基于Arm? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>23處理器的RA<b class='flag-5'>0</b>微<b class='flag-5'>控制</b>器(MCU)](https://file1.elecfans.com//web2/M00/C7/CD/wKgZomYWXUWARxOiAAFapPtRMhA776.jpg)
中微半導(dǎo)推出基于Arm Cortex-M0的CMS32M67電機(jī)控制系列微控制器
![<b class='flag-5'>中</b>微半導(dǎo)推出基于Arm <b class='flag-5'>Cortex-M0</b>的CMS32<b class='flag-5'>M</b>67電機(jī)<b class='flag-5'>控制</b>系列微<b class='flag-5'>控制</b>器](https://file1.elecfans.com/web2/M00/C8/40/wKgaomYTUyWAH6k_AAAsvVVPz5g837.png)
東芝推出適用于電機(jī)控制的Arm Cortex-M4微控制器
Cortex-M0+內(nèi)核介紹
![<b class='flag-5'>Cortex-M0</b>+內(nèi)核介紹](https://file1.elecfans.com/web2/M00/C5/E0/wKgZomYDcjOAPZnbAAA9-SMYgCY289.png)
評(píng)論