NVIC: Nested vectored interrupt controller, 嵌套中斷向量控制器.
中斷與異常:
所有能打斷正常執(zhí)行流的事件都稱為異常. 異常與中斷的區(qū)別在于, 中斷請(qǐng)求是來(lái)自于Cortex內(nèi)核外部, 比如各種片上外設(shè), 外部中斷請(qǐng)求等, 它們對(duì)于內(nèi)核是”異步”的; 而異常則是由于Cortex內(nèi)核在執(zhí)行指令或者訪問(wèn)存儲(chǔ)等操作時(shí)所產(chǎn)生的, 對(duì)于Cortex內(nèi)核來(lái)說(shuō)是屬于”同步”的(可以參見(jiàn)Cortex M3權(quán)威指南), 異常和中斷一般可以不加區(qū)分的使用.
Cortex內(nèi)核可以支持多達(dá)240個(gè)外部中斷, 編號(hào)16 – 255. 編號(hào)1 – 15的為系統(tǒng)異常, 編號(hào)0未被使用.
Cortex支行中斷嵌套, 允許高優(yōu)先級(jí)的中斷搶占低優(yōu)先級(jí)的中斷. Cortex M3/M4可支行多達(dá)256級(jí)的可編程優(yōu)先級(jí)和128級(jí)的搶占, 但有3個(gè)系統(tǒng)異常優(yōu)先級(jí)固定, 并且優(yōu)先級(jí)為負(fù)數(shù), 高于其它任何異常, 這三個(gè)異常分依次為 復(fù)位, NMI, Hard Fault.
NMI是Non-Maskable Interrupt(不可屏蔽中斷)縮寫(xiě), 在STM32F4中, NMI被連接到時(shí)鐘安全系統(tǒng)CCS(Clock security system)異常上.
Hard Fault是總線fault, 存儲(chǔ)管理fault, 用法fault所產(chǎn)生的結(jié)果, 詳細(xì)信息可以參考Cortex M3權(quán)威指南).
優(yōu)先級(jí)寄存器
如上所述, Cortex M3/M4支行多達(dá)256級(jí)的可編程優(yōu)先級(jí)和128級(jí)搶占, 每個(gè)中斷使用一個(gè)8位的寄存來(lái)配置優(yōu)先級(jí). 但實(shí)際一款芯片會(huì)根據(jù)情況做適當(dāng)?shù)木?jiǎn), 裁剪掉表達(dá)優(yōu)先級(jí)的幾個(gè)低端有效位, 以減少優(yōu)先級(jí)的級(jí)數(shù).但是不管使用多少位來(lái)表達(dá)優(yōu)先級(jí), 都是以MSB對(duì)齊的, 這主要是為了避免程序在不同器件之間移植時(shí)不會(huì)出現(xiàn)優(yōu)先級(jí)順序的更改.
搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)
響應(yīng)優(yōu)先級(jí)也叫做 亞優(yōu)先級(jí) 或者 子優(yōu)先級(jí), 每一個(gè)中斷都有這兩種優(yōu)先級(jí)屬性. 當(dāng)一個(gè)低優(yōu)先級(jí)的中斷正在執(zhí)行時(shí), 如果有更高優(yōu)先級(jí)的中斷請(qǐng)求, 系統(tǒng)將會(huì)響應(yīng)這個(gè)中斷, 即發(fā)生中斷嵌套.
如果兩個(gè)中斷的優(yōu)先級(jí)相同, 則后來(lái)的中斷要等到先來(lái)的中斷執(zhí)行完畢后才會(huì)被響應(yīng). 但是如果兩個(gè)中斷同時(shí)到達(dá)(或者都在掛起狀態(tài)), NVIC會(huì)根據(jù)它們響應(yīng)優(yōu)先級(jí)的高低來(lái)決定響應(yīng)那一個(gè).
如果它的的響應(yīng)優(yōu)先級(jí)也相同, 那么NVIC會(huì)根據(jù)它們?cè)谥袛嘞蛄勘碇械呐判蛳群髞?lái)決定先響應(yīng)那一個(gè).
在STM32中使用了4bit來(lái)表達(dá)搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí), 有以下5種分組方式:
可見(jiàn)STM32一共提供了16級(jí)中斷優(yōu)先級(jí).