-
.
.. .
ARM Cortex-M3
核结构
2.1
ARM
Cortex-M3
处理器简
介
2.1.1
概述
ARM
公
司成立于上个世纪九十年代初,致力于处理器核研究,
ARM
即
Advanced RISC Machines
的
缩写,
ARM
公司
本身不生产芯片,只设计核,靠转让设计许可,由合作伙伴公司来生产各具特色的
p>
芯
片。
这种运行模式运营的成果受到全球半
导公司以及用户的青睐。
目前
ARM
体
系结构的处理器核有:
ARM7TDMI
、
ARM9TDMI
、
ARM10
TDMI
、
ARM11
以及
Cortex
等。
2005
年
ARM
推出的
ARM
Cortex
系列核,分别
为:
p>
A
系列、
R
系列和
M
系列,其中
A
系列是针对可以运行复杂操作系统(
Linux
、
Windows
CE
、
Symbian
等)的处理器;
R
系列是主要针对处理实时性要求较
高的处理器(汽车电子、网络、影像系
统);
M
系列
又叫微控制器,对开发费用敏感,对性能要求较高的场合。
<
/p>
Cortex-M
系列目前的产品有
M0
、
M1
、
M3
,
其中
M1
用
在
FPGA
中。
Cortex-M
p>
系列对微控制器
和低成本应
用提供优化,具有低成本、低功耗和高性能的特点,
能够满足微控制器设计师
进行创新设
计的需求。
其
中,
ARM Cortex-M3
处理
器的性能是
ARM7
的两倍,而功耗却只有
ARM7
的
1/3
,适用
于众多高性能、极其低
成本需求的嵌入式应用
,如微控制器、汽车系统、大型家用电器、网络装置
等,
ARM
Cortex-M3
提供了
32
位微控制器市场前所未有的优势。
Cortex-M3
核,
部的数据路径为
32
位,寄存器为
32
位,
存储器接口也是
32
位。
Cortex-M3
采用
了
p>
哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问分开进行。
Cortex-M3
还提供
一个
可选的
MPU
,对存储器进行保
护,而且在需要的情况下也可以使用外部的
cache
。另外在
Cortex-M3
中,
存储器支持小端模式和大端存储格式。
Cortex-M3
部还附赠了很多调试组件,用于在
硬件水平上支持
<
/p>
调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选
组件,包括指令跟
踪和多种类型的调试接口。
2.1.2
核结构组成及功能描述
Cortex-M3
微控制器核包括处理核心和许多的组件,目的是用于系统管理和调试支持。如图
2.1
为
Cortex-M3
核方框图。
i.
.w.
.
.. .
NMI
中
断号
[239:0]
SLEEPING
SLEEPDEE
P
NVIC
SysTick
中断
睡眠
调试
指令
MPU
Cortex-M3
CM3
核
数据
ETM
触发
TPIU
FPB
DWT
M
IT
专用外
设总线
SW-DP
JTAG-
DP
专用外设总线(部)
AHB-
AP
AP
B
ROM
表
总线矩阵
I-code
总线
D-code
总线
系统总线
系统总线(
AHB
)
总线矩阵
静态
R
AM
外部
R
AM
外部
控制器
设备
AHB to APB
总
线
SRAM
可
选配
外部
RAM
Flash
存
储器
外设总线
I/O
UART
PWM
Timer
图
2
.1 Cortex-M3
核方框图
1.
处理器核
Cortex-M3
处理器核采用
ARMv7-M
架构,其主要特性如下
:
Thumb-2
指令集架构(
ISA
)的子集,包含所有基本的
16
位和
32
位
p>
Thumb-2
指令;
哈佛处理器架构,在加载
/
存储数据的同时能够执行指令取指;
带分支预测的三级流水线;
32
位单周期乘法;
硬件除法;
Thumb
状态和调试状态;
i.
.w.
.
.. .
?
?
处理模式和线程模式;
ISR
的低延迟进入和退出;
可中断
-
可继续(
i
nterruptible-continued
)的
LDM/
STM
、
PUSH/POP
;
支持
ARMv6
类型
BE8/LE
;
支持
ARMv6
非对齐访问。
(嵌套向量中断控制器)
NVIC
与处理器核是紧密耦合的,
这样可实现快速、
低延迟的异常处理
。
在
Cortex-M
微控制器此
p>
功
能非常强大。
3.
总线矩阵
总线矩阵用来将处理器和调试接口与外部总线相连。
处理器
包含
4
个总线接口:
ICode
存储器接口:从
Code
存储器空间(
0x0000000
–<
/p>
0x1FFFFFFF
)的取指都在这条
32
位
AHBLite
总线上执行。
DCode
存储器接口:对
Code
存储器空间(
0x0000000
–<
/p>
0x1FFFFFFF
)进行数据和调试访
问都
在这条
32
位
AHBLite
总线上执行。
系统接口:
对系统空间
(
0x20
000000
–
0xDFFFFFFF
)
进行取指、
数据和调试访问都在这条
32
位
AHBLite
总线上执行。
外部专用外设总线(
PPB
):对外部
PPB
空间(
0xE0040000
–
0xE00FFFFF
)进行数据和调试
访
问都在这条
32
位
APB
总线(
AMBA v2.0
)上执行。
跟踪端口接口单元(
TPIU
)和厂商
特定的
外围器件都在这条总线上。
注:处理器包含一条部专用外设总线,用来访问嵌套向量中断控制器(
< br>NVIC
)、数据观察点和
触
发
(
DWT
)、
Flash
修补和断点(
FPB
)
,以及存储器保护单元(
MPU
)。
FPB
单元实现硬件断点以及从代码
空间到系统空间的修补访问,
FPB
有
8
个比较器。
数据观察点和跟踪,调试功能部件。
ITM
是
一个应用导向(
application driven
)的跟
踪源,支持对应用事件的跟踪和
printf
类型的调
试。
i.
.w.
.
.. .
存储器保护单元(
MPU
)
是用来保护存储器的一个元件。处理器支持标
准的
ARMv7
“受保护的存
储器
p>
系统结构”
(
P
MSA
)模型。如果希望向处理器提供存储器保护,则可以使用可选的
< br>MPU
;
MPU
对访问允许
p>
和存储器属性进行检验。它包含
8
个区和一个可选的执行默认存储器映射访问属性的背景
区。
ETM
支
持指令跟踪的低成本跟踪宏单元。
TPIU
用作来自
ITM
和
ETM
(如果存在)
的
Cortex-M3
核跟踪数据与片外跟踪端口分析仪之间的桥
接。
/JTAG-DP
Cortex-M3
处理器可配置为
具有
SW-DP
或
JTAG-DP
p>
调试端口的接口,或两者都有。这两个调试
端口提
< br>
供对系统中包括处理器寄存器在的所有寄存器和存储器的调试访问。
2.2
核寄存器组织
如图
2
.2
所
示,
Cortex_M3
核
寄存器分为
1
6
个
通用寄存器
R
0
~
R15
和
7
个
特殊功能寄存器。
i.
.w.
.
.. .
低
寄
存
器
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
MSP
通
用
寄
存
器
高
寄
存
器
R12
R13
(
SP
)
R14
(
LR
)
R15
(
PC
)
特
殊
功
能
寄
存
器
PSP
状态寄存器
中断屏蔽
寄存器
控制寄存器
xPSR
PRIMASK
FAULTMASK
BASEPRI
CONTROL
图
2
.2
寄存器组织图
2.2.1
通用寄存器
R
0-R15
R0
~
R12
寄
存器:
是真正意义上的通用。在处理器运行过程中,作数据
的寄存。
R13
为堆栈指针寄存器
:
堆栈指针是用于访问堆栈,也即系统的
RAM
区。
Cortex_M3
中采用了两
个
堆栈指针:主堆栈指针(
MSP
)和进程堆栈指针(
PSP
),
R13
在
任何时刻只能是其中一个,默认情
况为
MSP
,可以通过控制寄存器(
CONTORL
)来改变。
Cortex_M3
中堆栈方向是向低
地址方向增
长,为满堆栈
机制。堆栈操作是通过
P
USH
和
P
OP
来
完成操作的。
例如
M
SP
当
前指针指向:
0x2000_000
C
;
R0=0x00000000
。<
/p>
执行:
PUSH
此时
M
SP
指
向:
0x2000_0008
执行示意如图
2
.3
所
示。
R0
i.
.w.
.
.. .
RAM
RAM
已使用
已使用
已使用
0x2000_0008
MSP
向
下
生
长
已使用
已使用
0x2000_00
0C MSP
上次压入的数据
未用
未用
0x00000000
未用
2.3
堆栈操作示意图
R14
程序连接寄存器(
LR
):
在执行分支(
B
)和(
BL
)指令或带有交换分支(
B
X
)和
指令
(
BLX
)时,
PC
的返回地址自动保存进
LR
。比如在子程序调用时用保存子程序的返回地址。
LR
也用
于异常返回,
但是在这里保存的是返回后的状态,
不是返回的地址,
异常返回是通过硬件自动出栈
弹出
之前压入的
P
C
完成的。
R15
< br>程序计数器(
PC
):
是程序运
行的基础,具有自加的功能。该寄存器的位
0
始终为
0
,因此,
指令始终与字或半字边界对齐。
2.2.2
特殊功能寄存器
特殊功能寄存器分为程序状态寄存
器、中断屏蔽寄存器和控制寄存器三类。
xPSR
程序状态寄存器:
系统级的处理器状态可分为
3
类,应用状态寄存器(
APSR
)
、中断状态寄
存器(
IPSR
)、执行状态寄存器(
EPSR
),可组合起
来构成一个
3
2
位
的寄存器,统称
x
PSR
。
表
2
.1 xPSR
寄存器
寄存
器名
APSR
位
31
N
30
29
28
27
Z
C
V
Q
26:25
24
23:20
19:16
15:10
9
8
7
6
5
4:0
中断编号
ICI/IT
T
EPSR
IPSR
ICI/IT
xPSR
寄
存器的各位的功能如表
2
.2
:
表
2
.2
xPSR
寄存器各位功能
位
31
30
29
28
名称
N
Z
C
V
定义
负数或小于标志:
1
:结果为负数或小
于;
0
结果为正数或大于
零标志:
1
:结果为
0
;
0
:结果
为非
0
进
位
/
借位标志:
1
:进位或借位;
0
没有进位或借位
溢出标志:
1
:溢出;
0
:没有溢
出
i.
.w.
.
.. .
27
26:25
15:10
24
T
Q
粘着饱和标志:
1
:已饱和;
0
:没有饱和
IF-
Then
位。它们是
i
f-Then
指令的执行状态位。
包含
i
f-Then
模块的指令数目和它们的执行条件
用于指示处理器当前是
A
RM
状态还是
T
humb
状态
可中断
-
可继续的指令位:
如果在执行
LDM
或
STM
操作时产生一次中断,
则
L
DM
或
ICI
STM
操作暂停,该位来保
存该操作中下一个寄存器操作数的编号,在中断响
应
之后,处理器返回由该位指向的寄存器并恢复操作。
8:0
ISR
占先异常的编号
IT
15:12
中断屏蔽寄存器:
分为三组,分别是
P
RIMASK
、
FAULTMASK
、
BASEPRI
。
PRIMASK
为
片上外设总中断开关,该寄存器只有位
0
有
效,当该位为
0
是
响应所有外设中断;当该
位为
1
时
屏蔽所有片上外设中断。
FAULTMASK
寄
存器管理系统
错误的总开关,该寄存器中有位
0
有
效,当该位为
0
时
,响应所有的异
常;为
1
屏
蔽所有的异常。
BASEPRI
寄
存器用来屏蔽优先
级等于和小于某一个中断数值的寄存器。
控制寄存器:
CONTROL
有
p>
两个作用,其一用于定义处理器特权级别,其二用于选择堆栈指针,如
表
3.3
所
示。
表
2
.3
CONTROL
寄存器
位
功能
堆栈指针选择
CONTROL[1]
0
:选择主堆栈指针
M
SP
1
:选择进程堆栈指针
P
SP
CONTROL[0]
0
:特权级
1
:用户级
CONTROL[0]
:异常情况下,处理器总是处于特权模式
,
CONTROL[0]
位总是为
<
/p>
0
;在线程模式情况
下
< br>
(非异常情况),处理器可以工作在特权级也可工作在用户级,该位可为
0
或
1
。特权级下所有的资源
都可以访问,而用户级下被限制的资源不能访问,比如
M
PU
被
限制的资源。
CONTROL[1]
:为
0
时
,只使用
M
SP
,此时用户程序和异常共享同一个堆栈,处理器复位后默
认的也
是该模式。
为
1
时
,
p>
用户应用程序使用进程堆栈
P
SP
,
而中断任然得使用主堆栈
< br>
M
SP
。
这种双堆栈机制,
特
别适合在带有
O
S
(操作系统)的环境下使用,只要
O
S
核
在特权级下执行,而用户应用程序在用户
模式下
执行,就可很好的将代码隔离互不影响。
2.3
处
理器操作模式
ARM
Cortex-M3
支持
2
个模式和两个特权等级。如图
2.4
所示,在嵌入式系统应用程序中,程序
代
码
涉及异常服务程序代码和非异常服务程序代码,
这些代码可以工作在处理器特权级也可以工作在
用户级
级,
但有区别。
当处理器处在线
程模式下时,
既可以使用特权级,
也可以使用用户级;
另一方面,
handler
模式总是特权级的。在复位后,处理器进入线程模式+特权级。
i.
.w.
.
.. .
特权级
用户级
Handler
模式
主应用程序的代码
线程模式
线程模式
错误的用法
异常
h
andler
的代码
图
2
.4
操作模式和特权等级
在线程模式+用户级下,对系统控制空间(
< br>SCS
,
0xE000E000
~
0xE000EFFF
,包括
NVI
C
、
SysTick
、
MPU
以及代码调试控制所用的寄存器)
的访问将被
禁止。除此之外,
还禁止使用
MRS/MSR
< br>访
问,
除了
APSR
之外的特殊功能寄存器。如果操作,则对于访问特殊功能寄存器的,访问操作被忽略;而
对于访问
SCS
空间的,将产生错误。
在特权级下不
管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回
p>
后,
系统将回到产生异常时所处的级别,
同
时特权级也可通过置位
CONTROL[0]
来进入用户级。<
/p>
用户
级下
的代
码不能再试图修改
CONTROL[0]
来回到特权级。它必须
通过一个异常
handler
,来修改
CONTROL[0]
,
才能在返回
到线程模式后进入特权级。如图
2.5
所示。
< br>
特权级
handler
模式
1
CONTROL[0]=
异常服务
例程
CONTROL[0]=0
异常服务
例程
特
权
级
线
启
动
代码
程模式
异常
异常
特权级的
线程
用
户
级
线
程模式
用户
程序
用户
程序
图
2
.5
处理器模式转换图
把代码按特权级和用户级分开处理,有利于使
Cortex-M3
的架构更加稳定可靠。例如,当某个用
户
程序代码出问题时,
可防止处
理器对系统造成更大的危害,
因为用户级的代码是禁止写特殊功能寄
存器
和
NVIC
中寄存器的。另外,如果还配有
MPU
,保护力度就更
大,甚至可以阻止用户代码访问不
属于它的
存区域。
在引入了嵌入式实时操作系
统中,为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给
< br>应用程序专门配一个堆栈,
不让它共享操作系统核的堆栈。
在这个管理制度下,
运行在线程模式的用
< br>户
代码使用
PSP
,
而异常服务例程则使用
MSP
。
< br>这两个堆栈指针的切换是智能全自动的,
在异常服务的始
末由
Cortex-M3
硬件处理。<
/p>
如前所述,特权等级和堆栈指针的选择均由
CONTROL
负责。
当
CONTROL[0]=0
,在异常处理
的始
末,只发生了处理器模式的转换,如图
2.6
所示。
若
CONTROL[0]=1
< br>(线程模式
+
用户
级),则在中
断响应的始末,处理器模式和特权等级都要发生变
化,如图<
/p>
2.7
所示。
CONTROL
[
0
]只有在特权级下才能访问。用户级的程序
如想进入特权级,通常都
是使用一条“系
i.
.w.
.
.. .
统服务呼叫指令(
SVC
)”来触发“
SVC
异
常”,该异常的服务例程可以视具体情况而修改
CONTROL[0]
< br>。
中断事件
中断服务程序
中断返回
主程序
入栈
出栈
线
程
模
式
(特权级)
Handler
模
式
(特权级)
线
程
模
式
(特权级)
图
2
.6
中断前后的状态转换
中断事件
中断服务程序
中断返回
主程序
入栈
出栈
线
程
模
式
(用户级)
线
程
模
式
(用户级)
Handler
模
式
(特权级)
图
2
.7
中断前后的状态转换
+
特权等级切换
2.4
存
储器系统
2.4.1
存储器映射
Cortex-M3
采
用了固定的存储映射结构,如图
2
.8
所
示。
Cortex-M3
的地址空间是
4GB,
程序可以在代码区,
部
SRAM
区以及外部
RAM
区中执行。
但是因为
指令总线与数据总线是分开的,
最理想的是把程序放到代码区,
从而使取指和数据访问各自使用己的总
线。
部
S
RAM
区
的大小是
5
12MB
,用于让芯片制造商连接片上的
S
RAM
,这个区通过系统总线
来访问。
在这个区的下部,
有一个
1
MB
的
区
间,
被称为“位带区”。
该位带区还有一个对应的
3
2MB
的
“位带别
名
(alias)
区”,容纳了
8
M
个
“位变量”(对比
8
051
的
只有
1
28
个
位变量),位带区对应的是最低的
1MB
地址围,而位带别名区里面的每个字对应位带区的一个
比特。位带操作只适用于数据访问,不适
用于取
指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,
像访
问普通存一样地使用它们。
位带别名区中的访问操作是原子的,
消灭了传统的“读-改-写”三
步。
i.
.w.
.
.. .
0xE00FFFF
F
0xE00FF00
0
0xE004200
0
0xE004100
0
0xE004000
0
ROM
外部
PPB
ETM
TPIU
芯片厂商定义
0xFFFFFFFF
外部私有外设总线
内核
0xE0100000
私有
0xE00FFFFF
区域
512MB
0xE0040000
0xE003FFFF
0xE0000000
0xDFFFFFFF
内部私有外设总线
0xE003FFF
F
0xE000F00
0
0xE000E00
0
0xE000300
0
0xE000200
0
0xE000100
0
0xE000000
0
保留
片外外设
1.0GB
0xA0000000
0x9FFFFFFF
NVIC
保留
FPB
DWT
ITM
片外
RAM 1.0GB
0x60000000
0x5FFFFFFF
片上外设区
512MB
0x40000000
0x3FFFFFFF
片上
SRAM 512MB
0x20000000
0x1FFFFFFF
代码区
512MB
0x00000000
0x43FFFFFF
0x4200000
0
0x41FFFFFF
32MB
位带别名区
31MB
0x40100000
0x4000000
0
1MB
位带区
0x23FFFFFF
0x2200000
0
0x21FFFFFF
32MB
位带别名区
31MB
0x20100000
0x2000000
0
1MB
位带区
图
2
.8
Cortex-M3
存储器映射图
片上外设对应
5
12MB
的
空间,
芯片上所有与外围设备相关的寄存器都位于该区域。
这
个区中也有一
条
32MB
的位带别名,
以便于快捷地访问外设寄存器,
用法与部
SRAM
区中的位带相同。
例如,
可以方
便地访问各种控制位
和状态位。
要注意的是,
外设区不允许执行指令。
通常半导体厂商就是修改此区
域
< br>的片上外设,来达到各具特色的、个性化的设备。
i.
.w.
.
.. .
还有两个
1
GB
的
围
,
分别用于连接外部
R
AM
和
外
部设备,
它们之中没有位带。
两者的区别在于外
部
RAM
区
允许执行指令,而外部设备区则不允许。
最后还剩下
0
.5GB
的
隐秘地带,包括了系统级组件,
部私有外设总线,
外部私有外
设总线,以及
由提
供者定义的系统外设。
私有外设总线有两条:
AHB
私
有外设总线,只用于
C
M3
部
的
A
HB
外
设,它们是:
NVIC, FPB,
DWT
和
I
TM
。
APB
私
有外设总线,
既用于
C
M3
部
的
A
PB
设
备
,
也用于外部设备
(这里的“外部”是对核而言)
。
Cortex-M3
允
许器件制造商再添加一些片上
A
PB
外
设到
A
PB
私
有总线上,它们通过
A
PB
接
口来访问。
i.
.w.
.
.. .
NVIC
所
处的区域叫做“系统控制空间(
SCS
)”,在
S
CS
里
的除了
N
VIC
外
,还有
S
ysTick
、
MPU
以
及代码调试控制所用的寄存器。
最后
,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。
2.4.2
位带操作
在
Cotex-M3
存储器映射中包括
两个位操作区。分别位于
SRAM
和片上外设存储区的最低
p>
1MB
空
间中。
这两个位带中的地址除了可以像普通的
RAM
< br>一样使用外,它们还都有自己的“位带别名
区”,位带别名
区把每个比特膨胀成一个
32
位的
字形成位地址。
当你通过位带别名区访问这些字时,
就可以达到
访问原
始比特的目的,其对应关系如图
2.8
所。
位地址与位别名对应关系统如下:
对
于
S
RAM
位
带区的某个位:
Aliasaddr
0
x
22000000
0
x
2
2000000
0
x
42000000
0
x
42000000
((
A
(
A
((
A
(
A
0<
/p>
x
20000000
)
0
x
20000000
) <
/p>
0
x
40000000
< br>)
0
x
40000000
p>
)
8
32
8
32
n
)
n
n
)
n
4
4
4
4
对于片上外设位带区的某个位:
Aliasaddr
在上述表达式中,
A
表
示要操作的位所在的字节地址,
n
(
0
≤
n
≤
7
)表示位序号。
0x23FFFFFC 0x23FFFFF8 0x23FFFFF4
0x23FFFFF0 0x23FFFFEC 0x23FFFFE8 0x23FFFFE4
0x23FFFFE0
位带别名区(共
3
2MB
)
0x2200001C 0x22000018
0x22000014 0x22000010 0x2200000C 0x22000008
0x22000004
0x22000000
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
0x200FFFF
F
0x200FFFF
E
0x200FFFF
D
0x200FFFFC
SRAM
位
带区(共
1
MB
)
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
0x200000
03
0x200000
02
0x200000
01
0x20000000
2.9
位操作对应关系图
举例:将地址
0
x20000000
的
第
2
位
置
1
p>
。通过上述计算关系,可计算出位带别名为
0
x22000008
。
如程序清单
L
2.1
所
示。
程序清单
L
2.1 SRAM
位操作实例
LDR R0,=0x22000008
i.
.w.
.
.. .
LDR R1,=0x01
STR R1,[R0]
将片上外设
I
/O
端
口的
A
口
的第
0
位
(也即
P
ORTA0
)
为输出,
其
A
口
的方向寄存器地址为
0
x40004400
,
设置
1
<
/p>
作
为输出,可根据上述关系计算出位带别名为
0
x42088000
。如程序
清单
L
2.2
所
示。
程序清单
L
2.2
片上外设位操作实例
LDR
R0
,
=0x42088000
LDR
R1,=0x01
STR
R1,[R0]
注:采用大端格式时,对位邦定别名区的访问必须以字节方式,否则访
问不可预知。
2.5
异
常
ARM Cortex-M3
中
异常
涉及异常的类型、优先级、向量表等,本节并以
L
uminary
系
列微控制器为
例
说明异常的具体行为。
2.5.1
异常类型
在
Cortex-M3
中有
一
个
与
核
紧
耦
合
部
件
叫
嵌
套向
量
中
断
控
制
器
(
N
VIC
,
N
ested Vectored
Interrupt
C
ontrol
ler
)
,
定义了
1
6
种
系统异常和
2
40
路
外
设中断。
通常芯片设计者可自由设计片上外
< br>设,
因此具体的片上外设中断都不会用到多达
2
40
路
。
如表
2
.4
所
示
系统异常类型,
表
2
.5
所
示为外设
中断
类型。
Cortex-M3
中目前只有
11
种系统异常可用分别是:系统复位、
NMI
(不可屏蔽中断)、硬件故障、
存储器管理、总线
故障、用法故障、
SVCall
(软件中断)、调试监视器中断
、
PendSV(
系统服务请求
)
p>
、
SysTick
(
24
位定时器中断)。
240
路外设中断
,
是指片上外设的各模块,
比如
I/O
口、
UART
通信接口、
SSI
总
线接口等所需的中断。
表
2
.4
异常类型
编号
0
1
2
类型
-
复位
NMI
优先级
-
-3
-2
描述
复位时载入向量表的第一项作为主堆栈栈顶地址。
复位。
不可屏蔽中断(来自外部
N
MI
输
入脚)。
当故障由于优先级或者是可配置的故障处理程序被禁止的原因
而无法激活时,所有类型故障都会以硬故障的方式激活。
4
5
存储器管理
总线故障
可编程
可编程
MPU
不匹配,包括访问冲突和不匹配。
预
取指故障、存储器访问故障和其它地址
/
存储器相关的故障。<
/p>
由于程序错误导致的异常,
通常是使用
一条无效指令,
或都是非
法的状态转换。
7-10
11
保留
SVCall
-
可编程
保留
执行
S
VC
指
令的系统服务调用。
3
硬故障
-1
6
用法故障
可编程
i.
.w.
.
.. .
12
13
14
15
调试监视器
保留
PendSV
SysTick
可编程
-
可编程
可编程
调试监视器(断点,数据观察点,或是外部调试请求)
系统服务的可触发(
pendabl
e
)请求。
系统节拍定时器。
表
2
.5
中断类型
编号
16
17
类型
IRQ
#0
IRQ
#1
优先级
可编程
可编程
描述
外设中断
#0
外设中断
#1
255
…
可编程
…
外设中断
#239
?
IRQ
#239
?
2.5.2
优先级
Cortex-M3
的异常功能非常强大,机制非常灵活,异
常可以通过占先、末尾连锁和迟来等处理来降
低中断的延迟。优先级决定了处理器何时以及怎样处理异常。
Cortex-M3
支
持
3
个
固定的高优先级和多达
2
56
级
的可编程优先级,并且支持
1
28
级
抢
占,
绝大多
数
芯片都会精简设计,实际中支持的优先级数会更少,如
8
级、
16
级、
32
级等,通常的做法是裁掉表
达
优先级的几个低端有效位(防止优先级反转),以减少优先级的级数。比如
Luminary
的芯片采用
8
级
优先级。
Cortex-M3
中
NVIC
支持由软件指定的可配置的优先级(称为软件优先级
),其寄存器地址为:
0xE000_E400-0xE00
0_E4EF
。通过对中断优先级寄存器的
8
位
P
RI_N
区
执行写操作,来将中断的优先级
指定为
0-255
。硬件优级随着中断中的增加而降低。
0
优先级最高,
255
优先级最低。指定软件优先级
后,<
/p>
硬件优先级无效。
例如:
如果将
INTISR[0]
指定为优先级
1
,
INTISR[31]
指定为优先级
0
,
则
INTISR[0]
的
优先级比
<
/p>
I
NTISR[31]
低。
为了对具有大量中断的系统加强优先级控制,
Co
rtex-M3
支
持优先级分组,通过
N
VIC
控
制,设置
为
占先优先级和次优先级。可通过对应用程序中断及复位控制寄存器(
< br>AIRCR
,地址为:
0xE000_ED00
)
的
[10:8]<
/p>
位进行设置。
如果有多个激活异常共用相同的组优先级,
则使用次优先级区来决定同组中的异
常
优先级,
这就是同组的次优先级。
如表
2
.6
应
用程序中断及复位控制寄存器,
表
2
.7
为
占先优先级
和次优级
的关系。
表
2
.
6
应用程序中断及复位控制寄存器(
AIRCR
,地址:
0xE000ED00
)
位段
[31:16]
VECTKEY
名称
RW
类型
-
复位值
描述
访问钥匙:
任何对该寄存器的写操作,
都必须同时
把
0x05FA
写入此段,否则写操作被忽略。若读取
此半字,则读回值为
0xFA05
。
15
[10:8]
ENDIANESS
PRIGROUP
R
R/W
-
0
指示端设置。
1
< br>:大端,
0
:小端。
优先级分组
i.
.w.
.
.. .
2
SYSRESETREQ
W
-
请求芯片控制逻辑产生一次复位
清零所有异常的活动状态信息。通常只在调试时
用,或都在
O
S
从
错误中恢复时用。
0
VECTRESET
W
-
复位
C
oretex-M3
微
控制器核。
1
VECTCLRACTIVE
W
-
表
2
.7
抢占优先级和次优先级分组位置的关系
分组位置
0
1
2
3
4
5
6
7
表达抢占优先级的位段
[7:1]
[7:2]
[7:3]
[7:4]
[7:5]
[7:6]
[7:7]
无
表达亚优先的位段
[0:0]
[1:0]
[2:0]
[3:0]
[4:0]
[5:0]
[6:0]
[7:0]
所有位
注:
表
2
.7
显
示了利用优先级的
8
个
位来配
置处理器优先级。
如果使用小于
8
的
位来配置处理
器
的优先级,则寄存器的低位始终为
0
,
例如,
如果使用
< br> 3
个位来配置优先级,
则
PRI_N[7:5]
用来配置
优
先级,而
P
RI_N[4:0]
为
4
‵
b0000
。
2.5.3
中断向量表
当发生了异常并且要响应它时,
Cortex-M3
需要定位其服务例程的入口地址。这此入口地址存储在
所谓“异常向量表”中。缺省情况下,
Cortex-M3
认为该表位于零地址处,且各向量占用
4
字节。因此
每个表项占用
4
字
节,复位后的向量表如表
2
.8
所
列。
表
2
.8
复位后向量表
地址
0x0000_0000
0x0000_0004
0x0000_0008
0x0000_000C
异常编号
-
1
2
3
MSP
的
初始值
复位向量(
PC
初
始值)
值(
32
位
整数)
NMI
服
务例程的入口地址
硬
f
ault
服
务例程的入口地址
…
…
其它异常服务例程的入口地址
向量表中的第
1
个
字为指
向堆栈栈顶的指针,复位时核读取该地址的数据设置主堆栈。
向量表的基
地址可以通过
N
VIC
中
的向量偏移寄存器(
0xE000ED08
)来设置,如表
p>
2
.9
所
示。从表
中可以看出,可以将异常向量表放在
C
ode
区
也可以将其放在
R
AM
区
,起始地址也可改变,起始地址是
有
要求的:
必须先求出系统中共有多少
个向量,
再把这个数字向上记到
2
的
整次幂
,
而起始地址必须对
齐到后者的边界上。例如,如果一共有
3
2
个
中断,则共有
3
2+16
(系统异常)
=48
个
向量,向上记到
2
的整数次幂后值为
6
4
,因此向量表重定位的地址必须能被
6
4 X 4=256
整
除。
i.
.w.
.
.. .
表
2
.9
向量偏移量寄存器(<
/p>
0xE000ED08
)
位段
29
7-28
名称
TBLOFF
TBLBASE
类型
R
R/
W
复位值
-
0
描述
向量表是在
C
ode
区
(
0
),还是在
R
AM
区
(
1
)
向量表的起始地址
向量表中至少需要有
4
个
值:<
/p>
栈顶地址;
复位程序的位置;
NMI <
/p>
异
常的位置;
硬故障的异常的位置。
p>
当
中断使能时,
不管向量表的位置在哪,它指向所有使能屏蔽的异常。
并且如果使用
S
VC
指
令,还
需要指定
S
VCCall ISR
的
位置。
2.5.4
异常的进入与退出
1
.异常进入
入栈:当处理器发生异常时,首先自动把
8
个
寄存器
(
xPSR
、
PC
、
LR
、
R12
< br>、
R3
、
R2
< br>、
R1
、
R0
< br>)压
入栈,
处理器自动完成,
在自动入栈的过程中,
把寄存器写入栈的时间顺序,
并不是写入空间相对应的,
但机器会保证正确的寄存器被保存到正确的位置,如图
2
.10
所
示
,
假设入栈,栈地址为
N
。
地址
N-8
N-4
N-32
N-28
N-24
N-20
N-16
N-12
数据
PC
PSR
R0
R1
R2
R3
R12
LR
时间
2.10
部入栈示意图
取向量:
发生异常,
紧接着核将根据向量表找出正确的异常向量,
然后在服务程序的入口处预取
p>
指,
处理器将取指与取数据分别能过总线
控制,
使入栈与取指这两项工作能同时进行,
以便快速进入中<
/p>
断。
更新寄
存器:入栈和取向量操作完成之后,在执行服务程序之前,还必须更新一系列寄存器。
SP
:在入栈后会把堆栈指针(
PSP
或
MSP
)更新到新的位置。在执行服
务例程时,将由
MSP
负责
对堆
栈的访问。
PS
R
:更新
IPSR
位段(地处
PSR
的最低部分)的值为新响应的异常编号。
PC
:在取向量完成后,
PC
将指向服
务例程的入口地址,
LR
:在出入<
/p>
ISR
的时候,
LR
的值将得到重新的诠释,这种特殊的值称
为“
EXC_RE
TURN
”,在异常进
入时由系统计
算并赋给
LR
,并在异常返回时使用它。
以上是在响应异常时通用寄存器及特殊功能寄存
器的变化。
另外在
NVIC
中,
< br>也会更新若干个相关寄
存器。
i.
.w.
.
.. .
2
.异常退出
当异常服务程序最后一条指令将进入异常时的
LR
的值加载到
PC
中。
该操作指示中断服务结束,
在
从异常返回时处理器将执行下列操作之一:
< br>如果激活异常的优先级比所有被压栈
(等待处理)
的异常
的优先级都高,
则处理器会末尾连锁到一
个激活异常。
如果没有激活异常,<
/p>
或者如果被压栈的异常的最高优先级比激活异常的最高优先级要高,
则处理器
返回到上一个被压栈的中断服务程序。
如果没有激活的中断或被压栈的异常,则处理器返回线程模式。
在启动了中断返回序列后,下述
的处理就将进行:
出栈:
先前压入栈中的寄存器在这里恢复。
部的出栈顺序与入栈时的相对应,
堆栈指针的值也改
< br>
回先前的值。
更新
NVIC
寄存器:
伴随着异常的返回,
它的活动位也被硬件清除。对于外部中断,
倘若中断输入
再
次被置为有效,悬起位也将再次置位,新一次的中
断响应序列也可随之再次开始。
异常返回值:异常返回值存放
在
LR
中。
这是一个高
28
位全为
1
的值,只有
p>
[3:0]
的值有特殊含
义,
如
表
2.10
所示。当异常服务例程把这个值送往
PC
时,就会
启动处理器的中断返回序列。因为
LR
的值是由
Cortex-M3
自动设置的,所以只要没有特殊需求,就不要改动它。<
/p>
表
2
.10 EXC_RETURN
各位含义
位段
[31:4]
3
2
1
0
含义
EXC_RETURN
的标识:必须全为
1
。
0=
返回后进入处理器模
1=
返回后进入线程模式。
0=
从主堆栈中做出栈操作,返回后使用
MSP
1=
从进程堆栈中做出栈操作,返回使用
PSP
。
保留,必须为
0
。
0=
返回
ARM
状态
1=
返回
Thumb
状态。
Cortex-M3
中必须为<
/p>
1
。
因此,上
述表格中
EXC_RETURN
的值有三种情
< br>况:
0xFFFF_FFF1:
返回处理器模式;
0xFFFF_FFF9:
返回线程模式,并使用主堆栈;
0xFFFF_FFFD:
返回线程模式,并使用线程堆
栈。
例如系统中使用了
PendSV
异常,服务程序结束
时由处理模式返回到线程模式前使用进程堆
栈,如
程序清单
L2.3
所示。
程序清单
L
2.3
异常返回类型实例
OSPendSV
?
?
LDR
LR,=0Xfffffffd
BX LR
;异常服务程序
;返回到线程模式进程堆栈
i.
.w.
.
.. .
2.5.5 Cortex-M3
异常处理机制
1
.末尾连锁
末尾连锁能够在两个中断之间没有
多余的状态保存和恢复指令的情况下实现异常背对背处理。
如图
2.11
所示。在退出
ISR
并进入另一个中断时,处理器省略了
8
个寄存器的出栈和入栈操作。如果当前
挂
起中断的优先级比所有被压栈的异常的优先级都高。
则处理
器执行末尾连锁机制。
如果挂起中断的优
先
级比被压栈的异常的最高优先级都高,
则省略压栈和出栈
操作,
处理器立即取出挂起的中断向量。
在
退
出前一个
I
SR
之
后,开始执行被末尾连锁的
I
SR
。
用户程序
优先级
3
中断
1
压栈
优先级
2
中断
2
中断
1
中断
2
中断
1
结束
出栈
图
2
.11
末尾连锁示意图
2
.异常迟来
在
C
ortex-M3
中
迟来中断的意思是如果前一个
I
SR
还
没
有进入执行阶段,
并且迟来中断的优先级比
< br>前一个中断的优先级要高,则迟来中断能够抢占前一个中断。如图
2
.12
所
示。
用户程序
优先级
3
中断
1
优先级
2
中断
2
中断
1
中断
2
压栈
继
续<
/p>
压
栈
出栈
图
2
.12
迟来异常示意图
响应迟来中断时需执行新的取向量地址和
I
SR
预
取
操作。
迟来中断不保存状,
因为状态保存已经被
最
初的中断执行过了,因此不需要重复执行。
i.
.w.