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