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
							阅读全文
							
						
					
								
								
								
594