cortex_M3嵌套向量中断控制器NVIC
2013-08-02 22:16 居安 阅读(2064) 评论(0) 编辑 收藏 举报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 激活时将挂起位清零。如果在激活的同时中断再次被确定,它可以再次锁存挂起位。脉冲中断大都使用在外部信号、速率或重复信号中。