cortex_M3嵌套向量中断控制器NVIC

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 激活时将挂起位清零。如果在激活的同时中断再次被确定,它可以再次锁存挂起位。脉冲中断大都使用在外部信号、速率或重复信号中。

原文地址:https://www.cnblogs.com/ju-an/p/3214247.html