1.LPC82x (Cortex-M0+ CPU)的中斷系統(tǒng)概述
1.1 M0+內(nèi)部集成了中斷系統(tǒng)的核心功能:
- 管理中斷的進(jìn)入、退出、嵌套,與優(yōu)先級制度;自動保存與恢復(fù)現(xiàn)場
- 這一切都是全自動的,軟件看不見——也就是說不用寫匯編代碼!
1.2 M0+自帶了一個嵌套中斷控制器,簡稱NVIC,支持32路中斷輸入
- 提供開關(guān)控制
- 反映和控制待決標(biāo)志
- 設(shè)置優(yōu)先級
- 反映ISR是否已進(jìn)入
- 如果發(fā)生嵌套,可以出現(xiàn)兩個以上中斷的ISR已進(jìn)入的情況
1.3 除了來自NVIC的中斷,M0+自身還定義了其它的特殊中斷類型
- 不可屏蔽中斷(NMI), 硬故障(Hard_Fault), 系統(tǒng)服務(wù)(SVCall, PendSV),系統(tǒng)節(jié)拍定時器(SysTick)
2.中斷編號
2.1 M0+ CPU為每個中斷都分配了唯一識別號
- 你可以把它當(dāng)作是中斷源的身份證號
2.2 中斷號非常重要,它是識別和響應(yīng)中斷的憑據(jù)
- 中斷號用于尋找ISR的入口地址
- M0+內(nèi)核以變換后的中斷號記錄當(dāng)前的中斷
- NVIC就是以中斷號管理各路中斷源的
2.3 在NVIC的API函數(shù)中也是以中斷號作為參數(shù)
- 這個和我們寫程序時關(guān)系最密切了
- 在cmsis.h中的”IRQn_Type”定義了LPC8xx的中斷編號分配
- NVIC管理的中斷從0號開始
- M0+直接管理的特殊中斷,中斷號為負(fù)
3.中斷開關(guān)控制示意圖
4.在LPC8xx上使用中斷
5.LPC8xx的CPU內(nèi)核(M0+)支持的其它中斷
除了來自NVIC的中斷,M0+還支持其它的特殊中斷類型,用于任何以M0+為內(nèi)核的MCU:
- NMI: 不可屏蔽中斷。LPC8xx可以任選一個中斷源連接到NMI
- 常用的是把看門狗中斷或者欠壓警告中斷連接到NMI,它們的后果很嚴(yán)重。
- Hard_fault: 軟件或總線錯誤導(dǎo)致程序不能執(zhí)行下去時,就會產(chǎn)生hardfault(硬故障),并且走中斷響應(yīng)的流程進(jìn)入Hard_Fault中斷
- 例如,軟件存取了一個不存在的地址,或者地址沒有對齊
- 又如,CPU讀取到的指令譯碼失敗(如果M3的bin文件燒到了M0的器件上)
- SVCall和PendSV: 給操作系統(tǒng)選用的系統(tǒng)服務(wù)中斷(咱們一般不用)
- 在嚴(yán)格劃分特權(quán)級別以保護(hù)系統(tǒng)的RTOS上可能會用到SVCall
- PendSV專用于上下文切換
- SysTick: 這是M0+自帶的一個簡單的節(jié)拍定時器所對應(yīng)的中斷源。
- 在一般情況下可以作為系統(tǒng)的時基,有超低功耗要求時不能用。
6.中斷向量表
6.1 M0+要求程序在CPU看到的0地址存儲一張表,稱為“中斷向量表”
- 每個表目存儲一個ISR的入口地址(有些位置沒有用到)
- 每個中斷源在表中有自己的位置
- NVIC管理的中斷,就是中斷號+16
- M0+自己管理的中斷,另有編號機(jī)制
- 0號表目有些特殊,它存儲復(fù)位后的棧指針,會被裝載到SP寄存器
- 默認(rèn)的中斷向量表存儲在啟動代碼中
6.2 LPC8xx提供“0地址重映射”功能,把0地址開始的512字節(jié)范圍映射到Flash, RAM, 或者Boot ROM
- 用戶程序執(zhí)行時默認(rèn)把Flash映射到0.
- 用戶程序可以今后再手工把向量表放到Flash或RAM
- 映射成RAM后,F(xiàn)lash的前512字節(jié)內(nèi)容無法被訪問到!
6.3 啟動后,M0+允許把向量表放到別處 (NVIC的VTOR寄存器)
7.LPC82x啟動文件(keil_startup_lpc82x.s)中的中斷向量表
前16個是M0+內(nèi)核自己管理的特殊向量,有兩個比較特殊:
- 0號:棧指針初值
- 1號:復(fù)位后第1條指令的地址
- 7號: 是前面7個向量之和的checksum補(bǔ)碼由開發(fā)工具自動計算
后面32個是NVIC管理的最多32路中斷未用到的填0
閱讀全文