1.LPC82x (Cortex-M0+ CPU)的中断系统概述
1.1 M0+内部集成了中断系统的核心功能:
- 管理中断的进入、退出、嵌套,与优先级制度;自动保存与恢复现场
- 这一切都是全自动的,软件看不见——也就是说不用写汇编代码!
1.2 M0+自带了一个嵌套中断控制器,简称NVIC,支持32路中断输入
- 提供开关控制
- 反映和控制待决标志
- 设置优先级
- 反映ISR是否已进入
- 如果发生嵌套,可以出现两个以上中断的ISR已进入的情况
1.3 除了来自NVIC的中断,M0+自身还定义了其它的特殊中断类型
- 不可屏蔽中断(NMI), 硬故障(Hard_Fault), 系统服务(SVCall, PendSV),系统节拍定时器(SysTick)
2.中断编号
2.1 M0+ CPU为每个中断都分配了唯一识别号
- 你可以把它当作是中断源的身份证号
2.2 中断号非常重要,它是识别和响应中断的凭据
- 中断号用于寻找ISR的入口地址
- M0+内核以变换后的中断号记录当前的中断
- NVIC就是以中断号管理各路中断源的
2.3 在NVIC的API函数中也是以中断号作为参数
- 这个和我们写程序时关系最密切了
- 在cmsis.h中的”IRQn_Type”定义了LPC8xx的中断编号分配
- NVIC管理的中断从0号开始
- M0+直接管理的特殊中断,中断号为负
3.中断开关控制示意图
4.在LPC8xx上使用中断
5.LPC8xx的CPU内核(M0+)支持的其它中断
除了来自NVIC的中断,M0+还支持其它的特殊中断类型,用于任何以M0+为内核的MCU:
- NMI: 不可屏蔽中断。LPC8xx可以任选一个中断源连接到NMI
- 常用的是把看门狗中断或者欠压警告中断连接到NMI,它们的后果很严重。
- Hard_fault: 软件或总线错误导致程序不能执行下去时,就会产生hardfault(硬故障),并且走中断响应的流程进入Hard_Fault中断
- 例如,软件存取了一个不存在的地址,或者地址没有对齐
- 又如,CPU读取到的指令译码失败(如果M3的bin文件烧到了M0的器件上)
- SVCall和PendSV: 给操作系统选用的系统服务中断(咱们一般不用)
- 在严格划分特权级别以保护系统的RTOS上可能会用到SVCall
- PendSV专用于上下文切换
- SysTick: 这是M0+自带的一个简单的节拍定时器所对应的中断源。
- 在一般情况下可以作为系统的时基,有超低功耗要求时不能用。
6.中断向量表
6.1 M0+要求程序在CPU看到的0地址存储一张表,称为“中断向量表”
- 每个表目存储一个ISR的入口地址(有些位置没有用到)
- 每个中断源在表中有自己的位置
- NVIC管理的中断,就是中断号+16
- M0+自己管理的中断,另有编号机制
- 0号表目有些特殊,它存储复位后的栈指针,会被装载到SP寄存器
- 默认的中断向量表存储在启动代码中
6.2 LPC8xx提供“0地址重映射”功能,把0地址开始的512字节范围映射到Flash, RAM, 或者Boot ROM
- 用户程序执行时默认把Flash映射到0.
- 用户程序可以今后再手工把向量表放到Flash或RAM
- 映射成RAM后,Flash的前512字节内容无法被访问到!
6.3 启动后,M0+允许把向量表放到别处 (NVIC的VTOR寄存器)
7.LPC82x启动文件(keil_startup_lpc82x.s)中的中断向量表
前16个是M0+内核自己管理的特殊向量,有两个比较特殊:
- 0号:栈指针初值
- 1号:复位后第1条指令的地址
- 7号: 是前面7个向量之和的checksum补码由开发工具自动计算
后面32个是NVIC管理的最多32路中断未用到的填0
阅读全文