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