目录
第19章 LPC111x ARM Cortex-M0参考资料..........................................................2
19.1 简介...........................................................................................................................2
19.2 Cortex-M0的处理器和内核外设............................................................................2
19.2.1 系统级接口.......................................................................................................3 19.2.2 集成的可配置调试...........................................................................................3 19.2.3 Cortex-M0处理器的特性小结........................................................................3 19.2.4 Cortex-M0内核外设........................................................................................3 19.3 处理器.......................................................................................................................3
19.3.1 编程模型...........................................................................................................3 19.3.2 存储器模型.......................................................................................................9 19.3.3 异常模型.........................................................................................................13 19.3.4 故障处理.........................................................................................................17 19.3.5 电源管理.........................................................................................................18 19.4 指令集.....................................................................................................................20
19.4.1 指令集汇总.....................................................................................................20 19.4.2 内部函数.........................................................................................................22 19.4.3 关于指令的描述.............................................................................................22 19.4.4 存储器访问指令.............................................................................................26 19.4.5 跳转和控制指令.............................................................................................39 19.4.6 综合指令.........................................................................................................40 19.5 外设.........................................................................................................................46
19.5.1 关于ARM Cortex-M0.....................................................................................46 19.5.2 嵌套向量中断控制器.....................................................................................46 19.5.3 系统控制块.....................................................................................................50 19.5.4 系统定时器,SysTick....................................................................................
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
ii
广州周立功单片机发展有限公司 第19章 第19章 LPC111x ARM Cortex-M0参考资料
19.1 简介
下面的参考资料以ARM Cortex-M0用户指南(ARM Cortex-M0 User Guide)为蓝本。只针对LPC111x Cortex-M0的具体实现做了细微的改动。
19.2 Cortex-M0的处理器和内核外设
Cortex-M0处理器是一个入门级(entry-level)的32位ARM Cortex处理器,设计用在更宽范围的嵌入式应用中。该处理器包含以下特性,给开发者提供了极大的便利:
z z z z z
结构简单,容易学习和编程; 功耗极低,运算效率高; 出色的代码密度;
确定、高性能的中断处理;
向上与Cortex-M处理器系列兼容。
图19.1 Cortex-M0的具体实现
Cortex-M0处理器基于一个高集成度、低功耗的32位处理器内核,采用一个3级流水线冯·诺伊曼结构(Von Neumann architecture)。通过简单、功能强大的指令集以及全面优化的设计(提供包括一个单周期乘法器在内的高端处理硬件),Cortex-M0处理器可实现极高的能效。
Cortex-M0处理器采用ARMv6-M结构,基于16位的Thumb指令集,并包含Thumb-2技术。提供了一个现代32位结构所希望的出色性能,代码密度比其他8位和16位微控制器都要高。
Cortex-M0处理器紧密集成了一个可配置的嵌套向量中断处理器(NVIC),提供业界领先的中断性能。NVIC具有以下功能:
z 包含一个不可屏蔽的中断(NMI)。NMI在LPC111x上不能实现; z 提供零抖动中断选项; z 提供4个中断优先级。
处理器内核和NVIC的紧密结合使得中断服务程序(ISR)可以快速执行,极大地缩短了中断延迟。这是通过寄存器的硬件堆栈以及加载-乘和存储-乘操作的停止和重启来获得
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
22
广州周立功单片机发展有限公司 第19章 的。中断处理程序不需要任何汇编封装代码,不用消耗任何ISR代码。末尾连锁的优化还极大地降低了一个ISR切换到另一个ISR时的开销。
为了优化低功耗设计,NVIC还与睡眠模式相结合,提供一个深度睡眠功能,使整个器件迅速掉电。 19.2.1 系统级接口
Cortex-M0处理器提供一个简单的系统级接口,使用AMBA技术来提供高速、低延迟的存储器访问。
19.2.2 集成的可配置调试
Cortex-M0处理器执行一个完整的硬件调试方案,带有大量的硬件断点和观察点选项。通过一个非常适合微控制器和其他小型封装器件的2脚串行线调试(SWD)端口,提供了高系统透明度的处理器、存储器和外设执行。 19.2.3 Cortex-M0处理器的特性小结
z z z z z z z
高代码集成度,具有32位的性能;
工具和二进制代码与Cortex-M处理器系列向上兼容; 集成了极低功耗的睡眠模式;
高效的代码执行允许处理器时钟更低,或者延长睡眠模式的时间; 单周期的32位硬件乘法器; 零抖动的中断处理; 宽范围的调试功能。
19.2.4 Cortex-M0内核外设
Cortex-M0内核外设有:
NVIC —— NVIC是一个嵌入式中断控制器,支持低延迟的中断处理。
系统控制块 —— 系统控制块(SCB)是到处理器的编程模型接口。它提供系统执行信息和系统控制,包括配置、控制和系统异常的报告。
系统定时器 —— 系统定时器,SysTick,是一个24位的递减定时器。可以将其用作一个实时操作系统(RTOS)的节拍定时器,或者用作一个简单的计数器。
19.3 处理器
19.3.1 编程模型
本节描述了Cortex-M0的编程模型。除了个别内核寄存器的描述之外,本节还包含处理器模式和堆栈的相关信息。
1. 处理器模式 处理器模式有:
线程模式 —— 用来执行应用软件。处理器在退出复位时进入线程模式。
处理器模式 —— 用来处理异常。处理器在完成所有的异常处理后返回到线程模式。 2. 堆栈
处理器使用一个满递减堆栈。这就意味着堆栈指针指向堆栈存储器中的最后一个堆栈项。当处理器将一个新的项压入堆栈时,堆栈指针递减,然后将该项写入新的存储器单元。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
33
广州周立功单片机发展有限公司 第19章 处理器执行两个堆栈,主堆栈和进程堆栈,两个堆栈有自己的堆栈指针副本,见本章“堆栈指针”小节。
在线程模式下,CONTROL寄存器控制着处理器使用主堆栈还是进程堆栈,见本章“CONTROL寄存器”小节。在处理器模式下,处理器总是使用主堆栈。处理器操作的选择如下:
表19.1 处理器模式和堆栈使用的选择
处理器模式 线程模式 处理器模式
用来执行 应用程序 异常处理程序
使用的堆栈
主堆栈或进程堆栈,见本章“CONTROL寄存器”小节 主堆栈
3. 内核寄存器 处理器内核寄存器有:
表19.2 内核寄存器组小结
名称
类型
[1]
复位值 描述
见本章“通用寄存器”小节 见本章“堆栈指针”小节 见本章“堆栈指针”小节 见本章“链接寄存器”小节 见本章“程序计数器”小节 见表19.3 见表19.4 见表19.6
R0-R12 R/W 不可知 MSP R/W 见文中描述 PSP R/W 不可知 LR R/W 不可知 PC R/W 见文中描述 PSR R/W 不可知[2] APSR R/W 不可知 EPSR RO 不可知[2]
IPSR RO 0x00000000 见表19.5 PRIMASK R/W 0x00000000 见表19.7 CONTROL R/W 0x00000000 见表19.8
[1] 描述线程模式和处理器模式下程序执行过程中的访问类型。调试访问可以不同。 [2] Bit[24]是T-bit,从复位向量的bit[0]加载进来。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
44
广州周立功单片机发展有限公司 第19章
图19.2 处理器内核寄存器组
(1)通用寄存器
R0-R12是供数据操作使用的32位通用寄存器。 (2)堆栈指针
堆栈指针(SP)是寄存器R13。在线程模式中,CONTROL寄存器的bit[1]指示了堆栈指针的使用情况:
z 0 = 主堆栈指针(MSP)。这是复位值。 z 1 = 进程堆栈指针(PSP)。
复位时,处理器将地址0x00000000的值加载到MSP中。 (3)链接寄存器
链接寄存器(LR)是寄存器R14。它保存子程序、函数调用和异常的返回信息。复位时,LR的值不可知。
(4)程序计数器
程序计数器(PC)是寄存器R15。它包含当前的程序地址。复位时,处理器将复位向量(地址:0x00000004)的值加载到PC。值的bit[0]复位时被加载到EPSR的T位,必须为1。
(5)程序状态寄存器
程序状态寄存器(PSR)由下列3种寄存器组合而成: z 应用程序状态寄存器(APSR) z 中断程序状态寄存器(IPSR) z 执行程序状态寄存器(EPSR)
在32位的PSR中,这3个寄存器的位域分配互斥。PSR的位域分配如下:
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
55
广州周立功单片机发展有限公司 第19章
图19.3 APSR、IPSR、EPSR寄存器的位分配
这3个寄存器可以单独访问,也可以2个一组或3个一组进行访问,访问时,将寄存器名称作为MSR或MRS指令的一个变量。例如:
z 使用寄存器名称PSR,用MRS指令来读所有寄存器 z 使用寄存器名称APSR,用MSR指令来写APSR PSR的组合和属性如下所示:
表19.3 PSR寄存器组合
寄存器
类型
组合
APSR,EPSR和IPSR
EPSR和IPSR APSR和IPSR APSR和EPSR
PSR R/W[1][2]
IEPSR RO IAPSR R/W[1] EAPSR R/W[2] [1] 处理器忽略对IPSR位的写操作。
[2] 读EPSR位时返回零,处理器忽略对EPSR位的写操作。
有关访问程序状态寄存器的更多信息请参考本章“指令”一节中的描述。
应用程序状态寄存器:APSR包含执行完前面的指令后条件标志的当前状态。有关寄存器的属性请见表19.2。寄存器的位分配如下所示:
表19.4 APSR的位分配
位
名称
功能 负值标志 零值标志 进位或借位标志 溢出标志 保留
[31] N [30] Z [29] C [28] V [27:0] - 有关APSR的负值、零值、进位或借位以及溢出标志的更多信息请参考本章“指令”一节。
中断程序状态寄存器:ISP包含当前中断服务程序(ISR)的异常编号。有关寄存器的属性请见表19.2。寄存器的位分配如下:
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
66
广州周立功单片机发展有限公司 第19章 表19.5 IPSR的位分配
位
名称
功能 保留
0 = 线程模式 1 = 保留 2 = NMI 3 = HardFault 4-10 = 保留 11 = SVCall 12,13 = 保留
[5:0]
异常编号
14 = PendSV 15 = SysTick 16 = IRQ0 . . .
47 = IRQ31 48-63 = 保留。
更多信息请见本章“异常类型”小节。
[31:6] - 这是当前异常的编号:
执行程序状态寄存器:EPSR包含Thumb状态位。 有关EPSR属性请见表19.2。EPSR的位分配如下:
表19.6 EPSR的位分配
位
名称
功能 保留 Thumb状态位
保留
[31:25] - [24] T [23:0] - 如果应用软件使用MRS指令直接读取EPSR将始终返回零。利用MSR指令来写EPSR的操作会被忽略。故障处理程序可以检查入栈的PSR的EPSR值来确定故障的原因。请见本章“异常的进入和返回”小节。下面的操作可以清除T~0位:
[1] 指令BLX,BX和POP{PC}
[2] 异常返回时恢复被压入栈中的xPSR值 [3] 进入异常时向量值的bit[0]
在T位为0时尝试执行指令会导致HardFault或锁定故障,更多信息请见本章“锁定”小节。
可中断-可重启的指令:可中断-可重启的指令有LDM和STM。如果在执行这两条中的其中一条指令的过程中出现中断,处理器就终止指令的执行。
在处理完中断后,处理器再从头开始重新执行指令。 (6)异常屏蔽寄存器
异常屏蔽寄存器禁止处理器处理异常。当异常可能影响到实时任务或要求连续执行的代码序列时,异常就被禁能。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
77
广州周立功单片机发展有限公司 第19章 可以使用MSR和MRS指令、或CPS指令改变PRIMASK的值来禁能或重新使能异常。更多信息本章“MRS”和“MSR”和“CPS”小节。
优先级屏蔽寄存器:PRIMASK寄存器阻止优先级可配置的所有异常被激活。有关寄存器的属性请见表19.2。寄存器的位分配如下:
表19.7 PRIMASK寄存器的位分配
位
名称
功能
[31:1] - 保留
0 = 无影响。 [0] PRIMASK 1 = 阻止优先级可配置的所有异常被激活。
(7)CONTROL寄存器
CONTROL寄存器控制着处理器处于线程模式时所使用的堆栈。寄存器的属性请见表19.2。CONTROL寄存器的位分配如下:
表19.8 CONTROL寄存器的位分配
位
名称
功能
[31:2] - 保留
定义当前的堆栈:
[1]
有效堆栈指针
0 = MSP是当前的堆栈指针 1 = PSP是当前的堆栈指针
在处理器模式中,这个位读出为零,写操作被忽略。
[0] - 保留
处理器模式始终使用MSP,因此,在处理器模式下,处理器忽略对CONTROL寄存器的有效堆栈指针位执行的明确的写操作。异常进入和返回机制会将CONTROL寄存器更新。 在一个OS环境中,推荐运行在线程模式中的线程使用进程堆栈,内核和异常处理器使用主堆栈。
默认情况下,线程模式使用MSP。要将线程模式中使用的堆栈指针切换成PSP,只需要使用MSR指令将有效堆栈位设置为1,见本章“MRS”小节。
备注:当更改堆栈指针时,软件必须在MSR指令后立刻使用一个ISB指令。这样来保证ISB之后的指令执行时使用新的堆栈指针,见本章“ISB”小节。
4. 异常和中断
Cortex-M0处理器支持中断和系统异常。处理器和嵌套向量中断控制器(NVIC)划分所有异常的优先级,并对所有异常进行处理。一个中断或异常会改变软件控制的正常流程。处理器使用处理器模式来处理除复位之外的所有异常,更多信息见本章“异常的进入”小节和本章“异常返回”小节。
NVIC寄存器控制中断处理。更多信息请见“嵌套向量中断控制器”小节。 5. 数据类型 处理器:
[1] 支持下列数据类型:
— 32位字 — 16位半字 — 8位字节
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
88
广州周立功单片机发展有限公司 第19章 [2] 管理所有数据存储器访问都采用小端模式。指令存储器和专用外设总线(PPB)访
问始终是小端模式。更多信息请见本章“存储区、类型和属性”小节。 6. Cortex微控制器软件接口标准
ARM为编程Cortex-M0微控制器提供了Cortex微控制器软件接口标准(CMSIS)。CMSIS是器件驱动库的一个组成部分。
CMSIS为Cortex-M0微控制器系统定义了: [1] 一种通用的方法来:
— 访问外设寄存器 — 定义异常向量
[2] 内核外设寄存器的名称和内核异常向量的名称 [3] 一个RTOS内核的器件的接口
CMSIS包含Cortex-M0处理器中内核外设的地址定义和数据结构。还包含有组成TCP/IP堆栈和Flash文件系统的中间件元件的可选接口。
通过使能模板代码的重复使用以及将不同中间件厂商提供的符合CMSIS的软件组件组合起来,CMSIS大大简化了整个软件开发过程。软件厂商可以扩展CMSIS,使其包含各个厂商的外设定义以及这些外设的访问函数。
本文档包含了CMSIS定义的寄存器名称,并对处理器内核和内核外设相关的CMSIS函数进行了简单描述。
备注:本文档使用CMSIS定义的寄存器缩略名称。在某些情况下,这些名称与其它文档中可能用到的结构缩略名称不同。
下面各节给出了有关CMSIS的更多信息: [1] [2] [3] [4]
本章“电源管理编程提示”小节; 本章“内部函数”小节;
本章“使用CMSIS访问和Cortex-M0 NVIC寄存器”小节; 本章“NVIC编程提示”小节。
19.3.2 存储器模型
本节描述处理器存储器映射以及存储器访问的行为。处理器有一个固定的存储器映射,提供有高达4GB的可寻址存储空间。存储器映射是:
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
99
广州周立功单片机发展有限公司 第19章
图19.4 Cortex-M3存储器映射
处理器为内核外设寄存器保留了专用外设总线(PPB)地址范围空间,见本章的“Cortex-M0的处理器和内核外设”一节。
1. 存储区、类型和属性
每个区域有一个定义好的存储器类型,某些区域还有附加的存储器映射分成多个区域。
存储器属性。存储器类型和属性决定了各个区域的访问行为。
存储器类型是:
常规存储器 — 处理器为了提高效率,可以重新对交易进行排序,或者刻意地进行读取。 Device存储器 — 处理器保护与Device或强秩序存储器(Strong-ordered memory)的
其它交易相关的交易秩序。 强秩序存储器 — 处理器保护与所有其他交易相关的交易秩序。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1010
广州周立功单片机发展有限公司 第19章 Device存储器和强秩序存储器的不同秩序要求意味着,存储器系统可以缓冲一个对Device存储器的写操作,但不准缓冲对强秩序存储器的写操作。
附加的存储器属性包括:
永不执行(XN) — 表示处理器阻止指令访问。当执行从存储器的XN区提取出来的
指令时,产生一个HardFault异常。 2. 存储器系统的存储器访问秩序
对于大多数由明确的存储器访问指令引发的存储器访问,存储器系统都不保证访问秩序
只要所有访问秩序的重新安排不影响指令序列的操作就行。一与指令的编写顺序完全一致,
般情况下,如果两个存储器访问的顺序必须与两条存储器访问指令编写的顺序完全一致程序才能正确执行,软件就必须在两条存储器访问指令之间插入一条内存屏障指令,见本章“软件的存储器访问秩序”小节。
但是,存储器系统不保证Device存储器和强秩序存储器的一些访问秩序。对于两条存储器访问指令A1和A2,如果A1的编写顺序在前,两条指令所引发的存储器访问顺序为:
图19.5 存储器排序
在表中:
- — 表示存储器系统不保证访问秩序。
< — 表示观察到访问顺序与指令编写顺序一致,即,A1总是在A2之前。 3. 存储器访问的行为
存储器映射中每个区域的访问行为如下:
表19.9 存储器访问的行为
地址范围
存储区域
存储器类型[1] 常规存储器 常规存储器
XN[1] - - XN - XN XN XN
描述
程序代码的可执行区域。也可以把数据保存到这里
数据的可执行区域。也可以把代码保存到这里 外部设备存储器 数据的可执行区域 外部设备存储器
这个区域包括NVIC、系统定时
强秩序存储器 Device存储器
器和系统控制块。这个区域只能使用字访问
厂商提供的特定存储器
0x00000000-0x1FFFFFFF Code 0x20000000-0x3FFFFFFF SRAM 0x40000000-0x5FFFFFFF 0x60000000-0x9FFFFFFF
外设 Device存储器 外部RAM
常规存储器
0xA0000000-0xDFFFFFFF 外部设备 Device存储器 0xE0000000-0xE00FFFFF
专用外设总线
0xE0100000-0xFFFFFFFF Device LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1111
广州周立功单片机发展有限公司 第19章 [1] 更多信息请见本章“存储区、类型和属性”小节。
Code、SRAM和外部RAM区域可以保存程序。 4. 软件的存储器访问秩序
程序流程的指令顺序不能担保相应的存储器交易顺序。这是因为:
[1] 为了提高效率,处理器可以将一些存储器访问的顺序重新安排,只要不影响指令序
列的操作就行;
[2] 存储器映射中的存储器或设备可能有不同的等待状态; [3] 某些存储器访问被缓冲,或者是刻意为之的。
“存储器系统的存储器访问秩序”小节描述了存储器系统在哪些情况下能保证存储器访问的秩序。但是,如果存储器访问的秩序十分重要,软件就必须插入一些内存屏障指令来强制保持存储器访问的秩序。处理器提供了以下内存屏障指令:
DMB — 数据存储器屏障(DMB)指令保证先完成未处理的存储器交易,再执行后面的存储器交易,见本章“DMB”小节。
DSB — 数据同步屏障(DSB)指令保证先完成未处理的存储器交易,再执行后面的指令,见本章“DSB”小节。
ISB — 指令同步屏障(ISB)保证所有已完成的存储器交易的结果后面的指令都能辨认出来,见本章“ISB”小节。
下面是内存屏障指令使用的一些例子:
向量表 — 如果程序改变了向量表中的一项,然后又使能了相应的异常,那么就在两个操作之间插入一条DMB指令。这就确保了,如果异常在被使能后立刻被采纳,处理器能使用新的异常向量。
自修改代码 — 如果一个程序包含自修改代码,代码修改之后在程序中立刻使用一条ISB指令。这就确保了后面的指令执行使用的是更新后的程序。
存储器映射切换 — 如果系统包含一个存储器映射切换机制,在切换存储器映射之后使用一条DSB指令。这就确保了后面的指令执行使用的是更新后的存储器映射。
对强秩序存储器(例如,系统控制块)执行的存储器访问不需要使用DMB指令。 处理器保护与所有其他交易相关的交易秩序。 5. 存储器的字节存储顺序(Memory endianness)
处理器看到的存储器是一个从零开始、编号逐次递增的字节集合。例如,字节0~3存放第一个保存的字,字节4~7存放第二个保存的字。“(1)小端格式”小节描述了数据的字在存储器中是如何存放的。
(1)小端格式
在小端格式中,处理器将字的最低有效字节(lsbyte)保存在编号最小的字节中,最高有效字节(msbyte)保存在编号最大的字节中。例如:
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1212
广州周立功单片机发展有限公司 第19章
图19.6 小端格式
19.3.3 异常模型
本节描述异常模型。 1. 异常状态
每个异常都处于下面其中一种状态: 无效 — 异常无效,未挂起。 挂起 — 异常正在等待处理器处理。
一个外设或软件的中断请求可以改变相应的挂起中断的状态。 有效 — 一个异常正在被处理器处理,但处理尚未结束。
一个异常处理程序可以中止另一个异常处理程序的执行。在这种情况下,两个异常都处于有效状态。
有效和挂起 — 异常正在被处理器处理,而且有一个来自同一个异常源的异常正在等待处理。
2. 异常类型 异常类型有:
备注:LPC111x没有NMI。
复位 — 复位在上电或热复位时启动。异常模型将复位当做一种特殊形式的异常来对待。当复位产生时,处理器的操作停止(可能停止在一条指令的任何一点上)。当复位撤销时,从向量表中复位项提供的地址处重新起动执行。执行在线程模式下重新起动。 NMI — 一个不可屏蔽中断(NMI)可以由外设产生,也可以由软件来触发。这是除复位之外优先级最高的异常。NMI永远使能,优先级固定为2。NMI不能:
[1] 被屏蔽,它的执行也不能被其他任何异常中止; [2] 被除复位之外的任何异常抢占。
HardFault — HardFault是由于在正常操作过程中或在异常处理过程中出错而出现的一个异常。HardFault的优先级固定为-1,表明它的优先级要高于任何优先级可配置的异常。 SVCall — 管理程序调用(SVC)异常是一个由SVC指令触发的异常。在OS环境下,应用程序可以使用SVC指令来访问OS内核函数和器件驱动。
PendSV — PendSV是一个中断驱动的系统级服务请求。在OS环境下,当没有其它异常有效时,使用PendSV来进行任务切换。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1313
广州周立功单片机发展有限公司 第19章 SysTick — SysTick是一个系统定时器到达零时产生的异常。软件也可以产生一个SysTick异常。在OS环境下,处理器可以将这个异常用作系统节拍。
中断(IRQ) — 中断(或IRQ)是外设发出的一个异常,或者是由软件请求产生的一个异常。所有中断都与指令执行不同步。在系统中,外设使用中断来与处理器通信。
表19.10 各种异常类型的特性
异常编号[1]
IRQ编号[1]
异常类型
优先级
向量地址[2] 0x00000004
1 - 复位 -3,优先级最高
2 -14 NMI -2 0x00000008 3 -13 HardFault -1 0x0000000C 4-10 - 保留 12-13 - 保留
- - 0x0000002C 0x00000038 0x0000003C 0x00000040 以及更高的地址[4]
- - 11 -5 SVCall 可配置[3] 14 -2 PendSV 可配置[3] 15 -1 SysTick 可配置[3]
16和大于16的值
0和大于0的值
中断(IRQ)
可配置[3]
[1] 为了简化软件层,CMSIS只使用IRQ编号,因此,对除中断外的其他异常都使用负值。IPSR返回异常编号,请见表19.5。
[2] 更多信息请见“向量表”小节。 [3] 见“中断优先级寄存器”小节。 [4] 地址值以4为步长,逐次递增。
对于除复位之外的异步异常,在异常被触发和处理器进入异常处理程序之间,处理器可
以执行条件指令。
被特许的软件可以将表19.10中列出的优先级可配置的异常禁能,见本章“中断清除-使能寄存器”小节。
有关HardFault的更多信息,请见本章“故障处理”小节。 3. 异常处理程序
处理器使用以下处理程序来处理异常:
中断服务程序(ISR)— 中断IRQ0~IRQ31是由ISR来处理的异常。 故障处理程序 — HardFault是唯一一个由故障处理程序来处理的异常。
系统处理程序 — NMI、PendSV,SVCall、SysTick和HardFault是由系统处理程序来
处理的全部异常。 4. 向量表
向量表包含堆栈指针的复位值以及所有向量处理程序的起始地址(也称为异常向量)。
每个向量的最低有效位必须为1,表明异常图19.7显示了异常向量在向量表中的放置顺序。
处理程序都是用Thumb代码编写的。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1414
广州周立功单片机发展有限公司 第19章
图19.7 向量表
向量表的地址固定为0x00000000。 5. 异常优先级
如表19.10所示,每个异常都有对应的优先级:
z 越小的优先级值指示一个更高的优先级;
z 除复位、HardFault和NMI之外,所有异常的优先级都是可配置的;
如果软件不配置任何优先级,那么,所有优先级可配置的异常的优先级就都为0。有关配置异常优先级的信息请见:
z 本章“系统处理程序优先级寄存器”小节 z 本章“中断优先级寄存器”小节
优先级值的配置范围为0 – 192,各值以为间距。复位、HardFault和NMI这些有固定的负优先级值的异常的优先级高于任何其他的异常。
给IRQ[0]分配一个高优先级值、给IRQ[1]分配一个低优先级值就意味着IRQ[1]的优先级高于IRQ[0]。如果IRQ[1]和IRQ[0]都有效,先处理IRQ[1]。
如果多个挂起的异常具有相同的优先级,异常编号越小的挂起异常优先处理。例如,如果IRQ[0]和IRQ[1]正在挂起,并且两者的优先级相同,那么先处理IRQ[0]。
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1515
广州周立功单片机发展有限公司 第19章 当处理器正在执行一个异常处理程序时,如果出现一个更高优先级的异常,那么这个异常就被抢占。如果出现的异常的优先级和正在处理的异常的优先级相同,这个异常就不会被抢占,与异常的编号大小无关。但是,新中断的状态就变为挂起。
6. 异常的进入和返回
描述异常处理时使用了下列术语:
如果一个异常的优先级比正在处理的抢占 — 当处理器正在执行一个异常处理程序时,
异常的优先级更高,那么低优先级的异常就被抢占。
当一个异常抢占另一个异常时,这些异常就被称为嵌套异常。更多信息请见本章“异常的进入”小节。
返回 — 当异常处理程序结束,并且满足以下条件时,异常就返回。 [1] 没有优先级足够高的挂起异常要处理
[2] 已结束的异常处理程序没有在处理一个迟来的异常
处理器弹出堆栈,处理器状态恢复到中断出现之前的状态,更多信息请见“(2)异常返回”小节。
末尾连锁 — 这个机制加速了异常的处理。当一个异常处理程序结束时,如果一个挂起的异常满足异常进入的要求,就跳过堆栈弹出,控制权移交给新的异常处理程序。 迟来(Late-arriving) — 这个机制加速了抢占的处理。如果一个高优先级的异常在前一个异常正在保存状态的过程中出现,处理器就转去处理更高优先级的异常,开始提取这个异常的向量。状态保存不受迟来异常的影响,因为两个异常保存的状态相同。从迟来异常的异常处理程序返回时,要遵守正常的末尾连锁规则。
(1)异常的进入
当有一个优先级足够高的挂起异常存在,并且满足下面的任何一个条件,就进入异常处理:
[1] 处理器处于线程模式
[2] 新异常的优先级高于正在处理的异常,这时,新异常就抢占了正在处理的异常 当一个异常抢占了另一个异常时,异常就被嵌套。
优先级足够高的意思是该异常的优先级比屏蔽寄存器中所的任何一个异常组的优先级都要高,见本章“异常屏蔽寄存器”小节。优先级比这个异常要低的异常被挂起,但不被处理器处理。
当处理器处理异常时,除非异常是一个末尾连锁异常或迟来的异常,否则,处理器都把信息压入到当前的堆栈中。这个操作被称为入栈(stacking),8个数据字的结构被称为栈帧(stack frame)。栈帧包含以下信息:
图19.8 异常进入时堆栈的内容
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1616
广州周立功单片机发展有限公司 第19章 入栈后,堆栈指针立刻指向栈帧的最低地址单元。栈帧按照双字地址对齐。
栈帧包含返回地址。这是被中止的程序中下条指令的地址。这个值在异常返回时返还给PC,使被中止的程序恢复执行。
处理器执行一次向量提取,从向量表中读出异常处理程序的起始地址。当入栈结束时,处理器开始执行异常处理程序。同时,处理器向LR写入一个EXC_RETURN值。这个值指示了栈帧对应哪个堆栈指针以及在异常出现之前处理器处于什么工作模式。
如果在异常进入的过程中没有更高优先级的异常出现,处理器就开始执行异常处理程序,并自动将相应的挂起中断的状态变为有效。
如果在异常进入的过程中有另一个优先级更高的异常出现,处理器就开始执行这个高优先级异常的异常处理程序,不改变前一个异常的挂起状态。这是一个迟来异常的情况。
(2)异常返回
当处理器处于处理器模式并且执行下面其中一条指令尝试将PC设为EXC_RETURN值时,出现异常返回:
z POP指令,用来加载PC
z BX指令,用来使用任意的寄存器
在异常进入时处理器将一个EXC_RETURN值保存到LR中。异常机制依靠这个值来检测处理器何时执行完一个异常处理程序。EXC_RETURN值的bit[31:4]为0xFFFFFFF。当处理器将一个相应的这种形式的值加载到PC时,它将检测到这个操作并不是一个正常的分支操作,而是异常已经结束。因此,处理器启动异常返回序列。EXC_RETURN的bit[3:0]指出了所需的返回堆栈和处理器模式,如表19.11所示。
表19.11 异常返回的行为
EXC_RETURN
返回到处理器模式
0xFFFFFFF1
异常返回获得主堆栈的状态 返回后执行使用MSP 返回到线程模式
0xFFFFFFF9
异常返回获得MSP的状态 返回后执行使用MSP 返回到线程模式
0xFFFFFFFD 所有其他值
异常返回获得PSP的状态 返回后执行使用PSP 保留
描述
19.3.4 故障处理
故障是异常的一个子集,见19.3.3节。所有的故障都导致HardFault异常被处理,或者,如果故障在NMI或HardFault处理程序中出现,会导致锁定。发生以下情况会导致出现故障:
[1]
[2] [3] [4] [5] [6]
在一个优先级等于或高于SVCall的地方执行SVC指令; 在没有调试器的情况下执行BKPT指令;
在加载或存储时出现一个系统产生的总线错误; 执行一个XN存储器地址中的指令;
从系统产生了一个总线故障的地址单元中执行指令; 在提取向量时出现了一个系统产生的总线错误;
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1717
广州周立功单片机发展有限公司 第19章 [7] 执行一个未定义的指令;
[8] 由于T位之前被清零而导致不再处于Thumb状态的情况下执行一条指令; [9] 尝试对一个不对齐的地址执行加载或存储操作。
只有复位和NMI可以抢占优先级固定的HardFault处理程序。HardFault可以抢占除复位、NMI或其他硬故障之外的任何异常。
1. 锁定
如果在执行NMI或HardFault处理程序时出现故障,或者,在一个使用MSP的异常返回时出栈的却是PSR的时候系统产生一个总线错误,处理器进入一个锁定状态。当处理器处于锁定状态时,它不执行任何指令。处理器保持处于锁定状态,直到下面任何一种情况出现:
[1] 出现复位;
[2] 调试器将锁定状态终止;
[3] 出现一个NMI,以及当前的锁定处于HardFault处理程序中。
如果锁定状态出现在NMI处理程序中,后面的NMI就无法使处理器离开锁定状态。 19.3.5 电源管理
Cortex-M0处理器的睡眠模式可以降低功耗,睡眠模式包含2种: [1] 睡眠模式:停止处理器时钟
[2] 深度睡眠模式(见第3章“电源管理”小节)
SCR的SLEEPDEEP位选择使用哪种睡眠模式,见本章“系统控制寄存器”小节。 本节描述了进入睡眠模式的机制和将器件从睡眠模式唤醒的条件。 1. 进入睡眠模式
本节描述了软件可以用来使处理器进入睡眠模式的一种机制。
系统可以产生伪唤醒事件,例如,一个调试操作唤醒处理器。因此,软件必须能够在这样的事件之后使处理器重新回到睡眠模式。程序中可以有一个空闲循环使得器件回到睡眠模式。
(1)等待中断
等待中断指令(WFI)使器件立刻进入睡眠模式。当执行一个WFI指令时,处理器停止执行指令,进入睡眠模式。更多信息见本章“WFI”小节。
(2)等待事件
备注:WFE指令不能在LPC111x上使用。
等待事件指令(WFE)根据一个一位的事件寄存器的值来进入睡眠模式。处理器执行一个WFE指令时检查事件寄存器的值:
0 — 处理器停止执行指令,进入睡眠模式
1 — 处理器将寄存器的值设为0,并继续执行指令,不进入睡眠模式 更多信息请见本章“WFE”小节。
如果事件寄存器为1,表明处理器在执行WFE指令时不必进入睡眠模式。通常的原因是出现了一个外部事件,或者系统中的另一个处理器已经执行了SEV指令,见本章“SEV”小节。软件不能直接访问这个寄存器。
(3)Sleep-on-exit
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1818
广州周立功单片机发展有限公司 第19章 如果SCR的SLEEPONEXIT位被设为1,当处理器完成一个异常处理程序的执行并返回到线程模式时,处理器立刻进入睡眠模式。如果应用只要求处理器在中断出现时运行,就可以使用这种机制。
2. 从睡眠模式唤醒
处理器的唤醒条件取决于使处理器进入睡眠模式所采用的机制。 (1)从WFI或sleep-on-exit唤醒
通常,只有当检测到一个优先级足够高的异常导致进入异常处理时,处理器才唤醒。 某些嵌入式系统在处理器唤醒之后可能必须先执行系统恢复任务,然后再执行中断处理程序。通过将PRIMASK位置位来实现这个操作。如果到来的中断被使能,并且优先级高于当前的异常优先级,处理器就唤醒,但不执行中断处理程序,直至处理器将PRIMASK设为0,见本章“异常屏蔽寄存器”小节。
(2)从WFE唤醒
如果出现以下情况,处理器就唤醒:
[1] 处理器检测到一个优先级足够高的异常导致进入异常处理
[2] 在一个多处理器的系统中,系统中的另一个处理器执行了SEV指令
另外,如果SCR的SEVONPEND位被设为1,那么任何新的挂起中断都能触发一个事件和唤醒处理器,即使这个中断被禁能,或者这个中断的优先级不够高而导致无法进入异常处理。有关SCR的更多信息请见本章“系统控制寄存器”小节。
3. 电源管理编程提示
ISO/IEC C不能直接产生WFI、WFE和SEV指令。CMSIS为这些指令提供了以下内在函数:
void __WFE(void) /* 等待事件 void __WFI(void) /* 等待中断 void __SEV(void) /* 发送事件
*/ */ */
LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD.
1919
广州周立功单片机发展有限公司 第19章 19.4 指令集
19.4.1 指令集汇总
处理器执行这种版本的指令集。表19.12列出了所支持的指令。 表19.12的备注如下:
z z z
尖括号< >括着操作数的备用格式; 大括号{}括着可选的操作数和助记符部分; 操作数列所列出的操作数不完全。
有关指令和操作数的信息,详见指令描述。
表19.12 Cortex-M0指令
助记符 ADCS ADD{S}
操作数 {Rd,} Rn, Rm {Rd,}
Rn, 进位加法 加法 将基于PC相对偏移的地址读到寄存器 位与操作 算术右移 跳转{有条件} 位清除 断点 带链接的跳转 带链接的间接跳转 间接跳转 比较负值 更改处理器状态,关闭中断 更改处理器状态,使能中断 数据内存屏障 数据同步屏障 异或 指令同步屏障 简述 标志 N,Z,C,V N,Z,C,V - N,Z N,Z,C - N,Z - - - - N,Z,C,V N,Z,C,V - - - - N,Z - - - - ADR Rd, label ANDS ASRS {Rd,} Rn, Rm {Rd,}Rm, B{cc} label BICS BKPT #imm BL label BLX Rm BX Rm CMN Rn, Rm CPSID i CPSIE i DMB - DSB - EORS {Rd,} Rn, Rm ISB - CMP Rn, 加载多个寄存器,访问之后会递增地LDM Rn{!}, reglist 址 LDR Rt, label LDR LDRB Rt, [Rn, [Rn, 从基于PC相对偏移地址上加载寄存器 用字加载寄存器 用字节加载寄存器 - LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2020 广州周立功单片机发展有限公司 第19章 续上表 助记符 LDRH LDRSB LDRSH LSLS U Rt, [Rn, [Rn, [Rn, 操作数 简述 用半字加载寄存器 - 标志 用有符号的字节加载寄存器 - 用有符号的半字加载寄存器 - 逻辑左移 N,Z,C 逻辑右移 传输 N,Z,C N,Z - N,Z,C,V N,Z N,Z - N,Z - - - - - N,Z,C N,Z,C,V N,Z,C,V - - - MOV{S} Rd, Rm MRS Rd, spec_reg 从特别寄存器传输到通用寄存器 MSR spec_reg, Rm 从通用寄存器传输到特别寄存器 MULS Rd, Rn, Rm 乘法,32位结果值 位非 无操作 逻辑或 出栈,将堆栈的内容放入寄存器 压栈,将寄存器的内容压入堆栈 反转每半字里面的字节顺序 反转有符号半字里面的字节顺序 循环右移 反向减法 进位减法 发送事件 MVNS Rd, Rm NOP - ORRS {Rd,} Rn, Rm POP reglist PUSH reglist REV16 Rd, Rm REVSH Rd, Rm RORS RSBS SBCS {Rd,} Rn, Rs {Rd,} Rn, #0 {Rd,} Rn, Rm REV Rd, Rm 反转字时面的字节顺序 SEV - Rt, [Rn, [Rn, [Rn, STM Rn!, reglist 存储多个寄存器,在访问后地址递增STR STRB STRH SUB{S} 将寄存器作为字来存储 将寄存器作为字节来存储 - 将寄存器作为半字来存储 - 减法 超级用户调用 符号扩展字节 符号扩展半字 0扩展字节 0扩展半字 N,Z,C,V - - - N,Z - - SVC #imm SXTB Rd, Rm SXTH Rd, Rm UXTB Rd, Rm UXTH Rd, Rm TST Rn, Rm 基于测试的逻辑与 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2121 广州周立功单片机发展有限公司 第19章 续上表 助记符 操作数 等待事件 等待中断 简述 - - 标志 WFE - WFI - 19.4.2 内部函数 ISO/IEC C代码不能直接访问某些Cortex-M0指令。本章节对可以产生这些指令的内部函数进行了描述,内部函数可由CMSIS或有可能由C编译器提供。若C编译器不支持相关的内部函数,则用户可能需要使用内联汇编程序来访问相关的指令。 CMSIS提供下列的内部函数来产生ISO/IEC C代码不能直接访问的指令: 表19.13 产生某些Cortex-M0指令的CMSIS内部函数 指令 CPSIE i CPSID i void __enable_irq(void) void __disable_irq(void) CMSIS指令集 ISB void __ISB(void) DSB void __DSB(void) DMB void __DMB(void) NOP void __NOP(void) REV REV16 REVSH uint32_t __REV(uint32_t int value) uint32_t __REV16(uint32_t int value) uint32_t __REVSH(uint32_t int value) SEV void __SEV(void) WFE void __WFE(void) WFI void __WFI(void) CMSIS还提供使用MRS和MSR指令来访问特别寄存器的函数: 表19.14 访问特别寄存器的内部函数 特定寄存器 PRIMASK CONTROL MSP PSP 访问 读 写 读 写 读 写 读 写 CMSIS函数 uint32_t __get_PRIMASK (void) void __set_PRIMASK (uint32_t value) uint32_t __get_CONTROL (void) void __set_CONTROL (uint32_t value) uint32_t __get_MSP (void) void __set_MSP (uint32_t TopOfMainStack) uint32_t __get_PSP (void) void __set_PSP (uint32_t TopOfProcStack) 19.4.3 关于指令的描述 下列小节对如何使用指令进行了更为详细的描述: [1] [2] [3] [4] [5] 操作数; 使用PC或SP时的; 移位操作; 地址对齐; PC相对的表达式; LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2222 广州周立功单片机发展有限公司 第19章 [6] 条件执行。 1. 操作数 指令操作数可以是ARM寄存器,常量或其它的指令特定参数。指令在操作数上操作,并经常将结果存放在目的寄存器中。当指令中存在目的寄存器时,它通常会在其它操作数之前被指定。 2. 使用PC或SP时的 对于用于操作数或目的寄的程序计数器(PC)或堆栈指针,许多指令都不能使用它们,或者存在着用户能否使用它们的。更多信息,详见指令的描述。 备注:当使用BX、BLX或POP指令来更新PC时,为正确执行程序,任何地址的位0都必须为1.这是因为该位指示目标指令集,且Cortex-M0处理器只支持Thumb指令。当BL或BLX指令将位0的值写入LR时,值1会被自动分配。 3. 移位操作 寄存器移位操作通过特定的位数(移位长度)来实现寄存器位的左右移位操作。寄存器移位可以由指令ASR、LSR、LSL和ROR直接执行,且结果会被写入到目的寄存器中。允许的移位长度由移位类型和指令决定,请参考各个指令的描述。若移位长度为0,则不发生移位操作。寄存器移位操作会更新进位标志,当移位长度被指定为0时除外。下列各子节描述了各种的移位操作以及它们是如何影响进位标志。在这些描述中,Rm是包含着移位值的寄存器,n是移位长度。 (1)ASR 算术右移n位的操作是将Rm寄存器左边的32-n个位向右移动n位,结果是寄存器右边有 32-n个位,然后再将寄存器位[31]的原始值复制到结果寄存器左边的n个位中。请参考图19.9。 用户可以使用ASR对寄存器Rm的符号值进行2n除法操作,得到的结果为负无穷大。 当指令为ASRS时,进位标志会被更新为最后移出的位值,即寄存器Rm的位[n-1]。 备注: z z 如果n为32或大于32,那么结果中的所有位都会被置为Rm中位[31]的值。 如果n为32或大于32,那么进位标志被更新为Rm位[31]的值。 图19.9 ASR #3 (2)LSR 逻辑右移n位的操作是将Rm寄存器Rm左边的32-n个位向右移动n位,结果是寄存器右边 有32-n个位,然后再将结果寄存器左边的n个位设为0。请参考图19.10。 如果值为无符号的整数。 用户可以使用LSR操作来对寄存器Rm的值进行2n除法操作, 当指令为LSRS时,进位标志会被更新为最后移出的位值,即寄存器Rm的位[n-1]。 备注: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2323 广州周立功单片机发展有限公司 第19章 z z 如果n为32或大于32,那么结果中的所有位都会被清除为0。 如果n为33或大于33,那么进位标志被更新为0。 图19.10 LSR #3 (3)LSL 逻辑左移n位的操作是将Rm寄存器右边的32-n个位向左移动n位,结果是寄存器左边有 32-n个位,然后将结果中的寄存器右边的n个位设为0。请参考图19.11。 用户可以使用LSL操作来对寄存器Rm的值与2n进行乘法操作,如果值为无符号的整数或是有符号2的补码整数值。溢出会在无警告的提示下发生。 当指令为LSLS时,进位标志会被更新为最后移出的位值,即寄存器Rm的位[32-n]。当使用LSL #0时,这些指令不会影响进位标志。 备注: z z 如果n为32或大于32,那么结果中的所有位都会被清除为0。 如果n为33或大于33,那么进位标志被更新为0。 图19.11 LSL #3 (4)ROR 循环右移n位的操作是将Rm寄存器左边的32-n个位向右移动n位,结果是寄存器右边有 32-n个位,然后再将寄存器右边的n个位移动到结果寄存器的左边的n个位中。请参考图19.12。 当指令为RORS时,进位标志会被更新为最后循环出的位值,即寄存器Rm的位[n-1]。 备注: z z 如果n为32,那么结果中的所有位值都相同于Rm中的值,且如果进位标志被更新,则会被更新为Rm的位[31]的值。 移位长度n大于32的ROR与移位长度为n-32的ROR操作得到的结果相同。 图19.12 ROR #3 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2424 广州周立功单片机发展有限公司 第19章 4. 地址对齐 对齐访问是这样的一个操作:字对齐地址是用于字或多字访问,或者半字对齐地址是用于半字访问。字节访问通常是对齐访问的。 Cortex-M0处理器不支持非对齐地址的访问。任何尝试执行一个非对齐的存储器访问操作都会导致HardFault异常。 5. PC相对的表达式 相对PC表达或标签是一个代表着指令或文字数据的地址的符号。在指令中它被表示为PC值加上或减去一个数字偏移量。汇编器从标签和当前指令的地址中计算出所要求的偏移量。如果偏移量太大,则汇编器会产生一个错误。 备注: z z 对于大数多指令,PC的值就是当前指令的地址加上4个字节; 汇编器可能允许用其它语法来表示PC相对表达式,如标签加上或减去一个数值,或者用[PC, #imm]格式表示。 6. 条件执行 大多数数据处理指令依据操作的结果在应用程序状态寄存器(APSR)中更新条件标志。某些指令更新所有标志,而某些指令则仅更新子集。如果标志不被更新,则原始值被保留。指令对标志的影响,请参考指令的描述。 在如下的情况里,用户可以在另一个指令中设置条件标志的基础上: [1] 在指令更新标志后可立即执行条件性的跳转指令; [2] 在经过任意数量的不会更新标志的间隔数指令后,可以执行条件性的跳性指令。 在Cortex-M0处理器上,通过使用条件性的跳转指令,就可以实现条件性的执行操作。 本小节描述了以下内容: [1] 条件标志; [2] 条件代码后缀。 (1)条件标志 APSR包含了下列的条件标志: N — 当操作的结果为负值时置为1,否则清除为0。 Z — 当操作的结果为0时置为1,否则清除为0。 C — 当操作的结果导致要进位时置为1,否则清除为0 V — 当操作引发溢出时置为1,否则清除为0。 有关APSR的信息,详情请参考本章“程序状态寄存器”小节。 当出现下列情况时,会发生进位操作: [1] 如果加法的结果大于或等于232; [2] 如果减法的结果为正或等于0; [3] 由于移位指令或循环指令而发生的进位操作。 当位[31]中结果的符号值不与在无穷精度中所执行操作的结果符号值匹配时,溢出发生,例如: [1] 如果二个负值相加得出一个正值; [2] 如果二个正值相加得出一个负值; LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2525 广州周立功单片机发展有限公司 第19章 [3] 如果从一个负值减去一个正值得到一个正值; [4] 如果从一个正值减去一个负值得到一个负值。 对于CMP,比较操作与减法操作相同,对于CMN,则加法操作相同,结果值会被丢弃除外。更多信息,详情请参考指令描述。 (2)条件代码后缀 条件性跳转在语法描述显示为B{cond}。只有APSR的条件代码标志符合指定的条件时,才能执行带有条件代码的跳转指令,否则要忽略跳转指令。表19.15显示了使用的条件代码,同时还显示了条件代码后缀和N、Z、C和V标志之关的联系。 表19.15 条件代码后缀 后缀 EQ NE CS或HS CC或LO MI PL VS VC HI LS GE LT GT LE AL 标志 Z = 1 Z = 0 C = 1 C = 0 N = 1 N = 0 V = 1 V = 0 C = 1和Z = 0 C = 0或Z = 1 N = V N != V Z = 0和N = V Z = 1和N != V 可以为任意值 意义 等效,最后标志设置结果为0 不等效,最后标志设置结果为非0 更高或相同,无符号 更低,无符号 负数 正数或0 溢出 无溢出 更高,无符号 更低或相同,无符号 大于或等效,有符号 少于,有符号 大于,有符号 少于或等于,有符号 总是。当没有指定后缀时,这是默认的操作 19.4.4 存储器访问指令 表19.16所示为存储器访问指令: 表19.16 访问指令 助记符 LDR{type} LDR POP PUSH STM STR{type} STR{type} 使用寄存器偏移量来加载寄存器 基于PC相对地址来加载寄存器 出栈,将栈中的内容放入寄存器 压栈,将寄存器的内容压入堆栈 存储多个寄存器 使用立即数偏移量来存储寄存器 使用寄存器偏移量来存储寄存器 简述 1. ADR 产生一个PC相对地址。 (1)语法 ADR Rd, label 其中: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2626 广州周立功单片机发展有限公司 第19章 Rd是目标寄存器。 Label是PC相对表达式。见本章“相对PC的表达式”小节。 (2)操作 ADR通过将立即数值加入到PC中来产生一个地址,并将得到的地址结果写入到目的寄存器中。 ADR产生区域代码非常便利,因为地址是PC相对地址。 如果用户使用ADR来产生BX或BLX指令的目标地址,为了能正确执行程序,必须要保证将产生的地址的位[0]设置为1。 (3) 在该指令中,Rd必须指定R0-R7。地址数据值必须是字对齐,且不能超出当前PC的1020字节。 (4)条件标志 该指令不会改变标志。 (5)示例 ADR R1, TextMessage ; 将被标签为TextMessage单元上的地址值写入到R1中 ADR R3, [PC,#996] ;将R3的值设为PC + 996。 2. LDR和STR,立即数偏移量 具有立即数偏移量的加载和存储。 (1)语法 LDR Rt, [ Rt是加载或存储的寄存器。 Rn是基于存储器地址上的寄存器。 Imm是Rn的偏移量。如果imm被省略,则假设它为0。 (2)操作 LDR、LDRB和LDRH指令将存储器中的字、字节或半字数据值加载到Rt指定的寄存器中。在将数据写入Rt指定的寄存器之前,长度少于字的数据要用0扩充到32位的长度。 STR、STRB和STRH指令将Rt寄存器指定的单个寄存器中所包含的字,最低位字节或低半字存放到存储器中。从加载的存储器地址或用于存放的存储器地址是Rn或SP所指定的寄存器的值与立即数imm的和。 (3) 在这些指令中, [1] Rt和Rn必须只指定R0-R7的值; [2] Imm的值必须要符合下列要求: –0到1020之间,对于LDR和STR操作,在将SP用作基址寄存器时,其值必须是4的整数倍; LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2727 广州周立功单片机发展有限公司 第19章 –0到124之间,对于LDR和STR操作,在将R0-R7用作基址寄存器时,其值必须是4的整数倍; –0到62之间,对于LDRH和STRH操作,其值必须是2的整数倍; –0到31之间,对于LDRB和STRB; [3] 计算出的地址必须能够被事务中的字节数整除,见“地址对齐”小节。 (4)条件标志 这些指令不会改变标志。 (5)示例 LDR R4, [R7 ;将R7的地址载入到R4。 STR R2, [R0,#const-struc] ; const-struc 是评估处于0-1020范围内的常量的表达式。 3. LDR和STR,寄存器偏移量 带寄存器偏移量的加载和存储。 (1)语法 LDR Rt, [Rn, Rm] LDR Rt, [Rn, Rm] LDR Rt是加载或存储的寄存器。 Rn是基于存储器地址的寄存器。 Rm是含有用作偏移量的值的寄存器。 (2)操作 LDR、LDRB、U、LDRSB和LDRSH将存储器中的字、0扩展字节、0扩展半字、符号扩展字节或符号扩展半字加载到Rt指定的寄存器中。 STR、STRB和STRH指令将Rt寄存器指定的单个寄存器中所包含的字,最低位字节或低半字存放到存储器中。 从加载的存储器地址或用于存放的存储器地址是Rn和Rm所指定的寄存器中的值之和。 (3) 在这些指令中, [1] Rt、Rn和Rm必须指定R0-R7; [2] 计算出的地址必须能够被加载或存储的字节数整除。见“地址对齐”小节。 (4)条件标志 这些指令不会改变标志。 (5)示例 STR R0, [R5, R1] ; 将R0的值存储到R5加R1得出的地址中; LDRSH R1, [R2, R3] ; 从(R2 + R3)所指定的存储器地址中加载半字数据,符号扩展到32位并将 ; 其写入到R1中。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2828 广州周立功单片机发展有限公司 第19章 4. LDR,PC相对 从存储器中加载寄存器(文字数据)。 (1)语法 LDR Rt, label 其中: Rt是加载的寄存器。 Label是PC相对表达式,见“相对PC的表达式”小节。 (2)操作 将label所指定的存储器中的字加载到Rt所指定的寄存器中。 (3) 在这些指令中,label的大小必须位于当前PC的1020字节范围之内,且是字对齐的。 (4)条件标志 这些指令不会更改标志。 (5)示例 LDR R0, LookUpTable ;将标签为LookUpTable的地址中的字数据加载到R0中; LDR R3, [PC, #100] ;将(PC + 100)上的存储器字加载到R3中。 5. LDM和STM 加载和存储多个寄存器。 (1)语法 LDM Rn{!}, reglist STM Rn!, reglist 其中: Rn是基于存储器地址的寄存器。 !回写后缀。 reglist是被加载或存储的一个或多个寄存器的列表,用大括号括住。它包含着寄存器范围。若它包含着多于一个的寄存器或寄存器范围,必须要将其用逗号隔开,见本小节的“示例”。 对于LDM,LDMIA和LDMFD相近。LDMIA为每次访问后都会递增的基址寄存器。LDMFD用法是将数据从满的递减堆栈中移出。 对于STM,STMIA和STMEA相近。STMIA为每次访问后都会递增的基址寄存器。STMEA用法是将数据压入空的递增堆栈中。 (2)操作 LDM指令将基于Rn上的存储器地址的字值加载到reglist的寄存器中。 STM指令将reglist中的寄存器的字值存放到基于Rn的存储器地址中。 用于访问的存储器地址为4字节间隔,其范围为Rn所指定的寄存器的值至Rn + 4 * (n-1)所指定的寄存器的值,这里的n是reglist中的寄存器数量。访问的顺序是按照寄存器的编号从低到高发生,最低编号的寄存器使用最低的存储器地址,最高编号的寄存器使用最高的存储器地址。如果写回后缀被指定,则Rn + 4 *n所指定的寄存器的值会被写回到Rn所指定的寄存器中。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 2929 广州周立功单片机发展有限公司 第19章 (3) 在这些指令中: [1] reglist和Rn为R0-R7; [2] 必须要使用写回后缀,除非指令是LDM指令,在LDM里,reglist也含有Rn,在 这种情况下,要紧记不能使用写回后缀; [3] Rn所指定的寄存器的值必须是字对齐的。详情请参考“地址对齐”小节; [4] 对于STM,如果reglist中存在着Rn,那么Rn必须是列表中的第一个寄存器。 (4)条件标志 这些指令不会更改标志。 (5)示例 LDM R0,{R0,R3,R4} ; LDMIA相近于LDM STMIA R1!,{R2-R4,R6} (6)错误示例 STM R5!,{R4,R5,R6} ; 存放于 R5的值是不可预测的 LDM R2,{} ; 在列表中至少要存在着一个寄存器。 6. PUSH和POP 将寄存器压入满递减堆栈和将满递减堆栈中的内容移入寄存器。 (1)语法 PUSH reglist POP reglist 其中: Reglist是非空的寄存器列表。用大括号括着。它包含着寄存器范围。若它包含着多于一个的寄存器或寄存器范围,必须要将其用逗号隔开。 (2)操作 PUSH将寄存器存放到堆栈中,最低编号的寄存器使用低存储器地址,最高编号的寄存器使用高存储器地址。 POP将堆栈中的内容加载到寄存器中,最低编号的寄存器使用最低存储器地址,最高编号的寄存器使用最高存储器地址。 PUSH将SP寄存器的值减去4所得的值用作最高存储器地址,POP将SP寄存器的值用作最低的存储器地址来执行满递减堆栈操作。当操作完成时,PUSH会更新SP寄存器来指向最低存储值的单元,而POP则会更新SP寄存器来指向高于所加载的最高单元的单元。 如果POP在它的reglist中包含了PC,则当POP指令完成时,会在该单元上执行一个跳转操作。为PC所读出的Bit[0值用来更新APSR T-位。该位必须为1,以确保能正确执行程序。 (3) 在这些指令中: [1] reglist必须只为R0-R7; [2] 对于PUSH和POP,异常情况分别是LR和PC。 (4)条件标志 这些指令不会更改标志。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3030 广州周立功单片机发展有限公司 第19章 (5)示例 PUSH {R0,R4-R7} ; 将R0,R4,R5,R6,R7压入堆栈 PUSH {R2,LR} ;将R2和链接寄存器压入堆栈 POP {R0,R6,PC} ;令r0,r6和PC出栈,然后跳转到新的PC值. 通用数据处理指令表19.17显示了数据处理指令: 表19.17 数据处理指令 助记符 ADCS ADD{S} ANDS ASRS BICS CMN CMP EORS LSLS LSRS MOV{S} MULS MVNS ORRS REV REV16 REVSH RORS RSBS SBCS SUBS SXTB SXTH UXTB UXTH TST 进位加法 加法 逻辑与 算术右移 位清零 比较负值 比较 异或 逻辑左移 逻辑右移 传输 乘法 取反传输 逻辑或 反转字里面的字节顺序 反转每半字里面的字节顺序 反转低半字中的字节顺序,并进行符号扩展 循环右移 反向减法 带进位的减法 减法 符号扩展字节 符号扩展半字 零扩展字节 零扩展半字 测试 简述 7. ADC、ADD、RSB和SUB 进位加法、加法、反向减法、进位减法、减法。 (1)语法 ADCS {Rd,} Rn, Rm ADD{S} {Rd,} Rn, LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3131 广州周立功单片机发展有限公司 第19章 S会令ADD或SUB指令更新标志 Rd指定结果寄存器 Rn指定首个源寄存器 Rm指定第二个源寄存器 Imm指定一个常量立即数值 当省略了可选的Rd寄存器限定符时,会假定其值与Rn相同,例如,ADDS R1,R2与ADDS R1、R1、R2相同。 (2)操作 ADCS指令将Rn中的值加到Rm的值中,如果进位标志被置位,则加多一个1,并将结果存放在Rd所指定寄存器里,同时更新N、Z、C和V标志。 ADD指令将Rn的值加到Rm的值或imm指定的立即数中,并将结果存放到Rd所指定的寄存器中。 ADDS指令执行的操作与ADD相同,并还可以更新N、Z、C和V标志。 RSBS指令是用0减去Rn中的值,得到一个负数,然后将结果值存放在Rd所指定的寄存器中,并更新N、Z、C和V标志。 SBCS指令是用Rn的值减去Rm的值,如果进位标志置位,则减去一个1。指令会将结果值存放到Rd所指定的寄存器中,并更新N、Z、C和V标志。 SUB指令会减去Rm的值或imm所指定的立即数。指令把结果值存放到Rd所指定的寄存器中。 SUBS指令执行的操作与SUB相同,同时它还可以更新N、Z、C和V标志。 如何使用ADC和SBC来综合处理多字算术,请参考下面的“示例”小节。 还可以参考“ADR”小节。 (3) 表19.18列出了寄存器指示符的合法组合和每一个指令可以使用的立即数。 表19.18 ADC、ADD、RSB、SBC和SUB操作数 指令 Rd Rn Rm imm Rd和Rn必须指定相同的寄存器 Rd和Rn必须指定相同的寄存器 Rd和Rm必须不能同时指定PC ADCS R0-R7 R0-R7 R0-R7 - R0-R15 R0-R15 R0-PC - ADD R0-R7 SP或PC - 0-1020 立即数必须为4的整数倍 0-7 - 0-255 Rd和Rn必须指定相同的寄存器 - - Rd和Rn必须指定相同的寄存器 - SP SP - 0-508 立即数必须为4的整数倍 R0-R7 R0-R7 - ADDS R0-R7 R0-R7 - R0-R7 R0-R7 R0-R7 - RSBS R0-R7 R0-R7 - SUB SP SP - SUBS R0-R7 R0-R7 - SBCS R0-R7 R0-R7 R0-R7 - 0-508 立即数必须为4的整数倍 0-7 - LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3232 广州周立功单片机发展有限公司 第19章 续上表 指令 Rd Rn Rm imm R0-R7 R0-R7 - 0-255 Rd和Rn必须指定相同的寄存器 - R0-R7 R0-R7 R0-R7 - (4)示例 下例所示为二个指令将R0和R1所包含的位整数值加到R2和R3所包含的另一个位整数值中,并将结果存放到R0和R1中。 位加法: ADDS R0, R0, R2 ; 加上最低位的字 ADCS R1, R1, R3 ;加上最高位的字,带进位 多字的值无需要使用连续的寄存器。下面示例为指令会令R4、R5和R6所包含的96位整数值减去R1、R2和R3所包含的96位整数值。该例将结果值存放在R4、R5和R6中。 96位减法: SUBS R4, R4, R1 ; 减去最低位字 SBCS R5, R5, R2 ; 减去中间的字,带进位 SBCS R6, R6, R3 ; 减去最高位字,带进位 下列所示的RSBS指令是用来执行单个寄存器1的补码的操作。 算术负值运算: RSBS R7, R7, #0 ; 用0减去R7 8. AND、ORR、EOR和BIC 逻辑AND、OR、异或和位清除。 (1)语法 ANDS {Rd,} Rn, Rm ORRS {Rd,} Rn, Rm EORS {Rd,} Rn, Rm BICS {Rd,} Rn, Rm 其中: Rd是目标寄存器。 Rn是保存第一个操作数的寄存器,且还是与目标寄存器相同的寄存器。 Rm 是第二个寄存器。 (2)操作 AND、EOR和ORR对Rn和Rm的值按位执行AND、异或、或操作。 BIC指令对Rn上的位执行AND操作,对Rm值上的相应位执行逻辑非操作。 条件代码标志会根据操作的结果被更新,见“条件标志”小节。 (3) 在这些指令中,Rd、Rn和Rm必须指定R0-R7。 (4)条件标志 这些指令会: [1] 根据结果值来更新N和Z标志; LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3333 广州周立功单片机发展有限公司 第19章 [2] 不会影响C或V标志。 (5)示例 ANDS R2, R2, R1 ORRS R2, R2, R5 ANDS R5, R5, R8 EORS R7, R7, R6 BICS R0, R0, R1 9. ASR, LSL, LSR和ROR 算术右移,逻辑左移,逻辑右移,循环右移。 (1)语法 ASRS {Rd,} Rm, Rs ASRS {Rd,} Rm, #imm LSLS {Rd,} Rm, Rs LSLS {Rd,} Rm, #imm LSRS {Rd,} Rm, Rs LSRS {Rd,} Rm, #imm RORS {Rd,} Rm, Rs 其中: Rd是目的寄存器。如果Rd被省略,则假定它的值与Rm相同。 Rm是保存要移位的值的寄存器。 Rs是保存着移位长度(该长度要应用到Rm中的值)的寄存器 Imm是移位长度。 移位长度要由指令来决定: ASR — 移位长度为1到32 LSL — 移位长度为0到31 LSR — 移位长度为1到32. 注:MOVS Rd, Rm是LSLS Rd, Rm, #0的假名。 (2)操作 ASR、LSL、LSR和ROR对立即数imm所指定的长度而锁定的Rm寄存器的位或者Rs所指定的寄存器的最低位字节值执行算术左移、逻辑左移、逻辑右移或循环右移。 关于不同的指令会产生什么样的结果,详情请参考“移位操作”小节。 (3) 在这些指令中,Rd、Rm和Rs必须只可以指定R0-R7。对于非立即数指令,Rd和Rm必须指定相同的寄存器。 (4)条件标志 这些指令根据结果值来更新N和Z标志。 C标志被更新为最后移出的位。当移位长度为0时例外,见“移位操作”小节。V标志不变。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3434 广州周立功单片机发展有限公司 第19章 (5)示例 ASRS R7, R5, #9 ; 算术右移9位 LSLS R1, R2, #3 ; 逻辑左移3位,并更新标志 LSRS R4, R5, #6 ; 逻辑右移6位 RORS R4, R4, R6 ; 循环右移R6低字节中的值 10. CMP和CMN 比较和比较负值。 (1)语法 CMN Rn, Rm CMP Rn, #imm CMP Rn, Rm 其中: Rn是保存第一个操作数的寄存器。 Rm是用于比较的寄存器。 Imm是用于比较的立即数值。 (2)操作 这些指令将一个寄存器中的值与另一个寄存器中的值或立即数进行比较。指令会根据结果值来更新条件标志,但不会将结果写入寄存器。 CMP指令将Rn的值减去Rm所指定的寄存器值或立即数imm,并更新标志。这操作与SUBS指令相同,不同的是结果值会被丢弃。 CMN指令将Rm的值加到Rn的值中,并更新标志。这操作与ADDS指令相同,不同的是结果值会被丢弃。 (3) 对于: [1] CMN指令 指令Rn、Rm必须只能指定R0-R7; [2] CMP指令: – Rn 和Rm可以指定R0-R14; – 立即数的范围为0-255。 (4)条件标志 这些指令根据结果值来更新N、Z、C和V标志。 (5)示例 CMP R2, R9 CMN R0, R2 11. MOV和MVN 传输和取反传输。 (1)语法 MOV{S} Rd, Rm MOVS Rd, #imm LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3535 广州周立功单片机发展有限公司 第19章 MVNS Rd, Rm 其中: S是可选后缀。如果指定了S,则会根据操作的结果值来更新条件代码标志,见“条件执行”小节。 Rd是目的寄存器。 Rm是寄存器。 Imm可以是0-255范围内的任何一个值。 (2)操作 MOV指令将Rm的值复制到Rd中。 MOVS指令执行的操作与MOV指令相同,但是它会更新N和Z标志。 MVNS指令采用Rm的值,对该值执行按位的逻辑取反操作,并将结果存放到Rd中。 (3) 在这些指令中,Rd和Rm必须指定R0-R7。 当在MOV指令里Rd是PC时: [1] 结果值的位[0]被丢弃; [2] 在通过将结果值的位[0]强制为0来所创造的地址上执行跳转操作。T-位保持不变。 备注:尽管可以将MOV用作跳转指令,但是为了软件的可移植性,AMR强烈建推荐使用BX或BLX指令来执行跳转操作。 (4)条件标志 如果S被指定,则这些指令会: [1] 根据结果值更新N和Z标志; [2] 不会影响C或V标志。 (5)示例 MOVS R0, #0x000B ; 将0x000B写入R0,更新标志 MOVS R1, #0x0 ; 将0写入R1,更新标志 MOV R10, R12 MOV R8, SP MVNS R2, R0 ; 将R12的值写入R10,不更新标志 ; 将堆栈指针的值写入R8 ; 将R0取反写入R2并更新标志 MOVS R3, #23 ; 将23写入R3 12. MULS 使用32位操作数的乘法,产生32位的结果值。 (1)语法 MULS Rd, Rn, Rm 其中: Rd是目的寄存器。 Rn、Rm是保存进行乘法操作值的寄存器。 (2)操作 MUL指令将Rn和Rm所指定的寄存器的值进行乘法操作,并将结果值的最低32位存放在Rd中。条件代码标志会按照操作的结果值而被更新,见“条件执行”小节。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3636 广州周立功单片机发展有限公司 第19章 该指令的结果并不是由操作数是有符号还是无符号来决定。 (3) 在该指令中: [1] Rd、Rn和Rm必须只能指定R0-R7; [2] Rd必须要和Rm相同。 (4)条件标志 该指令会: [1] 根据结果值来更新N和Z标志; [2] 不会影响C或V标志。 (5)示例 MULS R0, R2, R0 ;乘法操作,标志被更新, R0 = R0 x R2 13. REV、REV16和REVSH 反转字节。 (1)语法 REV Rd, Rn REV16 Rd, Rn REVSH Rd, Rn 其中: Rd是目的寄存器。 Rn是源寄存器。 (2)操作 使用这些指令来改变数据的端点排序: REV — 将32位大端数据转换成小端的数据或将32位小端的数据转换成大端数据。 REV16 — 将二个打包的16位大端数据转换成小端的数据或将二个打包的小端的数据转换成大端数据。 REVSH —将16位有符号的大端数据转换成32位有符号小端数据或将16位有符号小端数据转换32位有符号大端数据。 (3) 在这些指令中,Rd和Rn必须只可以指定R0-R7。 (4)条件标志 这些指令不会更改标志。 (5)示例 REV R3, R7 ; 反转R7值的字节顺序,并将其写入R3 ; 反转R0中的每一个16位半字的字节顺序 ; 反转有符号的半字 REV16 R0, R0 REVSH R0, R5 14. SXT and UXT 符号扩展和0扩展。 (1)语法 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3737 广州周立功单片机发展有限公司 第19章 SXTB Rd, Rm SXTH Rd, Rm UXTB Rd, Rm UXTH Rd, Rm 其中: Rd是目的寄存器。 Rm是寄存器,其保存的值会被扩展。 (2)操作 这些指令从结果值中提取位: [1] [2] [3] [4] SXTB提取位[7:0]并将值进行符号扩展到32位; UXTB提取位[7:0]并将值用0扩展到32位; SXTH提取[15:0]并将值进行符号扩展到32位; UXTH提取[15:0]并将值用0扩展到32位。 (3) 在这些指令中,Rd和Rm必须只可以指定R0-R7。 (4)条件标志 这些指令不会影响标志。 (5)示例 SXTH R4, R6 UXTB R3, R1 ;获取R6的低半字,然后将其进行符号扩展到32位,并将结果写入R4 ;获取R10最低位字节,并用0扩展,最后将结果写入R3 15. TST 测试位。 (1)语法 TST Rn, Rm 其中: Rn是保存第一个操作数的寄存器。 Rm是测试的寄存器。 (2)操作 该指令将一个寄存器的值与别一个寄存器中的值进行测试。它会根据结果值来更新条件标志,但是不会将结果值写入寄存器。 TST指令对Rn中的值和Rm中的值执行位与操作。这是与ANDS指令相同的操作,不同的是它会丢弃结果值。 为了测试Rn中的某个位是0还是1,要使用TST指令,且寄存器的该位要设为1,其它所有位被清除为0。 (3) 在这些指令中,Rn和Rm必须只能指定R0-R7。 (4)条件标志 这些指令: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3838 广州周立功单片机发展有限公司 第19章 [1] 会根据结果来更新N和Z标志; [2] 不会影响C或V标志。 (5)示例 TST R0, R1 ; 对R0值和R1值执行位与操作,更新条件代码标志,但结果值会被丢弃。 19.4.5 跳转和控制指令 表19.19所示为跳转和控制指令。 表19.19 跳转和控制指令 助记符 B{cc} BL BLX BX 跳转(有条件) 带链接的跳转 带链接的间接跳转 间接跳转 简述 1. B、BL、BX和BLX 跳转指令。 (1)语法 B{cond} label BL label BX Rm BLX Rm 其中: Cond是可选的条件代码,见“条件执行”小节。 Label是PC相对表达式,见“相对PC的表达式”小节。 Rm是提供跳转地址的寄存器。 (2)操作 所有这些指令都会对label所指示的地址或在Rm所指定的寄存器中包含地址上执行跳转操作。另外: [1] BL和BLX指令将下一个指令的地址写入LR,链接寄存器R14; [2] 如果Rm的位[0]是0,则BX和BLX指令会导致HardFault异常。 BL和BLX指令还会将LR的位[0]设置为1。这就确保了该值适合由后续POP {PC}或BX指令使用其来执行成功的返回跳转操作。 表19.20所示为适用于各种跳转指令的跳转范围。 表19.20 跳转范围 指令 B label Bcond label BL label BX Rm −2 KB至+2 KB −256字节至+2字节 −16 MB至+16 MB 寄存器中的任意值 跳转范围 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 3939 广州周立功单片机发展有限公司 第19章 续上表 指令 BLX Rm 寄存器中的任意值 跳转范围 (3) 在这些指令里: [1] 不要在BX或BLX指令里使用SP或PC; [2] 对于BX和BLX,为实现正确的执行操作,Rm的位[0]必须为1。位[0]用于更新 EPSR T-位,并会被从目标地址上丢弃。 备注:Bcond是在Cortex-M0处理器上唯一的条件指令。 (4)条件标志 这些指令不会更改标志。 (5)示例 B loopA BL funC BX LR ;跳转到loopA ;对函数funC进行带链接的跳转(调用),返回存放在LR的地址 ; 从函数调用中返回 BLX R0 ; 带链接的跳转,并从(调用)中更改为存放在R0所存放的地址 BEQ labelD ; 条件跳转到abelD,如果最后的标志被设置,指令设置Z标志,否则不执行跳转 19.4.6 综合指令 表19.21所示为余下的Cortex-M0指令: 表19.21 综合指令 助记符 BKPT CPSID CPSIE DMB DSB ISB MRS MSR NOP SEV SVC WFE WFI 断点 更改处理器状态,禁止中断 更改处理器状态,使能中断 数据内存屏障 数据同步屏障 指令同步屏障 从特别寄存器传输到寄存器 从寄存器传输到特别寄存器 无操作 发送事件 超级用户调用 等待事件 等待中断 简述 1. BKPT 断点。 (1)语法 BKPT #imm 其中: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4040 广州周立功单片机发展有限公司 第19章 imm是0-255范围内的整数。 (2)操作 BKPT指令会令处理器进入调试状态。当指令到达特定的地址时,调试工具可以使用该指令来调查系统状态。处理器会忽略imm。如有需要,调试器可以使用它来存放断点的其它信息。 如果在执行BKPT指令时调试器没有连接上,那么处理器还有可能会产生HardFault或进入锁定状态。详情见本章“锁定”小节。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 BKPT #0 ; 立即数值设为0x0的断点。 2. CPS 更改处理器状态。 (1)语法 CPSID i CPSIE i (2)操作 CPS更改PRIMASK特别寄存器值。通过设置PRIMASK,CPSID可令中断被关闭。而通过清除PRIMASK,CPSIE则可使能中断。关于这些寄存器的详细描述,请参考本章“异常屏蔽寄存器”小节。 (3) 该指令没有。 (4)条件标志 该指令不会更改条件标志。 (5)示例 CPSID i ;关闭所有的中断,NMI除外(设置PRIMASK) ; 使能中断 (清除PRIMASK) CPSIE i 3. DMB 数据内存屏障。 (1)语法 DMB (2)操作 DMB用作数据内存屏障。它可确保会先检测到程序中位于DMB指令前的所有显式内存访问指令,然后再检测到程序中位于DMB指令后的显式内存访问指令。它不影响其他指令(不访问内存的指令)在处理器上的执行顺序。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4141 广州周立功单片机发展有限公司 第19章 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 DMB ; 数据内存屏障 4. DSB 数据同步屏障。 (1)语法 DSB (2)操作 DSB用作特别数据同步内存屏障,只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。位于此指令前的所有显式内存访问均完成时,DSB指令才会完成。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 DSB ; 数据同步屏障 5. ISB 指令同步屏障。 (1)语法 ISB (2)操作 ISB用作指令同步屏障。它会刷新处理器的管道,因此在完成了ISB指令后,需要再次将ISB之后的所有指令从高速缓存或内存中提取出来。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 ISB ; 指令同步屏障 6. MRS 将特别寄存器的内容移动到通用寄存器中。 (1)语法 MRS Rd, spec_reg 其中: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4242 广州周立功单片机发展有限公司 第19章 Rd是通用目的寄存器。 spec_reg 是其中一个特别寄存器:APSR、IPSR、EPSR、IEPSR、IAPSR、 EAPSR、PSR、MSP、PSP、PRIMASK或CONTROL。 (2)操作 MRS将特别寄存器的内容存放到通用寄存器中。MRS指令可以结合MR指令来产生读-修改-写序列,这适用于在PSR中修改特别标志。 见“MSR”小节。 (3) 在该指令中,Rd必须不能是SP或PC。 (4)条件标志 该指令不会更改标志。 (5)示例 MRS R0, PRIMASK ; 读取PRIMASK值并将其写入R0 7. MSR 将通用寄存器的内容传移到指定的特别寄存器中。 (1)语法 MSR spec_reg, Rn 其中: Rn是通用源寄存器。 spec_reg是特别目的寄存器:APSR,、IPSR、EPSR、IEPSR、IAPSR、EAPSR、PSR、MSP、PSP、PRIMASK或CONTROL。 (2)操作 MSR使用Rn所指定的寄存器的值来更新其中一个特别寄存器。 见“MRS”小节。 (3) 在该指令里,Rn必须不能为SP和PC。 (4)条件标志 该指令明确地根据Rn中的值来更新标志。 (5)示例 MSR CONTROL, R1 ;读取R1的值,并将其写入CONTROL寄存器。 8. NOP 空操作 (1)语法 NOP (2)操作 NOP执行的是无操作,且不能保证会占用指令时间。处理器可在它到达执行阶段之前将其从管道中移除。 使用NOP指令来进行填充,例如,在位边界上放置后续指令。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4343 广州周立功单片机发展有限公司 第19章 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 NOP ; 无操作 9. SEV 发送事件。 (1)语法 SEV (2)操作 SEV将事件信号发送到一个多处理器系统内的所有处理器中。它还可设置局部事件寄存器。见本章“电源管理”小节。 也可参考“WFE”小节。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 SEV ; 发送事件 10. SVC 超级用户调用。 (1)语法 SVC #imm 其中: Imm是0-255范围内的整数。 (2)操作 SVC指令会引发SVC异常。 处理器会忽略imm。如果有需要,可以通过异常处理程序获取imm来决定要请求什么样的服务程序。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 SVC #0x32 ; 超级用户调用(SVC处理程度使用堆栈的PC来锁定立即数的位置,然后将其提取出来) LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4444 广州周立功单片机发展有限公司 第19章 11. WFE 等待事件。 备注:WFE指令不会在LPCIdesit上执行。 (1)语法 WFE (2)操作 如果事件寄存器为0,则WFE挂起执行,直至发生下列其中的一个事件: [1] [2] [3] [4] 出现异常,除非异常屏蔽寄存器或当前优先级级别将其屏蔽; 异常进入挂起状态,如果系统控制寄存器的SEVONPEND置位; 存在调试进入请求,如果调试使能的话; 外设或多处理器系统里另一个处理器通过使用SEV指令来发出事件信号。 如果事件寄存器为1,则WFE将其清除为0并立即完成操作。 详情请参考本章“电源管理”小节。 备注:WFE的目的只是用于节约功率。当写软件时,假定WFE作为NOP运行。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 WFE ; 等待事件 12. WFI 等待中断。 (1)语法 WFI (2)操作 WFI 挂起执行,直至发生下列其中的一个事件: [1] 异常; [2] 中断变为挂起状态,如果PRIMASK被清除,则该中断占用优先权; [3] 存在调试进入请求,无论调试是否使能。 备注:WFI的目的只是用于节约功率。当写软件时,假定WFI作为NOP运行。 (3) 该指令没有。 (4)条件标志 该指令不会更改标志。 (5)示例 WFI ; 等待中断。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 45 广州周立功单片机发展有限公司 第19章 19.5 外设 19.5.1 关于ARM Cortex-M0 专用外设总线(PPB)的地址映射为: 表19.22 内核外设寄存器区 地址 0xE000E008-0xE000E00F 0xE000E010-0xE000E01F 系统控制块 系统定时器 内核外设 描述 表19.31 表19.40 表19.23 表19.31 表19.23 0xE000E100-0xE000E4EF 嵌套向量中断控制器 0xE000ED00-0xE000ED3F 系统控制块 0xE000EF00-0xE000EF03 嵌套向量中断控制器 在寄存器描述中,寄存器的类型有以下几种: R/W — 可读和可写 RO — 只读 WO — 只写 19.5.2 嵌套向量中断控制器 本节描述嵌套向量中断控制器(NVIC)以及它使用的寄存器。NVIC支持: [1] 32个中断; [2] 每个中断的优先级可编程为0~3四种级别。级别越高对应的优先级越低。因此,级 别0是最高的中断优先级。 [3] 中断信号的电平和脉冲检测; [4] 中断末尾连锁; [5] 一个外部不可屏蔽中断(NMI)。LPC111x没有NMI。 处理器在异常进入时自动使它的状态入栈,在异常退出时自动使它的状态出栈,无需采用任何指令。这就实现了低延迟的异常处理。NVIC的硬件寄存器有: 表19.23 NVIC寄存器小结 地址 0xE000E100 0xE000E180 0xE000E200 0xE000E280 0xE000E400-0xE000E41C 名称 类型 复位值 描述 本章“中断设置-使能寄存器”小节 本章“中断清除-使能寄存器”小节 本章“中断设置-挂起寄存器”小节 本章“中断清除-挂起寄存器”小节 本章“中断优先级寄存器”小节 ISER R/W 0x00000000 ICER R/W 0x00000000 ISPR R/W 0x00000000 ICPR R/W 0x00000000 IPR0-7 R/W 0x00000000 1. 使用CMSIS访问Cortex-M0 NVIC寄存器 CMSIS函数允许在不同的Cortex-M系列中进行软件移植。 当利用CMSIS来访问NVIC寄存器时要用到以下函数: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 46 广州周立功单片机发展有限公司 第19章 表19.24 CMSIS访问NVIC函数 CMSIS函数 void NVIC_EnableIRQ(IRQn_Type IRQn)[1] void NVIC_DisableIRQ(IRQn_Type IRQn) [1] void NVIC_SetPendingIRQ(IRQn_Type IRQn) [1] void NVIC_ClearPendingIRQ(IRQn_Type IRQn) [1] uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) [1] void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) [1]uint32_t NVIC_GetPriority(IRQn_Type IRQn) [1] 描述 使能一个中断或异常 禁能一个中断或异常 将中断或异常的挂起状态设为1 将中断或异常的挂起状态清零 读取中断或异常的挂起状态。如果挂起状态被设为1,这个函数就返回非零值 将一个优先级可配置的中断或异常的优先级设置为级别1 读取一个优先级可配置的中断或异常的优先级。这个函数返回当前的优先级级别。 [1] 输入参数IRQn是IRQ编号,更多信息请见表19.10。 2. 中断设置-使能寄存器 ISER使能中断,并显示哪些中断被使能。有关寄存器属性请见表19.23的寄存器小结。该寄存器的位分配如下: 表19.25 ISER的位分配 位 名称 中断设置-使能位。 [31:0] SETENA 写:0 = 无影响 1 = 使能中断 读:0 = 中断被禁能 1 = 中断被使能 功能 如果一个挂起中断被使能,NVIC就根据它的优先级来激活该中断。如果一个中断未被 使能,使该中断的中断信号有效可将中断的状态变成挂起,但是,不管这个中断的优先级如何,NVIC都不会激活该中断。 3. 中断清除-使能寄存器 ICER禁能中断,并显示哪些中断被使能。有关寄存器属性请见表19.23的寄存器小结。这个寄存器的位分配如下: 表19.26 ICER的位分配 位 名称 中断清除-使能位。 [31:0] CLRENA 写:0 = 无影响 1 = 禁能中断 读:0 = 中断被禁能 1 = 中断被使能 功能 4. 中断设置-挂起寄存器 ISPR强制中断进入挂起状态,并显示哪些中断正在挂起。有关寄存器属性请见表19.23 的寄存器小结。 这个寄存器的位分配如下: 表19.27 ISPR的位分配 位 名称 中断设置-挂起位。 [31:0] SETPEND写:0 = 无影响 1 = 将中断状态变为挂起 读:0 = 中断没有挂起 1 = 中断正在挂起 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4747 功能 广州周立功单片机发展有限公司 第19章 备注:向ISPR位写1相当于下面两种情况: z z 正在挂起的中断不会有任何影响 被禁能的中断会将中断的状态设置成挂起 5. 中断清除-挂起寄存器 ICPR使中断离开挂起状态,并显示哪些中断正在挂起。寄存器属性请见表19.23的寄存器小结。 这个寄存器的位分配如下: 表19.28 ICPR的位分配 位 名称 中断清除-挂起位。 [31:0] CLRPEND写:0 = 无影响 1 = 清除中断的挂起状态 读:0 = 中断没有挂起 1 = 中断正在挂起 备注:向ICPR位写1不影响相应中断的有效状态。 功能 6. 中断优先级寄存器 IPR0-IPR7寄存器为每个中断提供了一个两位的优先级域。这些寄存器只能字访问。关于它们的属性请见表19.23的寄存器小结。 每个寄存器包含4个优先级域,如下所示: 图19.13 IPR寄存器 表19.29 IPR的位分配 位 [31:24] [23:16] [15:8] [7:0] 名称 优先级,字节偏移量3 优先级,字节偏移量2 优先级,字节偏移量1 优先级,字节偏移量0 功能 每个优先级域保存一个优先级值(0~3)。值越小,对应中断的优先级越高。处理器只使用每个域的bit[7:6],bit[5:0]读出为0,写操作被忽略。 有关中断优先级阵列(提供了中断优先级的软件视角)访问的更多信息请参考本章“使用CMSIS访问Cortex-M0 NVIC寄存器”小节。 使用下面的方法为中断M找出IPR编号和字节偏移量: z 相应的IPR编号N,通过等式N = N/4得出 z 这个寄存器中所需优先级域的字节偏移量是M MOD 4(M除以4取余),在这里: LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4848 广州周立功单片机发展有限公司 第19章 — 字节偏移量0指的是寄存器位[7:0] — 字节偏移量1指的是寄存器位[15:8] — 字节偏移量2指的是寄存器位[23:16] — 字节偏移量3指的是寄存器位[31:24] 7. 电平有效的中断和脉冲中断 处理器支持电平有效的中断和脉冲中断。脉冲中断也被描述成边沿触发的中断。 一个电平有效的中断一直保持有效,直至外设将中断信号撤销。通常,发生这种情况的原因是ISR访问外设导致外设将中断请求清除。脉冲中断是在处理器时钟的上升沿同时采样到的一个中断信号。为了确保NVIC检测到中断,外设必须使中断信号至少在一个时钟周期内保持有效,在这段时间内NVIC检测脉冲并锁存中断。 当处理器进入ISP时,它自动消除中断的挂起状态,见“(1)中断的硬件和软件控制”小节。对于一个电平有效的中断,如果在处理器从ISR返回之前中断信号未被撤销,中断就再次变成挂起,处理器必须再次执行ISR。这就表示,外设可以一直使中断信号保持有效,直到它不再需要服务为止。 (1)中断的硬件和软件控制 Cortex-M0锁存所有的中断。外设中断会由于下面的其中一个原因而变为挂起: z NVIC检测到中断信号有效,而相应的中断无效; z NVIC检测到中断信号的一个上升沿; z 软件向相应的中断设置-挂起寄存器位写入值,见本章“中断设置-挂起寄存器”小 节。 挂起的中断一直保持挂起,直到出现以下其中一种情况: z 处理器进入中断的ISR。这就使中断的状态从挂起变为有效。而且: — 对于电平有效的中断,当处理器从ISR返回时,NVIC采样中断信号。如果中 断信号有效,中断的状态变回挂起,这可能使得处理器立刻再次进入ISR。否则,中断的状态变为无效。 — 对于脉冲中断,NVIC继续监测中断信号,如果这个中断信号一直处于脉冲状态,中断的状态就变成挂起和有效。在这种情况下,当处理器从ISR返回时,中断的状态变为挂起,这可能使得处理器立刻重新进入ISR。 如果当处理器在处理ISR时中断信号的脉冲就不存在了,那么,当处理器从ISR返回时中断的状态变为无效。 z 利用软件向相应的中断清除-挂起寄存器位写入值。 对于电平有效的中断,如果中断信号仍然有效,中断的状态不改变。否则,中断的状态变为无效。 对于脉冲中断,中断的状态变为: — 无效(如果中断之前的状态是挂起) — 有效(如果中断之前的状态是有效和挂起) 8. NVIC的使用提示和技巧 保证软件正确使用对齐的寄存器访问。处理器不支持非对齐的NVIC寄存器访问。 中断即使被禁能也可以进入挂起状态。禁能一个中断只阻止处理器处理中断。 (1)NVIC编程提示 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 4949 广州周立功单片机发展有限公司 第19章 软件使用CPSIE i和指令来使能和禁能中断。CMSIS为这些指令提供以下内在函数: void __disable_irq(void) // 禁能中断 void __enable_irq(void) // 使能中断 另外,CMSIS提供了许多NVIC控制函数,包括: 表19.30 CMSIS的NVIC控制函数 CMSIS中断控制函数 void NVIC_EnableIRQ(IRQn_t IRQn) void NVIC_DisableIRQ(IRQn_t IRQn) uint32_t NVIC_GetPendingIRQ (IRQn_t IRQn) void NVIC_SetPendingIRQ (IRQn_t IRQn) void NVIC_ClearPendingIRQ (IRQn_t IRQn) void NVIC_SetPriority (IRQn_t IRQn, uint32_t priority) uint32_t NVIC_GetPriority (IRQn_t IRQn) void NVIC_SystemReset (void) 使能IRQn 禁能IRQn 如果IRQn正在挂起,返回真(1) 设置IRQn挂起状态 清除IRQn挂起状态 设置IRQn的优先级 读取IRQn的优先级 复位系统 描述 输入参数IRQn是IRQ编号,更多信息请见表19.10。有关这些函数的更多信息,请见CMSIS的资料。 19.5.3 系统控制块 系统控制块(SCB)提供了系统执行信息和系统控制,包括配置、控制和系统异常的报告。SCB寄存器有: 表19.31 SCB寄存器小结 地址 0xE000ED00 0xE000ED04 0xE000ED0C 0xE000ED10 0xE000ED14 0xE000ED1C 0xE000ED20 名称 类型 复位值 0x410CC200 描述 本章“CPUID寄存器”小节 本章“中断控制和状态寄存器”小节本章“应用中断和复位控制寄存器”小节 本章“系统控制寄存器”小节 本章“配置和控制寄存器”小节 本章“系统处理程序优先级寄存器2”小节 本章“系统处理程序优先级寄存器3”小节 CPUID RO ICSR RW[1] 0x00000000 AIRCR RW[1] 0xFA050000 SCR RW 0x00000000 CCR RO SHPR2 RW SHPR3 RW 0x00000204 0x00000000 0x00000000 [1] 更多信息请见寄存器描述。 1. Cortex-M0 SCB寄存器的CMSIS映射 为了提高软件效率,CMSIS简化了SCB寄存器的表现形式。在CMSIS中,阵列SHP[1] 对应寄存器SHPR2-SHPR3。 2. CPUID寄存器 CPUID寄存器包含处理器的型号、版本和实现信息。有关它的属性请见寄存器小结。CPUID的位分配如下: 表19.32 CPUID寄存器的位分配 位 名称 功能 [31:24] Implementer 实现代码:0x41 = ARM LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5050 广州周立功单片机发展有限公司 第19章 续上表 位 名称 功能 更新编号,产品版本标识符rnpn中r的值:0x0 = 版本0 定义处理器结构的常量;读取的结果是:0xC = ARMv6-M结构 处理器的型号:0xC20 = Cortex-M0 [23:20] Variant [19:16] Constant [15:4] Partno [3:0] Revision 修订编号,产品版本标识符rnpn中p的值:0x0 = Patch 0 3. 中断控制和状态寄存器 ICSR: [6] 提供了: — 为不可屏蔽中断(NMI)异常提供了一个设置-挂起位; — 为PendSV和SysTick异常提供了设置-挂起位和清除-挂起位。 [7] 指明了: — 正在处理的异常的异常编号; — 是否有被抢占的有效异常; — 最高优先级挂起异常的异常编号; — 是否有任何异常正在挂起。 有关ICSR的属性请见表19.31的寄存器小结。ICSR的位分配如下: 表19.33 ICSR的位分配 位 名称 类型 NMI设置-挂起位。 写:0 = 无影响 1 = 将NMI异常的状态变为挂起读:0 = NMI异常未挂起 1 = NMI异常正在挂起 由于NMI是优先级最高的异常,因此,一般情况下,处 [31] NMIPENDSET[2] R/W 理器一旦检测到向该位写1就立刻进入NMI异常处理程 序。处理器进入处理程序后将该位清零。这就表示,只有当NMI信号在处理器正在执行NMI异常处理程序的过程中再次有效,通过异常处理程序读取这个位才返回1。 [30:29] - - 保留。 PendSV设置-挂起位。 写:0 = 无影响 1 = 将PendSV异常的状态变为挂起 [28] PENDSVSET R/W 读:0 = PendSV异常未挂起 1 = PendSV异常正在挂 起 向该位写1是将PendSV异常状态设为挂起的唯一方法。 [27] PENDSVCLR PendSV清除-挂起位。 WO 写:0 = 无影响 1 = 撤销PendSV异常的挂起状态 SysTick异常设置-挂起位。 [26] PENDSTSET 写:0 = 无影响 1 = 将SysTick异常的状态变为挂起 R/W 读:0 = SysTick异常未挂起 1 = SysTick异常正在挂 起 功能 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5151 广州周立功单片机发展有限公司 第19章 续上表 位 名称 类型 功能 SysTick异常清除-挂起位。 [25] PENDSTCLR 写:0 = 无影响 1 = 撤销SysTick异常的挂起状态 WO 该位只可写。当对这个寄存器执行读操作时,该位读出 的值不可知。 [24:23] - [22] ISRPENDING -保留。 除NMI和故障之外的中断的挂起标志: RO 0 = 中断未挂起 1 = 中断正在挂起 [21:18] - -保留 指示优先级最高的、正在挂起的并且使能的异常的异常编号: [17:12] VECTPENDING RO 0 = 没有正在挂起的异常 非零 = 优先级最高的、正在挂起的并且使能的异常的异常编号。 [11:6] - -保留 包含有效的异常编号: 0 = 线程模式 非零 = 当前有效异常的异常编号[1]。 [5:0] VECTACTIVE RO 备注:这个值减去16得到CMSIS IRQ编号,编号标识出 [1] 对应在中断清除-使能、设置-使能、清除-挂起、设置-挂起以及优先级寄存器中的位,请见表19.5。 [1] 这个值与IPSR位[5:0]的值相同,请见表19.5。 [2] NMI不能在LPC111x上实现。 写ICSR时,如果执行下列操作,结果将不可知: [1] 写1到PENDSVSET位和写1到PENDSVCLR位 [2] 写1到PENDSTSET位和写1到PENDSTCLR位 4. 应用中断和复位控制寄存器 AIRCR提供了数据访问的字节顺序状态和系统的复位控制信息。有关寄存器的属性请见表19.31和表19.34的寄存器小结。 如果要写这个寄存器,必须先向VECTKEY域写入0x05FA,否则,处理器会将写操作忽略。 AIRCR的位分配如下: 表19.34 AIRCR的位分配 位 [31:16] 名称 读:保留 写:VECTKEY 类型 寄存器码: RW 读出的值不可知。 执行写操作时将0x05FA写入VECTKEY,否则写操作被忽略。采用的数据字节存储顺序: [15] ENDIANESS RO 0 = 小端 1 = 大端 功能 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5252 广州周立功单片机发展有限公司 第19章 续上表 位 名称 类型 功能 [14:3] - - 保留 系统复位请求: 0 = 无影响 [2] SYSRESETREQ WO 1 = 请求一个系统级复位 这个位读出为0。 保留供调试使用。这个位读出为0。当写这个寄存器时,必须向 [1] VECTCLRACTIVE WO 这个位写0,否则操作将不可预知。 [0] - - 保留 5. 系统控制寄存器 SCR控制着低功耗状态的进入和退出特性。有关寄存器的属性请见表19.31的寄存器小结。SCR的位分配如下: 表19.35 SCR的位分配 位 [31:5] - 名称 保留 挂起时发送事件位: 0 = 只有使能的中断或事件能够唤醒处理器。不接受禁能中断的唤醒。 [4] SEVONPEND 1 = 使能的事件和包括禁能中断在内的所有中断都能唤醒处理器。 当一个事件或中断进入挂起状态时,事件信号将处理器从WFE唤醒。如果处理器并未在等待一个事件,事件被记录,影响下个WFE。 处理器也可以在执行SEV指令时唤醒。 [3] - [2] SLEEPDEEP 保留 控制处理器是将睡眠模式还是深度睡眠模式作为低功耗模式: 0 = 睡眠 1 = 深度睡眠 指示当从处理器模式返回到线程模式时sleep-on-exit(退出时进入睡眠): [1] SLEEPONEXIT 0 = 处理器返回到线程模式时不进入睡眠 1 = 处理器从ISR返回到线程模式时进入睡眠或深度睡眠 将该位设为1允许一个中断驱动的应用程序避免返回到一个空的主应用程序。 [0] - 保留 功能 6. 配置和控制寄存器 CCR是一个只读寄存器,指出了Cortex-M0处理器行为的一些情况。有关CCR属性请见 表19.31的寄存器小结。CCR的位分配如下: 表19.36 CCR的位分配 位 [31:10] - [9] STKALIGN 名称 保留 该位读出总是为0,指示进入异常时堆栈按8字节对齐。 进入异常时,处理器使用入栈的PSR的bit[9]来指示栈对齐。从异常中返回时,处理器使用这个入栈的位来恢复正确的栈对齐。 功能 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5353 广州周立功单片机发展有限公司 第19章 续上表 位 [8:4] - [2:0] - 名称 保留 保留 功能 [3] UNALIGN_TRP 该位读出总是为0,指示所有未对齐的访问产生一个HardFault。 7. 系统处理程序优先级寄存器 SHPR2-SHPR3寄存器设置优先级可配置的异常处理程序的优先级级别(0~3)。 SHPR2-SHPR3是字可访问的。有关它们的属性请见表19.31的寄存器小结。 利用CMSIS访问系统异常的优先级级别要用到以下CMSIS函数: [1] uint32_t NVIC_GetPriority(IRQn_Type IRQn) [2] void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 输入参数IRQn是IRQ编号,更多信息请见表19.10。 系统故障处理程序、优先级域以及每个处理程序的寄存器如下所示: 表19.37 系统故障处理程序优先级域 处理程序 域 寄存器描述 SVCall PRI_11 见本章“系统处理程序优先级寄存器”小节。 PendSV PRI_14 见本章“系统处理程序优先级寄存器”小节。 SysTick PRI_15 每个PRI_N域8位宽,但处理器只使用每个域的bit[7:6];bit[5:0]读出为0,写操作被忽略。 (1)系统处理程序优先级寄存器2 该寄存器的位分配如下: 表19.38 SHPR2寄存器的位分配 位 名称 功能 系统处理程序11(SVCall)的优先级 保留 [31:24] PRI_11 [23:0] - (2)系统处理程序优先级寄存器3 该寄存器的位分配如下: 表19.39 SYST_CSR的位分配 位 名称 功能 系统处理程序15(SysTick异常)的优先级 系统处理程序14(PendSV)的优先级 保留 [31:24] PRI_15 [23:16] PRI_14 [15:0] - 8. SCB使用的提示和技巧 保证软件使用对齐的32位字大小传输来访问所有的SCB寄存器。 19.5.4 系统定时器,SysTick 当系统定时器被使能时,定时器从重装值开始递减计数到零,下个时钟周期再将 SYST_RVR的值重新加载到定时器(一个回合),然后在后面的时钟周期下继续开始递减计数。向SYST_RVR写零会使计数器在下个回合禁能。当计数器跳变到零时,COUNTFLAG状态位被设为1。读SYST_CSR将COUNTFLAG位清零。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 广州周立功单片机发展有限公司 第19章 写SYST_CVR会将该寄存器和COUNTFLAG状态位都清零。这个写操作不触发SysTick异常逻辑。读取SYST_CVR寄存器返回的是读取操作执行当下的寄存器值。 备注:当寄存器由于调试而被终止时,计数器不递减计数。 系统定时器寄存器有: 表19.40 系统定时器寄存器小结 地址 0xE000E010 0xE000E014 0xE000E018 0xE000E01C 名称 SYST_CSR SYST_RVR SYST_CVR SYST_CALIB 类型 复位值 描述 本章“SysTick控制和状态寄存器”小节 本章“SysTick重装值寄存器”小节本章“SysTick当前值寄存器”小节本章“SysTick校准值寄存器”小节 R/W 0x00000000 R/W R/W 不可知 不可知 RO 0xC0000000[1] [1] SysTick的校准值 1. SysTick控制和状态寄存器 SYST_CSR使能SysTick特性。有关寄存器的属性请见表19.40的寄存器小结。该寄存器的位分配为: 表19.41 SYST_CSR的位分配 位 [31:17] - [15:3] - 名称 保留 保留 选择SysTick定时器的时钟源: [2] CLKSOURCE 0 = 外部基准时钟 1 = 处理器时钟 使能SysTick异常请求: [1] TICKINT 0 = 计数到零不提交SysTick异常请求 1 = 计数到零提交SysTick异常请求 使能计数器: [0] ENABLE 0 = 计数器被禁能 1 = 计数器被使能 功能 [16] COUNTFLAG 如果自从上次读这个寄存器之后定时器计数到0,该位就返回1 2. SysTick重装值寄存器 SYST_RVR设定了加载到SYST_CVR的起始值。有关寄存器的属性请见表19.40的寄存器小结。该寄存器的位分配为: 表19.42 SYST_RVR的位分配 位 [31:24] - [23:0] RELOAD 名称 保留 当计数器被使能且计数值到达0时加载到SYST_CVR的值,请见本章“计算RELOAD值”小节。 功能 (1)计算RELOAD值 RELOAD值可以是0x00000001-0x00FFFFFF范围内的任何值。您可以将RELOAD的值设为0,这不会产生任何影响,因为计数值从1变为0时SysTick异常请求和COUNTFLAG都被激活了。 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5555 广州周立功单片机发展有限公司 第19章 如果要产生一个周期为N个处理器时钟周期的多次触发定时器,就可以将RELOAD值设为N-1。例如,如果要求每隔100个时钟脉冲就触发一次SysTick中断,RELOAD就被设为99。 3. SysTick当前值寄存器 SYST_VCR包含SysTick计数器的当前值。有关寄存器的属性请见表19.40的寄存器小结。该寄存器的位分配如下: 表19.43 SYST_CVR的位分配 位 [31:24] - [23:0] CURRENT 名称 保留 读取时返回SysTick计数器的当前值。 向这个域写入任何值都会将该域清零,还会清零SYST_CSR的COUNTFLAG位。 功能 4. SysTick校准值寄存器 SYST_CALIB寄存器指明了SysTick的校准特性。有关寄存器的属性请见表19.40的寄存器小结。该寄存器的位分配如下: 表19.44 SYST_CALIB寄存器的位分配 位 名称 功能 该位读出为0。该位指明不提供的基准时钟 该位读出为0。由于TENMS不可知,因此,10ms不精确计时的校准值不能确定。这会影响SysTick作为软件实时时钟的适用性 保留 该位读出为0。该域指明校准值不可知。 [31] NOREF [30] SKEW [29:24] - [23:0] TENMS 如果校准信息不可知,就通过处理器时钟或外部时钟的频率来计算所需的校准值。 5. SysTick使用的提示和技巧 利用中断控制器时钟来更新SysTick计数器。如果这个时钟信号由于进入低功耗模式而终止,SysTick计数器就停止计数。 确保软件使用字访问来访问SysTick寄存器。 如果在复位时没有定义SysTick计数器的重装值和当前值,正确的SysTick计数器初始化序列如下: 第1步:设置重装值 第2步:清除当前值 第3步:设置控制和状态寄存器 LPC1100系列微控制器用户手册 ©2008 Guangzhou ZLGMCU Development CO., LTD. 5656 http://shop58972409.taobao.com/ 贞明电子 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务