• 正文
    • 1.LPC82x (Cortex-M0+ CPU)的中斷系統(tǒng)概述
    • 2.中斷編號(hào)
    • 3.中斷開關(guān)控制示意圖
    • 4.在LPC8xx上使用中斷
    • 5.LPC8xx的CPU內(nèi)核(M0+)支持的其它中斷
    • 6.中斷向量表
    • 7.LPC82x啟動(dòng)文件(keil_startup_lpc82x.s)中的中斷向量表
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LPC82X 的中斷系統(tǒng)概述

02/10 17:06
498
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

相關(guān)推薦

電子產(chǎn)業(yè)圖譜