再上一篇:附录B
上一篇:附录C
主页
下一篇:附录E
再下一篇:E.2 设计 Fault 服务例程
文章列表

附录D

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

NVIC寄存器小结

表D.1 中断控制器类型寄存器ICTR 0xE000_E004

表D.2 SysTick控制及状态寄存器(地址:0xE000_E010)

位段

名称

类型

复位值

描述

16

COUNTFLAG

R

0

如果在上次读取本寄存器后,SysTick 已经数到

了 0,则该位为 1。如果读取该位,该位将自动清 零

2

CLKSOURCE

R/W

0

0=外部时钟源(STCLK)

1=内核时钟(FCLK)

1

TICKINT

R/W

0

1=SysTick倒数到 0时产生 SysTick异常请求

0=数到 0时无动作

0

ENABLE

R/W

0

SysTick定时器的使能位



表D.3 SysTick重装载数值寄存器(地址:0xE000_E014)

位段

名称

类型

复位值

描述

23:0

RELOAD

R/W

0

当倒数至零时,将被重装载的值

表D.4 SysTick当前数值寄存器(地址:0xE000_E018)

位段

名称

类型

复位值

描述

23:0

CURRENT

R/Wc

0

读取时返回当前倒计数的值,写它则使之清零,

同时还会清除在SysTick控制及状态寄存器中的

COUNTFLAG标志



表D.5 SysTick校准数值寄存器(地址:0xE000_E01C)

位段

名称

类型

复位值

描述

31

NOREF

R

-

1=没有外部参考时钟(STCLK不可用)

0=外部参考时钟可用

30

SKEW

R

-

1=校准值不是准确的 10ms

0=校准值是准确的 10ms

23:0 TENMS R/W 0 10ms的时间内倒计数的格数。芯片设计者应该通 过 Cortex-M3的输入信号提供该数值。若该值读 回零,则表示无法使用校准功能


表D.6 SETENA/CLRENA寄存器族

SETENAs: xE000_E100 – 0xE000_E11C ; CLRENAs:0xE000E180 - 0xE000_E19C

名称

类型

地址

复位值

描述

SETENA0

R/W

0xE000_E100

0

中断 0-31的使能寄存器,共 32个使能位

位[n],中断#n使能(异常号 16+n)

SETENA1

R/W

0xE000_E104

0

中断 32-63的使能寄存器,共 32个使能位

SETENA7

R/W

0xE000_E11C

0

中断 224-239的使能寄存器,共 16个使能位

CLRENA0

R/W

0xE000_E180

0

中断 0-31的除能寄存器,共 32个除能位

位[n],中断#n除能(异常号 16+n)

CLRENA1

R/W

0xE000_E184

0

中断 32-63的除能寄存器,共 32个除能位

CLRENA7

R/W

0xE000_E19C

0

中断 224-239的除能寄存器,共 16个除能位

表D.7 SETPEND/CLRPEND寄存器族

SETPENDs:0xE000_E200 – 0xE000_E21C ; CLRPENDs:0xE000E280 - 0xE000_E29C

名称

类型

地址

复位值

描述

SETPEND0

R/W

0xE000_E200

0

中断0-31的悬起寄存器,共32个悬起位

位[n],中断#n悬起(异常号16+n)

SETPEND1

R/W

0xE000_E204

0

中断32-63的悬起寄存器,共32个悬起位

SETPEND7

R/W

0xE000_E21C

0

中断 224-239 的悬起寄存器,共 16 个悬起

CLRPEND0

R/W

0xE000_E280

0

中断0-31的解悬寄存器,共32个解悬位

位[n],中断#n解悬(异常号16+n)

CLRPEND1

R/W

0xE000_E284

0

中断32-63的解悬寄存器,共32个解悬位

CLRPEND7

R/W

0xE000_E29C

0

中断 224-239 的解悬寄存器,共 16 个解悬

表D.8 ACTIVE寄存器族 0xE000_E300_0xE000_E31C

名称

类型

地址

复位值

描述

ACTIVE0

RO

0xE000_E300

0

中断 0-31的活动状态寄存器,共 32个状态位

位[n],中断#n活动状态(异常号 16+n)

ACTIVE1

RO

0xE000_E304

0

中断 32-63 的活动状态寄存器,共 32 个状态

ACTIVE7

RO

0xE000_E31C

0

中断 224-239 的活动状态寄存器,共 16 个状

态位

表D.9 中断优先级寄存器阵列 0xE000_E400 – 0xE000_E4EF

名称

类型

地址

复位值

描述

PRI_0

R/W

0xE000_E400

0(8位)

外中断#0的优先级

PRI_1

R/W

0xE000_E401

0(8位)

外中断#1的优先级

PRI_239

R/W

0xE000_E4EF

0(8位)

外中断#239的优先级

表D.10 CPUID寄存器 0xE000_ED00

位段

名称

复位值

描述

31:24

R

0x41

实现者代码,ARM=0x41

23:20

R

0x0/0x1/0x02

实现定义的变种号

19:16

R

0xF

常量

15:4

R

0xC23

Part编号

3:0

R

0x0/0x1

修订号

表D.11 中断控制及状态寄存器ICSR 0xE000_ED04




位段

名称

类型

复位值

描述

31

NMIPENDSET

R/W

0

写 1以悬起 NMI。因为 NMI的优先级最高且从不

掩蔽,在置位此位后将立即进入 NMI服务例程。

28

PENDSVSET

R/W

0

写 1 以悬起 PendSV。读取它则返回 PendSV 的

状态

27

PENDSVCLR

W

0

写 1以清除 PendSV悬起状态

26

PENDSTSET

R/W

0

写 1以悬起 SysTick。读取它则返回 PendSV的

状态

25

PENDSTCLR

W

0

写 1以清除 SysTick悬起状态

23

ISRPREEMPT

R

0

为 1时,则表示一个悬起的中断将在下一步时进

入活动状态(用于单步执行时的调试目的)

22

ISRPENDING

R

0

1=当前正有外部中断被悬起(不包括 NMI)

21:12

VECTPENDING

R

0

悬起的 ISR 的编号。如果不止一个中断悬起,

则它的值是这引动中断中,优先级最高的那一

个。

11

RETTOBASE

R

0

当从异常返回后将回到基级(base level),且

没有其它异常悬起时,此位为 1。若是在线程模 式下,在某个服务例程中,有不止一级的异常处

于活动状态,或者在异常没有活动时执行了异常

服务例程(此时执行返回指令将产生 fault。此

乃高危行为,大虾专用),则此位为 0

9:0

VECTACTIVE

R

0

当前活动的ISR编号,该位段指出当前运行中的

ISR是哪个中断的(提供异常序号),包括NMI和 硬fault。如果多个异常共享一个服务例程,该例程可

根据本位段的值来判定是哪一个异常的响应导致它的执

行。把本位段的值减去16,就得到了外中断的编号,并

可以用此编号来操作外中断相关的使能/除能等寄存器。





表D.12 向量表偏移量寄存器(VTOR) 0xE000_ED08

位段

名称

类型

复位值

描述

7-28

TBLOFF

RW

0

向量表起始地址

29

TBLBASE

R

-

向量表是在 Code区(0),还是在 RAM区(1)

表D.13 应用程序中断及复位控制寄存器(AIRCR) 0xE000_ED0C

表D.14 系统控制寄存器 0xE000_ED10

表D.15 配置与控制寄存器 0xE000_ED14

异常服务例程通过修改 EXC_RETURN,使其 在线程模式下执行



表D.16 系统异常优先级寄存器 0xE000_ED18 - 0xE000_ED23

地址

名称

类型

复位值

描述

0xE000_ED18

PRI_4

存储器管理 fault的优先级

0xE000_ED19

PRI_5

总线 fault的优先级

0xE000_ED1A

PRI_6

用法 fault的优先级

0xE000_ED1B

-

-

-

-

0xE000_ED1C

-

-

-

-

0xE000_ED1D

-

-

-

-

0xE000_ED1E

-

-

-

-

0xE000_ED1F

PRI_11

SVC优先级

0xE000_ED20

PRI_12

调试监视器的优先级

0xE000_ED21

-

-

-

-

0xE000_ED22

PRI_14

PendSV的优先级

0xE000_ED23

PRI_15

SysTick的优先级

表D.17 系统Handler控制及状态寄存器SHCSR 0xE000_ED24

位段

名称

类型

复位值

描述

18

USGFAULTENA

R/W

0

用法 fault服务例程使能位

17

BUSFAULTENA

R/W

0

总线 fault服务例程使能位

16

MEMFAULTENA

R/W

0

存储器管理 fault服务例程使能位

15

SVCALLPENDED

R/W

0

SVC 悬起中。本来已经要 SVC服务例程,但

是却被更高优先级异常取代

14

BUSFAULTPENDED

R/W

0

总线 fault悬起中,细节同上。

13

MEMFAULTPENDED

R/W

0

存储器管理 fault悬起中,细节同上

12

USGFAULTPENDED

R/W

0

用法 fault悬起中,细节同上

11

SYSTICKACT

R/W

0

SysTick异常活动中

10

PENDSVACT

R/W

0

PendSV异常活动中

9

-

-

-

-

8

MONITORACT

R/W

0

Monitor异常活动中

7

SVCALLACT

R/W

0

SVC异常活动中

6:4

-

-

-

-

3

USGFAULTACT

R/W

0

用法 fault异常活动中

2

-

-

-

-

1

BUSFAULTACT

R/W

0

总线 fault异常活动中

0

MEMFAULTACT

R/W

0

存储器管理 fault异常活动中

表 D.18 存储器管理 fault 状态寄存器(MFSR) 0xE000_ED28

名称

类型

复 位

描述

7

MMARVALID

-

0

=1时表示 MMAR有效

6:5

- - - -

4

MSTKERR

R/Wc

0

入栈时发生错误

3

MUNSTKERR R/Wc 0 出栈时发生错误

2

-

-

-

-

1

DACCVIOL R/Wc 0 数据访问违例

0

IACCVIOL

R/Wc

0

取指访问违例

表 D.19 总线 fault 状态寄存器(BFSR) 0xE000_ED29

位段

名称

类型

复位值

描述

7

BFARVALID

-

0

=1时表示 BFAR有效

6:5

- - - -

4

STKERR

R/Wc

0

入栈时发生错误

3

UNSTKERR R/Wc 0 出栈时发生错误

2

IMPRECISERR

R/Wc

0

不精确的数据访问违例(violation)

1

PRECISERR R/Wc 0 精确的数据访问违例

0

IBUSERR

R/Wc

0

取指时的访问违例

表 D.20 用法 fault 状态寄存器(UFSR),地址:0xE000_ED2A

位段 名称 类型 复位值 描述

9

DIVBYZERO R/Wc 0 表示除法运算时除数为零(只有在DIV_0_TRP

置位时才会发生)

8

UNALIGNED R/Wc 0 未对齐访问导致的 fault

7:4

- - - -

3

NOCP R/Wc 0 试图执行协处理器相关指令

2

INVPC R/Wc 0 在异常返回时试图非法地加载 EXC_RETURN

到 PC。包括非法的指令,非法的上下文以及 非法的值。The return PC 指向的指令试图 设置 PC的值(要理解此位的含义,还需学习 后面的讨论中断级异常的章节)

1

INVSTATE R/Wc 0 试图切入 ARM状态

0

UNDEFINSTR R/Wc 0 执行的指令其编码是未定义的——解码不能

表 D.21 硬 fault 状态寄存器 0xE000_ED2C

位段

名称

类型

复位值

描述

31

DEBUGEVT

R/Wc

0

硬 fault因调试事件而产生

30

FORCED R/Wc 0 硬 fault是总线 fault,存储器管理 fault

或是用法 fault上访的结果

29:2

-

-

-

-

1

VECTBL R/Wc 0 硬 fault是在取向量时发生的

0

-

-

-

-

表 D.22 调试 fault 状态寄存器(DFSR) 0xE000_ED30

位段

名称

类型

复位值

描述

4

EXTERNAL

R/Wc

0

EDBGREQ信号有效

3

VCATCH R/Wc 0 发生向量加载

2

DWTTRAP

R/Wc

0

发生 DWT匹配

1

BKPT R/Wc 0 执行到 BKPT指令

0

HALTED

R/Wc

0

在 NVIC中请求 HALT

表 D.23 存储管理地址寄存器(MMAR) 0xE000_ED34

位段

名称

复 位

描述

31:0

MMAR

R

-

触发存储管理 fault的地址

表 D.24 总线 fault 地址寄存器(BFAR) 0xE000_ED38

位段

名称

类型

复位值

描述

31:0

BFAR

R

-

触发总线 fault的地址

表 D.25 辅助 fault 地址寄存器(AFAR) 0xE000_ED3C

位段

名称

类型

复位值

描述

31:0

AFAR

R

-

由芯片制造商决定(可选)

表 D.26 MPU 类型寄存器MPUTR 0xE000_ED90

位段

名称

类型

复位值

描述

23:16

IREGION

R

0

MPU支持的指令 region数量。因为 ARMv7-M

只使用单个统一的 MPU,此位段永远为零

15:8

DREGION

R

0

MPU 支持的数量。若系统中配了 MPU 则为 8,

否则为零

0

SEPARATE

R

0

固定为零


表 D.27 MPU 控制寄存器MPUCR (地址:0xE000_ED94)
位段 名称 类型 复位值 描述

2

PRIVDEFENA

RW

0

是否为特权级打开缺省存储器映射(即背景

region)。

1=特权级下打开背景 region

0=不打开背景 region。任何访问违例以及对

region外地址区的访问都将引起 fault

1

HFNMIENA

RW

0

1=在NMI和硬fault服务例程中不强制除能MPU

0=在 NMI和硬 fault服务例程中强制除能 MPU

0

ENABLE

RW

0

使能 MPU

表 D.28 MPU region 号寄存器 MPURNR (地址:0xE000_ED98)

位段

名称

类型

复位值

描述

7:0

REGION

RW

-

选择下一个要配置的 region。因为只支持 8 个

region,所以事实上只有[2:0]有意义

表 D.29 MPU region 号寄存器 MPURNR (地址:0xE000_ED9C)

位段

名称

类型

复位值

描述

31:N

ADDR

RW

-

Region 基址字段。N 取决于region 容量,以使基址在数值 上能被容量整除。在 MPU region 属性及容量寄存器中有 个 SZENABLE 位段,它决定 ADDR 中有多少个位被采 用。

4

VALID

RW

-

决定是否理会写入REGION字段的值

1=MPU region号寄存器被REGION覆盖

0=MPU region号寄存器的值保持不变

3:0

REGION

RW

-

MPU region 覆写位段



表D.30 MPU region属性及容量寄存器MPURASR(地址:0xE000_EDA0)

位段

名称

功能

31:29

3

-

保留

28

1

XN

1=此区禁止取指

2=此区允许取指

27

1

-

保留

26:24

3

AP

访问许可,如下表所示

26:24

3

AP

特权级下的许可

用户级下的许可

典型用法

26:24

3

AP

0b000

禁地

禁地

该区没有存储器,是空地址

26:24

3

AP

0b001

RW

禁地

OS和系统软件使用的数据区

26:24

3

AP

0b010

RW

RO

禁止在用户级下更改的高危地带

26:24

3

AP

0b011

RW

RW

共享内存,或彻底开放的设备

26:24

3

AP

0b100

n/a

n/a

n/a

26:24

3

AP

0b101

RO

禁地

OS使用的常量数据

26:24

3

AP

0b110

RO

RO

常量数据或只读存储器的地址区

26:24

3

AP

0b111

RO

RO

常量数据或只读存储器的地址区

23:22

2

保留

21:19

3

TEX

类型扩展

18

1

S

Sharable(可否共享)

1=共享可

0=共享不可

17

1

C

Cachable(可否缓存)

1=缓存可

0=缓存不可

16

1

B

Buffable(可否缓冲)

1=缓冲可

0=缓冲不可

15:8

8

SRD

子region除能位段。每设置SRD的一个位,就会除能与之对应的一个子region。容

量大于128字节的region都被划分成8个容量相同的子region。容量小于等于128字节 的region不能再分。更多信息,请参见对子Region的论述。

7:6

2

-

保留

5:1

5

REGIONSIZE

Region容量,单位是字节。容量为1<<(REGIONSIZE+1),但是最小容量为32字节

0

1

SZENABLE

1=使能此region 0=除能此region

表 D.31 调试停机控制及状态寄存器DHCSR (地址:0xE000_EDF0)

位段

名称

类型

复位值

描述

31:15

KEY

W

-

调试钥匙。必须在任何写操作中把该位段写入

A05F,否则忽略写操作

25

S_RESET_ST

R

-

内核已经或即将复位,读后清零

24

S_RETIRE_ST

R

-

在上次读取以后指令已执行完成,读后清零

19

S_LOCKUP

R

-

1=内核进入锁定状态

18

S_SLEEP

R

-

1=内核睡眠中

17

S_HALT

R

-

1=内核已停机

16

S_REGRDY

R

-

1=寄存器的访问已经完成

15:6

保留

-

-

5

C_SNAPSTALL

RW

0*

打断一个 stalled存储器访问

4

保留

-

-

3

C_MASKINTS

RW

0*

调试期间关中断,只有在停机后方可设置

2

C_STEP

RW

0*

让处理器单步执行,在 C_DEBUGEN=1时有效

1

C_HALT

RW

0*

喊停处理器,在 C_DEBUGEN=1时有效

0

C_DEBUGEN

RW

0*

使能停机模式的调试

表 D.32 调试内核寄存器选择者寄存器DCRSR(地址:0xE000_EDF4)

位段

名称

类型

复位值

描述

16

REGWnR

W

-

1=写寄存器

0=读寄存器

15:5

保留

-

-

-

4:0

REGSEL

W

-

00000= R0

00001=R1

01111=R15

10000=xPSR

10001=MSP

10010=PSP

10100=特殊功能寄存器组

[31:24]: CONTROL [23:16]: FAULTMASK [15:8]: BASEPRI

[7:0]: PRIMASK

表 D.33 调试内核寄存器数据寄存器DCRDR(地址:0xE000_EDF8)

位段

名称

类型

复位值

描述

31:0

DATA

R/W

-

读回来的寄存器的值,或欲写入寄存器的值,寄

存器由 DCRSR选择

表 D.34 调试乃及监视器控制寄存器DEMCR(地址:0xE000_EDFC)

位段

名称

类型

复位值

描述

24

TRCENA

RW

0*

跟踪系统的使能位。在使用 DWT,ETM,ITM 和

TPIU前,必须先设置此位

23:20

保留

19

MON_REQ

RW

0

1=调试监视器异常不是由硬件调试事件触发,而是由

软件手工悬起的

18

MON_STEP

RW

0

让处理器单步执行,在 MON_EN=1时有效

17

MON_PEND

RW

0

悬起监视器异常请求,内核将在优先级允许时响应

16

MON_EN

RW

0

使能调试监视器异常

15:11

保留

10

VC_HARDERR

RW

0*

发生硬 fault时停机调试

9

VC_INTERR

RW

0*

指令/异常服务错误时停机调试

8

VC_BUSERR

RW

0*

发生总线 fault时停机调试

7

VC_STATERR

RW

0*

发生用法 fault时停机调试

6

VC_CHKERR

RW

0*

发生用法 fault 使能的检查错误时停机调试

(如未对齐,除数为零)

5

VC_NOCPERR

RW

0*

发生用法 fault之无处理器错误时停机调试

4

VC_MMERR

RW

0*

发生存储器管理 fault时停机调试

3:1

保留

0

VC_CORERESET

RW

0*

发生内核复位时停机调试

*:DEMCR中的控制位是在上电复位时得到复位的。系统复位(例如,往NVIC应用程序中断及复位寄存器中写命令)

不会影响到它们

表D.35 软件触发中断寄存器STIR 0xE000_EF00

位段

名称

类型

复位值

描述

8:0

INTID

W

-

影响编号为INTID的外部中断,其悬起位被置位。

例如,写入 8,则悬起 IRQ #8

表 D36 中断优先级寄存器阵列 0xE000_E400 – 0xE000_E4EF

名称

类型

地址

复位值

描述

PERIPHID4

R

0xE000_EFD0

0x04

外设 ID寄存器 4

PERIPHID5

R

0xE000_EFD4

0

外设 ID寄存器 5

PERIPHID6

R

0xE000_EFD8

0

外设 ID寄存器 6

PERIPHID7

R

0xE000_EFDC

0

外设 ID寄存器 7

PERIPHID0

R

0xE000_EFE0

0

外设 ID寄存器 0

PERIPHID1

R

0xE000_EFE4

0

外设 ID寄存器 1

PERIPHID2

R

0xE000_EFE8

0x0B/0x1B

外设 ID寄存器 2

PERIPHID3

R

0xE000_EFEC

0

外设 ID寄存器 3

PCELLID0

R

0xE000_EFF0

0x0D

组件 ID寄存器 0

PCELLID1

R

0xE000_EFF4

0xE0

组件 ID寄存器 1

PCELLID2

R

0xE000_EFF8

0x05

组件 ID寄存器 2

PCELLID3

R

0xE000_EFFC

0xB1

组件 ID寄存器 3