-
EFM32
Cortex-M3
参考手册
1.
简介
1.1
关于此文档
本文档提供了使用
EFM32
微处理器
ARM Cortex-M3
内核所需的信息。
EFM
32
设备内的具体实现细节可以参考手册和特定的设备数据表。
此文档适应于单片机
软件和硬件工程师,包括对
ARM
设备没有相关经验的人员。
1.2
关于
EFM32
Cortex-M3
处理器和核心外围设备
EFM32
Cortex-M3
处理
器是一个高性能的
32
位处理器,
是为
微处理器市场而
设计的。它为开发人员提供了显著便利,包括:
?
优秀的处理性能和快速中断处理
?
加强型系统与灵活的断点调试和跟踪能力
?
高效的处理器内核,系统和存储
?
超低功耗集成的睡眠模式
?
平台安全和存储保护单元(仅部分
设备可用)
。
Cortex-M3
处理器是建立在一个高性能的处理器内核,三级管道哈佛架构,
使它成为嵌入式应用程序的理想选择。
处理器通过一个高效的指
令集提供特殊工
作效率,广泛的优化设计,提供高端处理硬件包括单循环
32 x32
乘法和专用硬
件门。为了便于低成开发本
产品,
Cortex-M3
处理器采用紧耦合组件系统,降低<
/p>
处理器复杂度,同时显著改善中断处理和系统调试的能力。
Cor
tex-M3
处理器采
用一个版本
Th
umb
指令集,确保高密度代码,减少程序需求内存。
Cort
ex-M3
指
令集提供了一个新型
32
位架构,拥有良好性能。是高密度代码的
8
位
/16
位微
处理器。
Cortex-M3
处理器集成了一个可配置的嵌套中断控制器,提供行业
领先
的中断性能。
NVIC
包括屏敝中
断,并提供多达
8
个中断优先级级别。处理器核
心集成度高,
NVIC
提供快速执行中断服务程序,极
大地减少了中断延迟。这是
通过寄存器的硬叠加实现的。
拥有多
重装载和存储多重操作能力。
中断处理程序
不需要任何汇编存根
,以消除任何代码的
ISR
上的开销。
Tail-chaining
优化也
1
显著减少了从一个
ISR
切换到另一个
ISR
上的开销。降低功耗优化设计,
NVIC
集成与睡眠模式,包括
深度睡眠功能,能使整个装置迅速关机。
1.2.1
系统级接口
Cortex-M3
p>
处理器采用
AMBA
技术提供了多个高速接
口,访问内存时延降低。
它支持非对齐数据访问和原子位操作,
实现加快外围控制,
系统自旋锁和线程安
全的布尔数据处理。<
/p>
某些
EFM32
设备的
< br>Cortex-M3
处理器含有一个内存保护单元,
它提
供更好的内存控制,
使应用程序能够实现安全特权级别,
将逐个
任务处理中
的代码、
数据和堆栈分离。
这样的需求在许多嵌入式应用程序,
如自动化领域成
为关键。只
有在某些
EFM32
设备具备内存保护单元。
< br>
1.2.2
集成配置调试
Cortex-M3<
/p>
处理器实现了一个完整的硬件调试解决方案。通过
2
号引脚的串
行线调试端口,
提供了处理器和内存的高
系统可见性,
是微处理器和其他小封装
2
设备的理想选择。
为了跟踪系统处理器集成,
设计了一个数据监测点和一个分析
单位。
考虑到简化系统和整个系统分析的性价比,
串线
查看器可以导出软件生成
的消息流,
数据跟踪,
通过单个引脚分析信息。
嵌入式跟踪宏单元提供无与伦比
的指令跟踪,捕获范围远远小于传统跟踪单元。只有在某些
EFM32
设备具备
ETM
单元。
1.2.3
Cortex-M3
处理器特点和优点汇总
?
紧密集成的系统外围设备减少体积和开发成本
?
Thumb
指令集结合高密度代码和
32
位性能
?
ROM
系统
code-
patch
更新能力
?
系统组件电源控制优化
?
集成的低功耗睡眠模式
?
快速执行代码能降低处理器时钟或增加睡眠模式时间
?
硬件部门和快速的运算
?
对于时间要求严格的应用程序,中断处理性能高
?
对安全性要求苛刻的应用程序有内
存保护单元。
(只有在某些设备)
?
扩展调试和跟踪功能:串行线调试和串行线跟踪需要的引脚减少
1.2.4
Cortex-M3
核心外围设备
嵌
套矢量中断控制器:
矢量中断控制器是嵌入式中断控制器,
它支
持低延时中断
处理。
系统控制块:<
/p>
系统控制块是处理器的程序员模型接口。
它提供了系统实现信息和
系统控制,包括配置、控制和报告系统异常。
系统计时器:
系统定时器,
SysTick
是
24
位倒计时计时器。用作实时操作系统
ticl
定时器或作为一个简单的计数器。
内存保护单元:
内存保护单元,
通过定
义不同内存区域的内存属性提高系统可靠
性。
它提供了多达
p>
8
个不同区域和预定义的备选区域。
仅在某
些
EFM32
设备有内
存保护单元。<
/p>
3
1.2.5 EFM32
Cortex-M3
配置
不同的
p>
EFM32
系列的
ARM
Cortex-M3
外围设备包含不同的子集。
表
1.1
显示了不同
EFM
32
系列中包括哪些特性。
2. Cortex-M3
处理器
2.1
程序员模型
2.1.1
处理器软件执行模式和特权级别
线程
模式:
用于执行应用软件。处理器复位后进入线程模式。
p>
处理程序模式:
用于处理异常。处理器完成异常处理后返回线程模式
。
在线程模式下,
当软件处于特权或
非特权模式是,
控制寄存器工作。
在处理程序
< br>模式下,
软件总是按特权模式执行。
只有特权软件可以写
控制寄存器以修改执行
线程模式权限级别。
非特权的软件可以使
用
SVC
指令请求将控制权转移至特权软
件。
2.1.2
堆栈
处理器使用一个完整小端堆栈。
这意味着堆栈指针指示最后存放在内存数据
的地址。
当处理器将新的数据压入堆栈,
修改堆栈指针,
然
后写入新的内存地址。
处理器实现了两个堆栈,主堆栈和处理堆栈。详见
2.1.3.2
节。在线程模式下,
控制寄存器控制处
理器使用主堆栈还是使用处理堆栈。
详见
2.1.3.7
节。
在处理
程序模式下,处理器总是使用主要
的堆栈。处理器操作的选项如下:
4
2.1.3
核心寄存器
2.1.3.1
通用寄存器
R0-R12
是
32
位用于数据操作通用寄存器。
2.1.3.2
堆栈指针
R13
是堆栈指针寄存器。线程模式下,控制寄存器指示堆栈指针的第一比特
位用作:
p>
?
0
主要堆栈指针,这是重置值。
?
1
进程堆栈指针
复位后,处理器从地址
0 x00000000
处载入
MSP
的值。
2.1.3.3
链接寄存器
R14
用作链接寄存器。它存储子程序的返回信息,函数调用和异常处
理。在
复位时,处理器从
0 xFFFFFFFF
地址处载入
LR
的值。
5
2.1.3.4
程序计数器
R15
用作程序计数器。它包含当前程序的地址。
Bit[0]
的值总是
0
,因为指
令地址必须半字对齐。复位时,处理器从地址
0 x00000
004
处载入
PC
的复位向
量。
2.1.3.5
程序状态寄存器
程序状态寄存器包括:
?
应用程序状态寄存器
?
中断程序状态寄存器
?
执行程序状态寄存器
2.1.3.5.1
应用程序状态寄存器
APSR
包含上一条指令执行后,
当前状态条件标志。
它的属性详见寄存器汇总
表
2.2
。这
些位代表着:
6
2.1.3.5.2
中断程序状态寄存器
IPSR
包含当前中断服务例程的异常类型。其属性详见寄存器汇总在表
2.2
。
其比特位分配如下:
2.1.3.5.3
执行程序状态寄存器
EPSR
包含
Thumb
状态位,每个的执行状态位为
:
?
if
- then
指令
?
多重中断或多重存储指令的可持续中断指令
2.1.3.5.4
可持续中断指令
当执行
LDM
或
STM
指令时发生
中断,处理器做出如下动作:
?
停止加载多个指令操作或暂时存储多个指令操作
?
将下一个寄存器的操作数存到
p>
EPSR[15:12]
位
中断服务完成后,处理器做出如下动作:
?
返回到寄存器
[15:12]
位指出的位置
?
重新多个指令或存储指令的执行
当<
/p>
EPSR
保存
ICI
执行状态,
bits[26:25.11:10]
值为零。
7
2.1.3.5.5 if-
then
模块
if-then
模块包括紧跟
16
位
IT
指令的四条指令。
模块每条指令有条件执行。
指令的条件都是一样的,
或者可以从另一些指令转换过来。
< br>参看
3.9.3
获取更多
信息。
2.1.3.6
异常标志寄存器
异常标志寄存器禁止
处理器处理异常。
禁用那些可能会影响时钟关键任务的
异常。<
/p>
访问异常标志寄存器的指令是
MSR
和<
/p>
MRS
指令,
或用
CPS
指令改变
PRIMASK
或<
/p>
FAULTMASK
的值。
2.1.3.6.1
优先级屏蔽寄存器
PRIMASK<
/p>
寄存器通过配置优先级防止激活所有的异常。
2.1.3.6.2
错误屏蔽寄存器
错误标志寄存器防止所有异常被激活,非标志中断除外。
2.1.3.6.3
主要优先级屏蔽寄存器
BASEPR
I
寄存器定义了异常处理的最低优先级。当
BASEPRI
p>
设置为非零值,
它可以防止与
BASEPR
I
相同或更低的优先级值的异常被激活。
其属性详见寄存器
p>
8
汇总表<
/p>
2.2
。各位分配如下:
2.1.3
控制寄存器
控制寄存器控制堆栈的使用以及当处理器处于线程模式软件执行的特权级
别
。其属性见寄存器汇总表
2.2
。各位的分配如下:
处理程序模式通常使用
MSP
,所以在处理器模式下,处理器忽略向控制寄存器明
确写入活动堆栈指
针。
异常通过进入和返回机制更新控制寄存器。
在操作系统环<
/p>
境下,线程模式下线程运行使用处理堆栈,内核和异常处理程序使用主堆栈。
2.1.4
异常和中断
Cortex-M3
p>
处理器支持中断和系统异常。处理器和嵌套矢量中断控制器优先
考虑
并处理所有的异常。
一个异常改变软件控制的正常流动。
处理器
使用处理程
序模式来处理所有的异常,复位除外。
2.1.5
数据类型
处理器支持数据类型如下:
?
32
位字
?
16
位半字
?
8
位字节
?
支持
64
位数据传输指令
?
管理所有数据内存访问,低位优先。
9
2.1.6
Cortex
微处理器软件接口标准
对于
Cortex-M3
微处理器系统,
Cortex
微控制器软件接口标准定义如下:
一个共同的方法:
?
访问外围寄存器
?
定义异常向量
名称如下:
?
核心外设的寄存器
?
核心异常向量
?
RTOS
内核设备独立的接口,包括一个调试频道。
CMSIS
包括
Cortex-M3
处理器核心的外围设
备的地址和数据结构定义。
它还包括
可选的中间件组件接口,包
括一个
TCP/IP
堆栈和一个
Fla
sh
文件系统。
CMSIS
通过启用模
板代码的重用和
CMSIS
兼容的各种中间件供应商软件组件简
化软件
开发。
软件供应商可以扩展
CM
SIS
包括外围定义和外围设备的访问功能。
本文档
包括
CMSIS
定义的寄存器的名称,并给出简短
的处理器内核和核心外围设备
CMSIS
功能描述。
2.2
内存模型
本节描述处理器内存映射,
内存访问的行为和条带特性。处理器有一个固定
的内存映射,提供多达
< br>4GB
的可寻址内存。内存映射如下:
2.2.1
内存区域、类型和属性
内存映射和微
处理器的程序设计将内存映射到区域。
每个区域都有定义的内
存
类型,
并且一些区域有附加的内存属性。
内存类型和属性决定访
问区域的行为。
内存类型如下:
<
/p>
正常:
处理器可以安排读取顺序以提高效率或执行随机读取。
p>
设备:
处理器根据相关设备预定义访问顺
序或强制内存顺序。
强制模式:
处理
器根据所有相关设备安排访问顺序。
10
永远执行:
< br>这意味着处理器阻止指令访问。任何试图从一个
XN
区域
取一条指令
将导致内存管理错误异常。
2.2.2
内存访问的内存系统排序
对于内存访
问指令的大多数内存访问,
存储系统不保证访问的顺序与程序的
指令顺序完全匹配,
这并不影响指令序列的行为。
通常,
正确的程序执行取决于
程序中两次内存访问的顺序。
< br>在内存访问指令中必须插入一个内存分割指令。
详
见
p>
2.2.4
单元。
然而,
< br>存储系统确实需要保证某些设备的访问顺序和强制内存访
问。对于两个内存访问指
令
A1
和
A2
,在程序顺序中,
A
发生在
A2
之前,内存访
问顺序如下:
11
2.2.3
内存访问的行为
内存映射中,访问各个每个区域的方法如下:
2.2.4
内存访问的软件排序
<
/p>
程序流中的指令顺序并不总能保证相应的内存访问顺序。这是因为:
?
处理器可重新定义一些内存访
问以提高效率,这并不影响指令序列的行为。
?
处理器有多个总线接口
?
内存映射中,内存或设备有不同的等待状态
?
一些内存访问是缓冲或随机的
2.2
.2
单元简要介绍几个例子,关于存储系统如何保证访问顺序。当内存访问的
顺序很重要时,
软件必须包括内存分割指令用来强制访问顺序。
处理器提供了以
下几种内存分割指令:
DMB
:
数据内存分割指令确保很好地完成之前
的连续续内存事务。
DSB
:
数据同步分割指令确保很好地完成内存事务后续的指令执行。
ISB
:
指令同步分割确保完成的内存事物被
后续指令认可的效果。
内存分割指令的使,例如:
MPU
编程:
?
使用
DS
B
指令确保在上下文切换时微处理器立即出现的效果。
?
使用
IS
B
指令确保微处理器编程区域新的设置立即生效的,
如果使用分
支或
调用访问微控制器配置代码,如果微控制器配置使用异常机制输入代码,那
么
ISB
指令不是必需的。
12
?
变量表。如果程序改变变量表中的
一个条目,使用相应的异常,就用
DMB
指
令进行操作。这将保证异常发生后,后立即启用处理器新的异常向量。
?
自适应代码。如果一个程序包含自
适应代码,使用
ISB
指令立即修改的代码
程序。这样可以确保后续指令执行更新后的程序。
?
内存映射转换。如果系统包含一个
内存映射转换机制,使用
DSB
指令切换程
序中的内存映射。这样可以确保后续指令时执行使用更新后的内存映射。
?
动态异常优先级变化。当一个异常
等待或活动时,异常优先级发生改变,使
用
DSB
指令。这样可以确保
DSB
指令完成后,更改生效。
?
在多主
机系统使用一个信号量。如果系统包含多个主控总线,例如,如果系
统中已经存在一个处
理器,
每个处理器在信号指令完成后必须使用
DMB
指令,
以确保其他总线主控知道内存事物的顺序执行。
2.2.5 Bit-banding
bit-band
区域将
bit-
band
别名地区每个字映射成
bit-
band
地区的一位。
bit-ba
nd
区域占据内存存储器和外围地区最低
1MB
空间。内存映射区域将两个
32MB
别名映射到两
p>
1MB bit-
band
区域:访问
32MB
SRAM
别名映射到
1MB SRAM
bit-band
区域,如表
2.12
所示
下面的公式表明,别名区域怎样映射到
bit-
band
区域:
bit_word_offser = (byte_offset x 32) +
(bit_number x 4)
bit_word_addr =
bit_band_base + bit_word_offset
其中:
?
bit_word_offser
是
b
it-band
内存区域目标点的位置。
?
bit_word_addr
p>
是别名映射到目标位的字的地址。
13
?
bit_band_base
是别名区域的起始地址。
?
byte_offset
是
bit-
band
区域的字节数。
?
bit_number
是比特的位置,目标为的
0
到
7
。
2.2.5.1
直接访问一个别名区域
向别名区域写入一个字会更新
bit-band
区域的位。写入字的
Bit[0]
的值决
定
bit-band
区域的的目标位。
如果写入字
Bit[0]
的值为
1
,
则
bit-band
值为
1
,
如果写入字<
/p>
Bit[0]
的值为
0
< br>,
则
bit-band
值为
p>
0
。
别名区域字
B
it[31:1]
位对于
bit-
band
没有影响。写
0
x01
写
0
xff
具有相同的效果。写
0
x00
写
0 x0e
是
一样的。读别名区域的一个字:
?
0x00000000
表明目标位
bit-
band
地区设置为
0
?
0x00000001
表明
bit-
band
地区目标位设置为
1
2.2.5.2
直接访问一个
bit-
band
地区
2.2.3
单元描述了直接访问
bit-
band
地区字节、半字或字的行为。
2.2.6
内存字节顺序
处理器将内存视为从
0
字节编号按升序的线性集
合。
例如,
字节
0-3
存放第一个
存储字,
字节
4-
7
存放第二个存储字。
2.2.6.1
单元描述的数据都存储在内存中。
2.2.6.1
低位优先格式
EFM32
使用小端格式,处理器先存储字的最低有效字节的序号最小的字节,最后
存
放要最高编号的最高字节。例如:
14
2.2.7
同步原语
Cortex-M3
指令集包括双同步原语。提供一个非阻塞的机制,可以使
一个线
程或进程获得独家访问内存。
软件可以使用它们来实现读
修改内存更新序列,
或
者作为一个信号量机制。一对同步原语遵
从:
Load-Exclusive
指令:
用于读取一个内存位置的值,请求独占访问这个位置。
Store-Exclusive
指令:
用于试图写入相同的内存位置,返回一个状态位到寄存
器。如果该位为:
?
0
表明线程或进程获得独家访问内存,写成功
?
1
表明线程或进程并未获得独占访问内存,没有写
一对
Load-
Exclusive
和
Store-
Exclusive
指令:
?
字指令
L
DREX
和
STREX
?
半字指令
LDREH STREH
?
字节指令
LDREXB
和
STREXB
软件必须使用
Load-
Exclusive
指令和相应的
Store-
Exclusive
指令。
实现内存
位置读
-
修改
-
写,软件必须:
1.
使用
Load-
Exclusive
指令读取位置的值。
2.
根据需要更新值。
3.
使用一个
Store-Exclu
sive
指令在内存位置写入新的值,并测试返回的状态
位。如
果这个位是:
?
0
读
-
修改
-
写成功完成
?
1
没有
执行写操作。这表明步骤
1
返回的值可能超时了。软件必须重新
执行
读
-
修改
-
写序列。
软件可以使用同步原语实现如下信号量:
1.
使用
Load-
Exclusive
指令从信号读取地址检查信号是否空闲。
2.
如果信号空闲,使用一个
Stor
e-Exclusive
指令向信号量的地址写声明值。
p>
3.
如果步骤
2
返
回的状态位表明
Store-Exclusive
指令成功执行
,
软件就声明这
个信号量。但是,如果
Store-Exclusive
指令执行失败,软件执行步骤
1
后,另
15
一个进程可能已经声称这个信号量。
cortex-M3
包含一个独占访问监控器,表明
处理器是否
执行
Load-
Exclusive
指令。处理器将其独占访问标记,如果:
?
它执行一个
CLREX
指令
?
它执行一个
Store-
Exclusive
指令,无论是否写成功
?
发生异常,这意味着处理器可以解决不同线程之间的信号冲突。
2.2.8
同步原语的编程提示
ANSI
p>
C
不能直接生成独占访问指令。
一些
C
编译器可以生成这些指令的内部
功能:
p>
实际的独占访问指令生成依赖于指
针传递给内部函数的数据类型。
例如,
下面的
< br>C
代码生成需要
LDREXB
操
作:
_ldrex((volatile char * )
0xFF);
2.3
异常模型
本节描述异常模式。
2.3.1
异常状态
异常是下列状态之一:
不活跃:
异常不活跃不等待。
等待:
异常等待处理器服务。
活跃:
处理器正在处理一个异常,还没有完成。
活跃和等待:
处理器正在处理异常,并且还有一个同一来源
的异常正在等待。
16
2.3.2
异常类型
异常类型有:
复位:
系统启动或热复位时调用复位。
异常模型将复位视为一个特殊形式的异常。
p>
在复位声明时,
处理器的停止操作,
可能在
一条指令执行时的任意阶段。
复位结
束时,从复位向量表进入的
地址执行重启。在
Thread
模式重启作为线程特权执
行。
NMI
:
p>
EFM32
设备中,不可屏蔽中断只能由软件引起。这是除了复位外
最高优先
级的异常。它是永久使能的,优先级为
-2
。
NMI
不能是:
?
被其他异常屏蔽或阻止激活
?
抢占复位以外的任何异常
硬故障:<
/p>
硬故障在异常处理中发生错误的一种异常。
或是因为一个异常不能
被其
他任何异常机制管理。硬故障固定优先级为
1
,这意味着它具有可配置优先级并
且比任何异常具有更高的优先级。
内存管理错误:
内存管理错误是一种异常,<
/p>
是由于内存保护相关的故障。
在指令
和数
据存储的事务中,
微处理器或固定内存保护约束导致了这个错误。
这个故障
是用来中止执行指令访问禁止的内存区域,即使在微处理器禁用的情况下。<
/p>
总线故障:
总线故障是一种异常,
p>
是由于与内存相关错误指令或数据存储事务导
致的,也可能是存储系
统中总线检测的错误导致的。
使用错误:
使用错误是一种发生在相关指令执行错误的一种异常。它包括:
?
未定义指令
?
一种非对齐访问
?
指令执行无效状态
?
异常返回一个错误。
SVCall<
/p>
:
SVCall
是由
SVC
指令引发的一种异常。在一个操作系统环境中,应用
程序可以使用
SVC
指令访问操作系统内核函数和设备驱动程序
。
PendSV
:
< br>PendSV
是一个中断驱动的系统级服务请求。在操作系统环境下,当没
有其他异常活跃时,使用
PendSV
上下文
切换。
SysTick
:
SysTick
异常是系统定时器达到零的一种异常。软件还可以生成一个
17
S
ysTick
异常。
在一个操作系统环境中,
< br>处理器可以使用这个异常作为系统时钟。
中断
(IRQ)
:
中断或
I
RQ
,是由外围异常信号,或由软件生成请求产生的一种异
常信
号。
所有的中断都是异步中断指令执行。
在系统中,
外围设备使用中断与处
理器通信。
2.3.3
异常处理程序
处理器处理异常使用:
中断服务程序
:
中断
IRQ0
到
IRQ(n - 1)
是设备中断数量给出的,表
1.1<
/p>
给出由
ISRs
处理的异常。
错误处理程序:
硬故障,内存管理错误,使用错
误,总线故障都是由故障处理程
序处理的错误异常。
系统处理程序:
NMI
,
PendSV
,
SVCall
,
p>
SysTick
都是由系统处理程序处理的系
统异常。
2.3.4
向量表
向量表包含堆栈指针的复位值
和启动的地址,
对于所有异常处理程序也称为
异常向量。
图
2.2
显示了异常向量表中向量的顺序。<
/p>
每个向量的最低有效位必须
1
,表明异常
处理程序使用
Thumb
代码。参数
n
表示设备的中断次数,由表
1.1
给出
。
18
2.3.5
异常优先级
如表
2.15
所示,所有的异常都有一个相关的优先级:
?
一个低优先级的值指示一个更高的优先级
?
所有异常中可配置的优先级为除了复位,硬故障和
NMI
p>
如果软件没有配置任何优先级,
那么所有的异常有一个可配置的优先
级,
优先级
为
0
。
例如,
将一个更高的优先级值分配给
IRQ[0]
,
将一个较低的优先级值分配
< br>给
IRQ[1]
,意味着
IRQ
[1]
的优先级高于
IRQ[0]
。如
果
IRQ[1]
和
IRQ[0]
都声明,
IRQ[1]
在
IRQ[0]
之前处理。如果多个等待的异常具有相同的优先级,最低标号
的等待异常优先。
例如,
如果
< br>IRQ[0]
和
IRQ[1]
都
在等待,
它们有相同的优先级,
那么
I
RQ[0]
在
IRQ[1]
之前处理。
当处理器执行异常处理程序时,如果一个高优
先级的异常发生,
异常处理程序被抢占。
如果发生的异常和异常处理程序具有相
同
的优先级,不管异常的数量,处理程序不被抢占。但是,新的中断的等待状态
改变。
p>
2.3.6
中断优先级分组
为了增加中断系统的
优先级控制,
NVIC
支持优先级分组。
这每个中断优先级
寄存器条目分为两个部分:
?
上层领域定义组的优先级
?
下层领域定义组内的更高优先级
只有
组的优先级才能决定中断异常抢占。当处理器执行一个中断异常处理程序,
同一组的相同
优先级的另一个中断不抢占处理器。
如果多个等待中断有相同的组
优先级,
subpriority
字段决定了它们的处理顺序
。如果多个等待中断有相同的
组优先级和
subpriorit
y
,最低
IRQ
编号的中断优先处理。
2.3.7
异常项和返回
异常处理的描述使用以下条款:
抢占
:
当处理器执行和异常处理程序,
一个异常的优先级高于正在被
处理的异常,
则它可以抢占异常处理程序。有关更多信息,请参见
2.3.6
。
19
返回:
发生在异常处理程序完成后,以及:
?
没有等待异常或优先级不够
?
异常处理程序完成之后没有处理延迟到来的异常
Tail-chaining
:
这种机
制加速异常服务。完成异常处理程序后,如果有一个等
待异常满足异常项,跳过堆栈并控
制转移到新的异常处理程序。
延时到达:
这种机制加速抢占。
如果一个高优先级的异常发生在存储之前异常状
态,
处理器切换处理高优先级的异常,
并初始化的向量
以获取异常。
状态保存不
受延时异常影响,
因为异常状态保存是相同的。
因此状态保存持续不间断。
处
理
器可以接受一个迟到的异常,
直到处理器的原始异常的异常处
理程序的第一个指
令进入执行阶段。当异常处理程序处理延时异常返回时,通常
tail-chaining
规则适用。
2.3.7.1
异常项
一个等待的异常有足够优先级时,异常项发生。或者:
?
处理器处于线程模式
?
新的异常比正在处理的异常具有更
高的优先级,在这种情况下,新的异常抢
占原来的异常。
p>
当一个异常就抢占另一个异常,
此异常是嵌套。
足够的优先级是指异常的优先级
比屏蔽寄存器规定的优先级要高。
< br>详见
2.1.3.6
节。
当异常
的优先级低于规定时,
处于等待状态,处
理
器不进
行
处理。
如
果处理器
受理,
除非这个异
常
是
tail-chained
或延时到达的异常,处理器将信息
存入当前堆栈。这个操作称为
叠加,八数据字的结构称为堆栈帧。堆栈帧包含以下信息:
?
R0-R3, R12
?
Return address
?
PSR
?
LR
叠加之后,
堆栈指针指出堆栈帧
的最低地址。
除非堆栈线条被禁用,
堆栈帧是一
致双字地址。如果
STKALIGN
控制寄存器的配置
设置为
1
时,堆栈对齐调整在叠
20
加期间执行。
堆栈帧包括返回地址。
这是下一个中断程序的指令的地址。
这个值
在异常返回恢复到
PC
,中
断程序重新执行。在平行叠加操作
,
处理器执行一个向
量获取读取异常处理程序从向量表起始地址。
当完成叠加,
处理器开始执行异常
处理程序。
同时,
处理器向
LR
寄存器写
EX
C_RETURN
的值。
这表明堆栈帧对应的
< br>堆栈指针以及在异常项发生前处理器处于什么操作模式。
在异常中,
如果没有更
高优先级的异常发生,
处理器开始执行这
个异常的异常处理程序,
不改变前面的
等待异常的状态。这是延
时的情况。
2.3.7.2
异常返回
异常返回发生在处理器处于
处理程序模式,执行以下几种指令之一,加载
EXC_RETURN
的值到
PC
。
?
出栈指令包含
PC
?
任何寄存器的
BX
指令
?
一个以
P
C
为目的
LDR
或
LDM
指令
在异常项中,
加载到
LR
是
EXC
_RETURN
的值。
当处理器完成异常处理程序时,
异
常机制依赖于这个值来检测。这个值的最低四位提供返回堆栈信息和处
理器模
式。表
2.16
显示了
EXC_RETURN[3:0]
的值和异常返回行为的描述。处理器将
EXC_RETURN
的
[31:4]
位设置为
0xFFFFFFFF
。
p>
当这个值加载到
PC
表明处理器完成
异常处理,并且处理器初始化异常返回序列。
2.4
错误处理
错误是异常的一个子集,见
2.3
节。下列情况将产生一个错误:
总线错误
:
?
指令取出或向量表加载
?
数据访问
?
一个内部检测到错误,如未定义指
令或试图改变
BX
状态的指令
?
试图在内存标记为不可执行区域去执行一条指令
?
特权故障或由于违反或企图访问非管理区域导致的微处理器错误
21
2.4.1
错误类型
表
2.17
显示错误的类型,对应的处理程序和相应
的错误状态寄存器,以及显示
错误发生的寄存器位。有关更多信息,请参见单元
4.3.11
错误状态寄存器。
2.4.2
错误升级和硬件错误
所有错误异常,
除了硬件错误,都有可配置异常优先级,详见到
4.3.9
节。
软件可以禁用这些错误处理程序的执行。
通常,
异常优先级加上异常屏蔽寄存器
的值,
决定了处理器是
否进入错误处理程序,
以及错误处理程序是否能抢占另一
个错误
处理程序。
如
2.3
节所述。
在某些情况下,
一个具有可配置优先级的错误
被
当作一个硬故障。
这就是所谓的优先升级,
错误被描述为升级的
硬错误。
升级
硬件错误发生在:
?
错误处理程序被服务时会导致同样
错误。
这个升级硬故障是因为一个错误处
理程序不能抢占本身,
因为它必须具有与当前优先级相同的优先级
?
错误处理程序会导致错误或低优先
级相同。
这是因为新的故障的处理程序不
能抢占当前执行的错误
处理程序
?
一个异常处理程序的优先级相同或低于当前执行的异常会导致错误
?
错误发生,但处理程序不启用
总线错
误处理程序进栈时,
发生总线错误,
总线错误不升级为硬件错误
。
这意味
着是一个堆栈损坏导致故障,
故障处理程序执行失败。
错误处理程序操作,
但堆
栈内容损坏。
2.4.3
错误状态寄存器和错误地址寄存器
错
误状态寄存器指示故障的原因。总线错误和内存管理错误,错误地址寄存
器表示操作地址
访问导致的故障,如表
2.18
所示。
22
2.4.4
死锁
当执行
NMI
或错误处理程序时发生错误,处理器进入死锁状态。当处理器处
< br>于死锁状态时,它不执行任何指令。处理器处于锁住状态,直到:
?
复位
?
NMI
发生
2.5
电源管理
< br>Cortex-M3
处理器睡眠模式降低功耗:
?
睡眠模式停止处理器时钟
?
深度睡眠模式停止高频振荡器和<
/p>
HFPERCLK/HFCORECLK
以及闪存。
深度睡眠模式
SLEEPDEEP
的
SCR
位用来选择启用哪种睡眠模式,参见
4.3.7
节。
关于睡眠的行为模式的更多信息
参见设备参考手册的
ENMU
文档。本节描述进入
睡眠模式机制,并从睡眠模式中醒来的条件。
2.5.1
进入睡眠模式
本节描述软件可以使处理器进入睡眠模式的机制。
系统可以生成虚假唤醒
事
件。例如,调试操作唤醒处理器。因此,软件必须处理这个事件后使处理器回到
睡眠模式。程序可能用一个空闲循环使处理器回到睡眠模式。
2.5.1.1
等待中断
等待中断指令,
WEI
,使直接进入睡眠模式。
当处理器执行
WFI
指令时,停
23
止执行指令,进入睡眠模式。
有关更多信息,参见
3.10.12
节。
2.5.1.2
等待事件
p>
等待事件指令,
WFE
,使用
one-bit
事件寄存器的值进入睡眠模式。处理器执行
< br>WFE
指令时,它会检查这个寄存器:
?
如果寄存器是
0
,处理器停止执行指令并进入睡眠模式
?
如果寄存器是
1
,处理器清除寄存器为
0
,继续
执行指令并不进入睡眠模式
如果事件寄存器值为
1
,表明
WFE
指令执行时
,处理器禁止进入睡眠模式。通常
情况下,这是因为处理器有一个
SEV
指令执行,详见
3.10.9
节。软件不能直接
访问这个寄存器。
2.5.1.3 Sleep-on-exit
如果
SLEEPONEXIT
的
SCR
位设置为
1
,当处理器完成异常处理程序返回线程<
/p>
的执行模式时,
就立即进入睡眠模式。
使
用此机制的应用程序只需发生异常时处
理器运行。
2.5.2
从睡眠模式唤醒
处理器唤醒的条件取决于导致它进入睡眠模式的机制。
2.5.2.1
从
WFI
或
sleep-on-exit
2.5.2.1
唤醒
通常情况下,<
/p>
处理器只有当它检测到一个异常有足够的进入异常项的优先级,
就
会唤醒。一些嵌入式系统,处理器唤醒后,在执行一个中断处理程序之前,可能
需要执行系统恢复任务。为此将
PRIMASK
位设置为
1
,将
FAULTMASK<
/p>
位为
0
。如
果一
个中断到来,
并且它的优先级高于当前异常的优先级,
处理器唤
醒后不执行
中断处理程序,
直到处理器
PRIMASK
设置为零。
关于
PRI
MASK
和
FAULTMASK
的更<
/p>
多信息,详见
2.1.3.6
节。
2.5.2.2
从
WFE
唤醒
处理器被唤醒,如果:
?
它检测到一个异常有导致异常条目的足够优先级
24
?
在多处理器系统中,系统中的另一
个处理器执行一个
SEV
指令
此外,
如果
SEVONPEND
的
SCR
位设置为
1
时,
任何新的等待中断触发一个事件就
会唤醒
处理器,
即使中断禁用或产生异常项的优先不足。
有关
SCR
的更多信息参
见
4.3.7
节。
2.5.3
唤醒中断控制器
唤醒中断控制器可以检测一个中断,
使处理器从深度睡眠模式中唤醒的
外围
部分。只有当
DEEPSLEEP
的
SCR
位设置为
1
< br>时,
WIC
使能,详见
4.3.
7
节。
WIC
不可编程,没有任何寄存
器或用户界面。它是完全由硬件信号操作的。当
WIC
使能,处
理器进入深度睡眠模式时,系统中的电源管理单元可以将
Cortex-M3
处理器大部分断电。对于停止
SysTick
计时
器有副作用。
WIC
接收一个中断时,
在处理中断之前,
需要大量的时钟周期唤醒处理器恢复它的状态。
这意味着深度
睡眠模式的中断时延增加。
2.5.4
电源管理编程提示
ANSI
C
不能直接生成
WFI
和
WFE
指令。
CMSIS
提供了这些指令的下列固有功
能:
Void_WFE(void) // Wait for Event
Void_WFI(void) // Wait for Interrupt
3
Cortex-M3
指令集
3.1
指令集总结
处理器实现了
Thumb
指令集的一个版本,表
3.1
列出它所支持的指令。
3.2
指令功能
< br>ANSI
不能直接访问一些
Cortex-M3
指令。
本节描述的内部功能,
它可以生成
这些指令,
由
CMIS
或
C
编译器提供。
如果一个
C
编译器不支持适当的固有功能,
你可能不得不
使用内联汇编程序访问一些指令。
CMSIS
提供了以下内部函
数来生
25
成
ANSI
不能直接访问指令:
3.3
指令的描述
本节将介绍使用指令的更多信息。
3.3.1
操作数
一条指令操作数可以是一个
ARM
寄存器,一个常数,
或另一个
instruction
specific
的参数。指令作为操作数时,经常在目的地寄存器存储结果。指令有
一个
目的寄存器时,
它通常是在操作数中指定的。
在某些指令中操作
数是灵活的,
它们可以是一个寄存器或一个常数。详见
3.3.
3
节。
3.3.2
使用
PC
或
SP
限制
是否可以使用程序计数器或堆栈指针寄存器作
为操作数的目的地址,
许多指
令有限制。有关更多信息,请参见
说明书。
3.3.3
灵活的第二个操作数
26
许多通用的数据处理指令有灵
活的第二个操作数。本节描述
Operand2
的每
条指令的语法。
Operand2
可以是:
?
Section 3.3.3.1
?
Section 3.3.3.2
3.3.3.1
常量
指定一个
Operand2
常数的形式:
#constant
常量可以是:
?
任意常数,将
32#
比特字左移
8#
比特的值<
/p>
?
0x00XY00XY
任何常数的形式
?
0xXY00XY00
任何常数的形式
?
0xXYXYXYXY
任何常数的形式
此外
,
指令数量很小时,常数可以去更
大范围的值。这些都是在单独指令描述中
的提到过。
Opera
nd2
常量用在
MOVS
,
MVNS
,
ANDS
,<
/p>
ORRS
,
EORS
,
BICS
,
TEQ
或
TST
这些指令中,更新常量的进位标记位
bit[31]
。如果常数大于
255
,可以由
一个
8
位值
移位得到。如果
Operand2
是其他常数,这些指令不影响
进位标记。
3.3.3.1.1
指令替换
汇编程序可以产生一个等价
的指令,以防指定一个不允许的常数。例如,一
个汇编程序可能用
CMP Rd
,
#0xffffffff
等指令替换
CMN Rd
,
#0x
2
。
3.3.3.2
寄存器转移选项
<
/p>
您指定
Operand2
寄存器的形式:
Rm {, shift}
其中:
Rm
:
是寄存器的第二个操作数的数据
27
转移:
是一个用于
Rm
的可选转移。是下列之一:
< br>
?
ASR #n
算术右移
n
位,
1 #
n # 32
?
LSL #n <
/p>
逻辑左移位
n
位
,1 # n # 31
?
LSR
#n
逻辑右移位
n
位,
1 # n # 32
?
ROR # n
向右旋转
n
位,
1 # n # 31
?
RRX
向右旋转一位,带扩展
?
-
缺省,没有发生转变,相当于
LSL # 0
如果省略的转移,或指定
LSL #0
,指令使用
Rm
的值。
如果你指定一个转移,
这个转移用
Rm
的值,
以及使用指令产生的
32
位值。
然而,
寄存器
Rm
的内容保持不变。指定寄存器转移时,也更新某些指令进位标记。
3.3.4
移位操作
寄存器移位操作将寄存器中
的比特位向左或向右移动指定数量位,改变长
度。寄存器的转变实现有以下几种情况:<
/p>
?
由
ASR
,
LSR
,<
/p>
LSL
和
RRX
指令直接执行,并将结果写入目的寄存器
?
在
Ope
rand2
的计算过程中,
指定第二个操作数的指令作为一个寄
存器移位,
详见
3.3.3
节。结果也
用于指令
实现移位长度决定于移位类型和转移指令,
详见单独指令描述或
3.3.3
节。
如果
移位长度为
0
,不发
生移位。寄存器移位操作影响进位标志,除非指定的移位长
度为
0
。
以下描述各种操作以及它们是如何影响进位标记。
Rm
寄存器包含移位的
值,
n
是移位的长度。
3.3.4.1 ASR
算术右移将
Rm
寄存器的左边
32-n
的
n
位移动到右边。
将原始
[31]
位复制到
寄存器左
#n
p>
的结果。参见图
3.1
。您可以使用
ASR # n
操作寄存器中的值
Rm
除
以
2^n
,
结果指向负无穷。
当指令是
ASR
#n
或者
ASR
#n
用于
Operand2
中的<
/p>
MOVS
,
MVNS
,
ANDS
,
ORRS
,
ORNS
,
BICS<
/p>
,
TEQ
或
TS
T
指令时,移位最后位进位标志更新,
有些
Rm
寄存器是
bit[n-1]
位
。
28
3.3.4.2 LSR
逻辑右移,将寄存器
Rm
左边
32-n
位移到右边
n
的地方,右边
32 - n
位的
结果。设置的左
#
手
n
位结果为
0
。参见图
3.2
。您可以使用
LSR
#
n
操作寄存器
中的值
Rm
除以
2^n
,如果该值被认为是一个无符号整数。
LSR
指令
或者当
LSR
#
n
用于
Operand2
指令
M
OVS
,
MVNS
,
< br>ANDS
,
ORRS
,
ORNS
,
EORS
,
BICS
,
TEQ
,
TST
,
更新移位最后位的进位
标记,有些
Rm
寄存器是
bit[n-
1]
位。
3.3.4.3 LSL
逻辑左移将
n
位移动右边
32-n
位寄存器
Rm
,
到左边
32-
n
位的结果。
设置右
边
n
位的值为
0
。参见图
3.3
。您可以使用
LSL # n
操作寄存器中的值
Rm
乘以
2
^
n,
如果该值被认为是一
个无符号整数或二进制补码带符号整数。
溢出可能发生
没有警告
。使用
LSLS
指令,或者当
LSL<
/p>
用于
Operand2
的
MOVS
,
MVNS
,
ANDS
,
ORRS
,
ORNS
,
EORS
,
BICS
,
TEQ
,
TST
指令,寄存器
Rm
的
bit[32-n]
的进位标志
更新。使用
LSL #
0
时,这些指令不影响进位标记。
29
3.3.4.4 ROR
循环右移
n
位,移动寄存器
Rm
左边
32-n
的
n
位到
32-n
的右边。将寄存器
右边
n
位移到左边。参见图
3.4
。使用
ROR
指令,或
ROR # n
用于
Operand2
的
MOVS
,
MVNS
,
p>
ANDS
,
ORRS
,
ORNS
,
EORS
,
BICS
,
TEQ
,
TST
指令,
寄存
器
Rm
的
bit[n-1]
进位标志更新。
3.3.4.5 RRX
扩展的循环右移将
< br>Rm
寄存器的位向右移动
1bit
。它将进位标志复制到结果
bit[31]
。
参见图
3.5
。
使用
RRXS
指令或者当
RRX
用于
Operand2
的
MOVS
,
MVNS
,
ANDS
,
ORRS
,
ORNS
,
EORS
,
BICS
,
TEQ
,
TST
指令时,
Rm
< br>寄存器进位标志
bit[0]
更新。
3.3.5
地址对齐
一个对齐的访问是这样操作的,字对齐地址用于一个字,双字或多个字的访
问
。半字对齐地址用于半字访问。字节访问总是对齐的。
Cortex-M3
处理器只支
持以下指令的对齐访问:
?
LDR, LDRT
?
LDRH, LDRHT
?
LDRSH, LDRSHT
?
STR, STRT
30
?
STRH, STRHT
其他所有装载和存储指令如果他们执行未对齐访问生成使用故障异常,
因此他们
的访问必须地址对齐。关于错误的更多信息请参见
2.
4
。非对齐访问通常慢于对
齐访问。此外,一些内存区域可能不
支持非对齐访问。因此,
ARM
建议程序员确
< br>保访问是对齐的。
为了避免非对齐的意外访问,
对所有对
齐访问,
在配置和控制
寄存器使用
UN
ALIGN_TRP
位构造陷阱,详见
4.3.8
节。
3.3.6
p>
与
PC
相关的术语
与
PC
相关的术语是代表一条指令的地
址或文字数据的标志。它代表指令的
PC
值或位移量的大小。汇
编程序从标签和当前指令的地址计算所需的偏移量。
如果偏移量太大,汇编程序产生一个
错误。
3.3.7
条件执行
大多数数据处理指令可以根
据操作的结果更新应用程序状态寄存器的状态
标志,参见
2.1
.3.5.1
节。有些指令更新所有标志,有些只更新一部分。如果一
< br>个标志没有更新,
那么保留了原始值。
详见标志对指令的
影响描述。
你可以有条
件地执行一条指令,基于在另一个指令中
设置的状态标志,或者:
?
指令执行后立即更新标志位
?
任意数量的干预指令没有更新标志位
条件执行可以通过使用条件分支或通过添加后缀条件代码指令。
见表
3.4
的后缀
列表添加到指令使其有条件的说明。
条件代码后缀使处理器测试基于一个条件的
标记。如果条件指令的条件测
试失败,那么指令:
?
不执行
?
不向目的寄存器写任何值
?
不影响任何标志位
?
不产生任何异常
条件指令,除了条件分支机构,必须包含在一个
if
-
then
指令块中。有关更多
p>
信息,
请参见
3.9.3
< br>节,
使用
IT
指令的限制。
p>
如果在条件指令之外有
IT
指令块,
31
汇编程序
会自动插入
IT
指令。
使用
CBZ
和
CBNZ
指令比
较寄存器的零值以及分支
上的结果。
本节描述了:
?
Section 3.3.7.1
?
Section 3.3.7.2
3.3.7.1
状态标志
APSR
包含以下条件标志:
N
设置为
1
时,操作的结果是负数,否则清除为
0
。
Z
设置为
1
时,操作的结果为零,否则清除为
0
。
C
设置为
1
< br>时,操作产生进位,否则清除为
0
。
V
设置为
1
< br>时,操作产生溢出,否则清除为
0
。
进位发生在:
?
如果添加的结果大于或等于
2 ^ 32
?
如果减法的结果是正数或零
?
作为逻辑指令内联移位操作的结果
如果进行加减或比较的结果大于或等于
2 ^
31
或小于
- 2 ^
31
,溢出发生。
3.3.7.2
条件码后缀
带有条件选项的指令可以有条件地执行,一个可选的条件语法描述为
{
cond}
。条件指令执行前需要
IT
指令。如果条件码标志
APSR
满足指定的条件,
条件指令只执行一次。表
3.4
显示了条件代码使用
。您可以使用条件执行的
IT
指令,减少代码中的分支指令。表
3.4
还显示了代码后缀和
N
,
Z
,
C
和
V
标志位
的关系。
32