CortexM3处理器中,NVIC的存在不仅方便了低延时异常和中断的处理,而且还实现了电源管理和系统的寄存器。
NVIC 支持240 个优先级可动态配置的中断,每个中断的优先级有256 个选择。低延迟的中断处理可以通过紧耦合的NVIC 和处理器内核接口来实现,让新进的中断可以得到有效的处理。NVI 通过时刻关注压栈(嵌套)中断来实现中断的末尾连锁(tail-chaining)。
用户只能在特权模式下完全访问 NVIC,但是如果使能了配置控制寄存器,就可以在用户模式下挂起(pend)中断。其他用户模式的访问会导致总线故障。一般情况下,NVIC的所有寄存器都可采用字节,半字和字方式进行访问。
不管处理器存储字节的顺序如何,所有 NVIC 寄存器和系统调试寄存器都是采用小端(little endian)字节排列顺序,即低位字节存储在低地址。
NVIC控制器除了实现异常处理还实现了一些系统控制功能。NVIC寄存器空间分成以下几部分:
● 0xE000E000 - 0xE000E00F. 中断类型寄存器;
● 0xE000E010 - 0xE000E0FF. 系统定时器;
● 0xE000E100 - 0xE000ECFF. NVIC;
● 0xE000ED00 - 0xE000ED8F. 系统控制模块,包括CPUID,系统控制、配置和状态,故障报告;
● 0xE000EF00 - 0xE000EF0F. 软件触发异常寄存器;
● 0xE000EFD0 - 0xE000EFFF. ID 空间。
表2.15列出了NVIC寄存器。
表2.15 NVIC寄存器
名称 | 类型 | 地址 | 复位值 |
中断控制类型寄存器 | 只读 | 0xE000E004 |
|
系统时钟节拍(SysTick)控制与状态寄存器 | 读/写 | 0xE000E010 | 0x00000000 |
系统时钟节拍(SysTick)重装值寄存器 | 读/写 | 0xE000E014 | 不可预测 |
系统时钟节拍(SysTick)当前值寄存器 | 读/写清除 | 0xE000E018 | 不可预测 |
系统时钟节拍(SysTick)校准值寄存器 | 只读 | 0xE000E01C | STCALIB |
Irq0~31 使能设置寄存器 | 读/写 | 0xE000E100 | 0x00000000 |
Irq224~239 使能设置寄存器 | 读/写 | 0xE000E11C | 0x00000000 |
Irq0~31 使能清除寄存器 | 读/写 | 0xE000E180 | 0x00000000 |
Irq224~239 使能清除寄存器 | 读/写 | 0xE000E19C | 0x00000000 |
Irq0~31 挂起设置寄存器 | 读/写 | 0xE000E200 | 0x00000000 |
Irq224~239 挂起设置寄存器 | 读/写 | 0xE000E21C | 0x00000000 |
Irq0~31 挂起清除寄存器 | 读/写 | 0xE000E280 | 0x00000000 |
Irq224~239 挂起清除寄存器 | 读/写 | 0xE000E29C | 0x00000000 |
Irq 0~31 激活位寄存器 | 只读 | 0xE000E29C 0x00000000 | 0x00000000 |
Irq 224~239 激活位寄存器 | 只读 | 0xE000E31C | 0x00000000 |
Irq 0~31 优先级寄存器 | 读/写 | 0xE000E400 | 0x00000000 |
Irq236~239 优先级寄存器 | 读/写 | 0xE000E4F0 | 0x00000000 |
CPUID 基址寄存器 | 只读 | 0xE000ED00 | 0x410FC230 |
中断控制状态寄存器 | 读/写或只读 | 0xE000ED04 | 0x00000000 |
向量表偏移寄存器 | 读/写 | 0xE000ED0C | 0x00000000 |
应用中断/复位控制寄存器 | 读/写 | 0xE000ED0C | 0x00000000 |
系统控制寄存器 | 读/写 | 0xE000ED10 | 0x00000000 |
配置控制寄存器 | 读/写 | 0xE000ED14 | 0x00000000 |
系统处理器4-7 优先级寄存器 | 读/写 | 0xE000ED18 | 0x00000000 |
系统处理器8-11 优先级寄存器 | 读/写 | 0xE000ED1C | 0x00000000 |
系统处理器12-15 优先级寄存器 | 读/写 | 0xE000ED20 | 0x00000000 |
系统处理器控制与状态寄存器 | 读/写 | 0xE000ED24 | 0x00000000 |
可配置故障状态寄存器 | 读/写 | 0xE000ED28 | 0x00000000 |
硬故障状态寄存器 | 读/写 | 0xE000ED2C | 0x00000000 |
调试故障状态寄存器 | 读/写 | 0xE000ED30 | 0x00000000 |
存储器管理地址寄存器 | 读/写 | 0xE000ED34 | 不可预测 |
总线故障地址寄存器 | 读/写 | 0xE000ED38 | 不可预测 |
PFR0:处理器功能寄存器0 | 只读 | 0xE000ED40 | 0x00000000 |
PFR1:处理器功能寄存器1 | 只读 | 0xE000ED44 | 0x00000000 |
DFR0:调试功能寄存器0 | 只读 | 0xE000ED48 | 0x00000000 |
AFR0:辅助功能寄存器0 | 只读 | 0xE000ED4C | 0x00000000 |
MMFR0:存储器模型功能寄存器0 | 只读 | 0xE000ED50 | 0x00000000 |
MMFR1:存储器模型功能寄存器1 | 只读 | 0xE000ED54 | 0x00000000 |
MMFR2:存储器模型功能寄存器2 | 只读 | 0xE000ED58 | 0x00000000 |
MMFR3:存储器模型功能寄存器3 | 只读 | 0xE000ED5C | 0x00000000 |
ISAR0:ISA 功能寄存器0 | 只读 | 0xE000ED60 | 0x01141110 |
ISAR1:ISA 功能寄存器1 | 只读 | 0xE000ED64 | 0x02111000 |
ISAR2:ISA 功能寄存器2 | 只读 | 0xE000ED68 | 0x21112231 |
ISAR3:ISA 功能寄存器3 | 只读 | 0xE000ED6C | 0x01111110 |
ISAR4:ISA 功能寄存器4 | 只读 | 0xE000ED70 | 0x01310102 |
软件触发中断寄存器 | 只写 | 0xE000EF00 | - |
外设识别寄存器(PERIPHID4) | 只读 | 0xE000EFD0 | 0x04 |
外设识别寄存器(PERIPHID5) | 只读 | 0xE000EFD4 | 0x00 |
外设识别寄存器(PERIPHID6) | 只读 | 0xE000EFD8 | 0x00 |
外设识别寄存器(PERIPHID7) | 只读 | 0xE000EFDC | 0x00 |
外设识别寄存器位7:0(PERIPHID0) | 只读 | 0xE000EFE0 | 0x00 |
外设识别寄存器位15:8(PERIPHID1) | 只读 | 0xE000EFE4 | 0xB0 |
外设识别寄存器位23:16(PERIPHID2) | 只读 | 0xE000EFE8 | 0x0B |
外设识别寄存器位31:24(PERIPHID3) | 只读 | 0xE000EFEC | 0x00 |
元件识别寄存器位7:0(PCELLID0) | 只读 | 0xE000EFF0 | 0x0D |
元件识别寄存器位15:8(PCELLID1) | 只读 | 0xE000EFF4 | 0xE0 |
元件识别寄存器位23:16(PCELLID2) | 只读 | 0xE000EFF8 | 0x05 |
元件识别寄存器位31:24(PCELLID3) | 只读 | 0xE000EFFC | 0xB1 |
关于NVIC寄存器的具体定义,请参见Cortex-M3处理器参考手册。
Cortex-M3处理器支持电平中断和脉冲中断。电平中断保持有效,直到访问器件的 ISR 将它清除。脉冲中断是边沿模型的一个变量。边沿不是异步的,相反,它必须在Cortex-M3 时钟HCLK的上升沿被采样。
对于电平中断,如果中断程序返回前该信号没有失效,那么中断重新挂起和重新激活。这一点对于FIFO 和基于缓冲器的器件特别有用,因为它可以保证无需额外的工作,仅通过使用一个ISR 或重复调用就可将FIFO 和缓冲器清空。即器件将该信号保持有效,直至器件变空。
脉冲中断在 ISR 过程中可以重新变有效,所以中断可以同时挂起和激活。应用设计必须确保只有在第一个脉冲激活后下一个脉冲才能到达。第二个挂起由于已经挂起所以没有什么用处。但是如果中断在一个或一个以上的周期内保持有效,那么NVIC 会锁存该挂起位。当ISR 激活时将挂起位清零。如果在激活的同时中断再次被确定,它可以再次锁存挂起位。脉冲中断大都使用在外部信号、速率或重复信号中。