CortexM0.docx
《CortexM0.docx》由会员分享,可在线阅读,更多相关《CortexM0.docx(49页珍藏版)》请在冰豆网上搜索。
CortexM0
单片机教程
(Cortex-M0处理器)
第1章Cortex-M0的处理器和内核外设
1.1系统接口
1.2集成的可配置调试
1.3Cortex-M0处理器的特性小结
1.4Cortex-M0内核外设
第2章Cortex-M0处理器
2.1编程模型
2.2存储模型
2.3异常模型
2.4故障处理
2.5功耗管理
第3章外设
3.1关于ARMCortex-M0
3.2嵌套向量中断控制器
3.3系统控制块
3.4系统定时器,SysTick
第1章Cortex-M0的处理器和内核外设
Cortex-M0处理器是一个入门级(entry-level)的32位ARMCortex处理器,设计用在更宽范围的嵌入式应用中。
该处理器包含以下特性,给开发者提供了极大的便利:
●结构简单,容易学习和编程;
●功耗极低,运算效率高;
●出色的代码密度;
●确定、高性能的中断处理;
●向上与Cortex-M处理器系列兼容
图1.1Cortex-M0的具体实现
Cortex-M0处理器基于一个高集成度、低功耗的32位处理器内核,采用一个3级流水线冯·诺伊曼结构(VonNeumannarchitecture)。
通过简单、功能强大的指令集以及全面优化的设计(提供包括一个单周期乘法器在内的高端处理硬件),Cortex-M0处理器可实现极高的能效。
Cortex-M0处理器采用ARMv6-M结构,基于16位的Thumb指令集,并包含Thumb-2技术。
提供了一个现代32位结构所希望的出色性能,代码密度比其他8位和16位微控制器都要高。
Cortex-M0处理器紧密集成了一个可配置的嵌套向量中断处理器(NVIC),提供业界领先的中断性能。
NVIC具有以下功能:
●包含一个不可屏蔽的中断(NMI)。
NMI在LPC111x上不能实现;
●提供零抖动中断选项;
●提供4个中断优先级。
处理器内核和NVIC的紧密结合使得中断服务程序(ISR)可以快速执行,极大地缩短了中断延迟。
这是通过寄存器的硬件堆栈以及加载-乘和存储-乘操作的停止和重启来获得的。
中断处理程序不需要任何汇编封装代码,不用消耗任何ISR代码。
末尾连锁的优化还极大地降低了一个ISR切换到另一个ISR时的开销。
为了优化低功耗设计,NVIC还与睡眠模式相结合,提供一个深度睡眠功能,使整个器件迅速掉电。
1.1系统接口
Cortex-M0处理器提供一个简单的系统级接口,使用AMBA技术来提供高速、低延迟的存储器访问。
1.2集成的可配置调试
Cortex-M0处理器执行一个完整的硬件调试方案,带有大量的硬件断点和观察点选项。
通过一个非常适合微控制器和其他小型封装器件的2脚串行线调试(SWD)端口,提供了高系统透明度的处理器、存储器和外设执行。
1.3Cortex-M0处理器的特性小结
●高代码集成度,具有32位的性能;
●工具和二进制代码与Cortex-M处理器系列向上兼容;
●集成了极低功耗的睡眠模式;
●高效的代码执行允许处理器时钟更低,或者延长睡眠模式的时间;
●单周期的32位硬件乘法器;
●零抖动的中断处理;
●宽范围的调试功能。
1.4Cortex-M0内核外设
Cortex-M0内核外设有:
NVIC——NVIC是一个嵌入式中断控制器,支持低延迟的中断处理。
系统控制块——系统控制块(SCB)是到处理器的编程模型接口。
它提供系统执行信息和系统控制,包括配置、控制和系统异常的报告。
系统定时器——系统定时器,SysTick,是一个24位的递减定时器。
可以将其用作一个实时操作系统(RTOS)的节拍定时器,或者用作一个简单的计数器。
第2章Cortex-M0处理器
2.1编程模型
本节描述了Cortex-M0的编程模型。
除了个别内核寄存器的描述之外,本节还包含操作模式和堆栈的相关信息。
1处理器工作模式
处理器工作模式有:
Thread模式——用来执行应用程序。
在处理器复位时,进入Thread模式。
Handler模式——用于异常处理,处理器执行完所有异常程序后,返回到Thread模式。
2堆栈
处理器使用一个满递减堆栈。
这就意味着堆栈指针指向堆栈存储器中的最后一个堆栈项。
当处理器将一个新的项压入堆栈时,堆栈指针递减,然后将该项写入新的存储器单元。
处理器执行两个堆栈,主堆栈和进程堆栈,两个堆栈有自己独立的堆栈指针副本,见“堆栈指针”小节。
在线程模式下,CONTROL寄存器控制着处理器使用主堆栈还是进程堆栈,见“CONTROL寄存器”小节。
在处理器模式下,处理器总是使用主堆栈。
处理器操作的选择如下:
表2.1处理器模式和堆栈使用的选择
处理器工作模式
用于执行
所用堆栈
Thread模式
应用程序
主堆栈或进程堆栈
Handler模式
异常处理
主堆栈
3内核寄存器
处理器内核寄存器如下:
图2.1处理器内核寄存器组
处理器内核寄存器有:
表2.2内核寄存器组小结
名称
类型
复位值
描述
R0-R12
RW
未知
见通用寄存器组介绍
MSP
RW
参考相关介绍
见堆栈介绍
PSP
RW
未知
见堆栈指针介绍
LR
RW
未知
见链接寄存器介绍
PC
RW
参考相关介绍
见程序计数器介绍
PSR
RW
未知
见程序状态寄存器介绍
APSR
RW
未知
见应用程序状态寄存器介绍
IPSR
RO
0x00000000
见中断程序状态寄存器介绍
EPSR
RO
未知
见异常程序状态寄存器介绍
PRIMASK
RW
0x00000000
见优先级屏蔽寄存器介绍
CONTROL
RW
0x00000000
见控制寄存器介绍
(1)通用寄存器
R0-R12是供数据操作使用的32位通用寄存器。
(2)堆栈指针
堆栈指针(SP)是寄存器R13。
在线程模式中,CONTROL寄存器的bit[1]指示了堆栈指针的使用情况:
0=主堆栈指针(MSP)。
这是复位值。
1=进程堆栈指针(PSP)。
复位时,处理器将地址0x00000000的值加载到MSP中。
(3)链接寄存器
链接寄存器(LR)是寄存器R14。
它保存子程序、函数调用和异常的返回信息。
复位时,LR的值不可知。
(4)程序计数器
程序计数器(PC)是寄存器R15。
它包含当前的程序地址。
复位时,处理器将复位向量(地址:
0x00000004)的值加载到PC。
值的bit[0]复位时被加载到EPSR的T位,必须1。
(5)程序状态寄存器
程序状态寄存器(PSR)由下列3种寄存器组合而成:
●应用程序状态寄存器(APSR)
●中断程序状态寄存器(IPSR)
●执行程序状态寄存器(EPSR)
在32位的PSR中,这3个寄存器的位域分配互斥。
PSR的位域分配如下:
图2.2APSR、IPSR、EPSR寄存器的位分配
这3个寄存器可以单独访问,也可以2个一组或3个一组进行访问,访问时,将寄存器名称作为MSR或MRS指令的一个变量。
例如:
1使用寄存器名称PSR,用MRS指令来读所有寄存器
2使用寄存器名称APSR,用MSR指令来写APSR
PSR的组合和属性如下所示:
表2.3PSR寄存器组合
寄存器
类型
组合
PSR
R/W
APSR、EPSR和IPSR
IEPSR
RO
EPSR和IPSR
IAPSR
R/W
APSR和IPSR
EAPSR
R/W
APSR和EPSR
应用程序状态寄存器:
APSR包含执行完前面的指令后条件标志的当前状态。
有关寄存器的属性请见表2.2。
寄存器的位分配如下所示:
表2.4APSR的位分配
位
名称
功能
[31]
N
负值标志
[30]
Z
零值标志
[29]
C
进位或借位标志
[28]
V
溢出标志
[27:
0]
-
保留
中断程序状态寄存器:
ISP包含当前中断服务程序(ISR)的异常编号。
有关寄存器的属性请见表2.2。
寄存器的位分配如下
表2.5IPSR的位分配
位
名称
功能
[31:
6]
-
保留
[5:
0]
异常编号
这是当前异常的编号:
0=线程模式
1=保留
2=NMI
3=HardFault
4-10=保留
11=SVCall
12,13=保留
14=PendSV
15=SysTick
16=IRQ0
.
.
.
47=IRQ31
48-63=保留。
.
执行程序状态寄存器:
EPSR包含Thumb状态位。
有关EPSR属性请见表2.2。
EPSR的位分配如下:
表2.6EPSR的位分配
位
名称
功能
[31:
25]
-
保留
[24]
T
Thumb状态位
[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)异常屏蔽寄存器
异常屏蔽寄存器禁止处理器处理异常。
当异常可能影响到实时任务或要求连续执行的代码序列时,异常就被禁能。
可以使用MSR和MRS指令、或CPS指令改变PRIMASK的值来禁能或重新使能异常。
优先级屏蔽寄存器:
PRIMASK寄存器阻止优先级可配置的所有异常被激活。
有关寄存器的属性请见表2.2。
寄存器的位分配如下:
表2.7PRIMASK寄存器的位分配
位
名称
功能
[31:
1]
-
保留
[0]
PRIMASK
0=无影响。
1=阻止优先级可配置的所有异常被激活。
(7)CONTROL寄存器
CONTROL寄存器控制着处理器处于线程模式时所使用的堆栈。
寄存器的属性请见表2.2。
CONTROL寄存器的位分配如下:
表2.8CONTROL寄存器的位分配
位
名称
功能
[31:
2]
-
保留
[1]
有效堆栈指针
定义当前的堆栈:
0=MSP是当前的堆栈指针
1=PSP是当前的堆栈指针
在处理器模式中,这个位读出为零,写操作被忽略。
[0]
-
保留
处理器模式始终使用MSP,因此,在处理器模式下,处理器忽略对CONTROL寄存器的有效堆栈指针位执行的明确的写操作。
异常进入和返回机制会将CONTROL寄存器更新。
在一个OS环境中,推荐运行在线程模式中的线程使用进程堆栈,内核和异常处理器使用主堆栈。
默认情况下,线程模式使用MSP。
要将线程模式中使用的堆栈指针切换成PSP,只需要使用MSR指令将有效堆栈位设置为1,见本章“MRS”小节。
备注:
当更改堆栈指针时,软件必须在MSR指令后立刻使用一个ISB指令。
这样来保证ISB之后的指令执行时使用新的堆栈指针。
4异常中断
Cortex-M0处理器支持中断和系统异常。
处理器和嵌套向量中断控制器(NVIC)划分所有异常的优先级,并对所有异常进行处理。
一个中断或异常会改变软件控制的正常流程。
处理器使用处理器模式来处理除复位之外的所有异常。
NVIC寄存器控制中断处理。
5数据类型
处理器:
[1]支持下列数据类型:
—32位字
—16位半字
—8位字节
[2]管理所有数据存储器访问都采用小端模式。
指令存储器和专用外设总线(PPB)访问始终是小端模式。
6Cortex微控制器软件接口标准
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]本章“使用CMSIS访问和Cortex-M0NVIC寄存器”小节;
[4]本章“NVIC编程提示”小节。
2.2存储模型
本节描述处理器存储器映射以及存储器访问的行为。
处理器有一个固定的存储器映射,提供有高达4GB的可寻址存储空间。
存储器映射是:
图2.3Cortex-M3存储器映射
处理器为内核外设寄存器保留了专用外设总线(PPB)地址范围空间,见本章的“Cortex-M0的处理器和内核外设”一节。
1存储区、类型和属性
存储器映射分成多个区域。
每个区域有一个定义好的存储器类型,某些区域还有附加的存储器属性。
存储器类型和属性决定了各个区域的访问行为。
存储器类型是:
常规存储器—处理器为了提高效率,可以重新对交易进行排序,或者刻意地进行读取。
Device存储器—处理器保护与Device或强秩序存储器(Strong-orderedmemory)的其它交易相关的交易秩序。
强秩序存储器—处理器保护与所有其他交易相关的交易秩序。
Device存储器和强秩序存储器的不同秩序要求意味着,存储器系统可以缓冲一个对Device存储器的写操作,但不准缓冲对强秩序存储器的写操作。
附加的存储器属性包括:
永不执行(XN)—表示处理器阻止指令访问。
当执行从存储器的XN区提取出来的指令时,产生一个HardFault异常。
2存储系统的访问顺序
对于大多数由明确的存储器访问指令引发的存储器访问,存储器系统都不保证访问秩序与指令的编写顺序完全一致,只要所有访问秩序的重新安排不影响指令序列的操作就行。
一般情况下,如果两个存储器访问的顺序必须与两条存储器访问指令编写的顺序完全一致程序才能正确执行,软件就必须在两条存储器访问指令之间插入一条内存屏障指令,见本章“软件的存储器访问秩序”小节。
但是,存储器系统不保证Device存储器和强秩序存储器的一些访问秩序。
对于两条存储器访问指令A1和A2,如果A1的编写顺序在前,两条指令所引发的存储器访问顺序为:
图2.4存储器排序限制
在表中:
-—表示存储器系统不保证访问秩序。
<—表示观察到访问顺序与指令编写顺序一致,即,A1总是在A2之前。
3存储访问行为
存储器映射中每个区域的访问行为如下:
表2.9存储器访问的行为
地址范围
存储区域
存储类型
XN
描述
0x00000000-0x1FFFFFFF
Code
常规存储器
-
程序代码的可执行区域。
也可以把数据保存到这里
0x20000000-0x3FFFFFFF
SRAM
常规存储器
-
数据的可执行区域。
也可以把代码保存到这里
0x40000000-0x5FFFFFFF
外设
Device存储器
XN
外部设备存储器
0x60000000-0x9FFFFFFF
外部RAM
常规存储器
-
数据的可执行区域
0xA0000000-0xDFFFFFFF
外部设备
Device存储器
XN
外部设备存储器
0xE0000000-0xE00FFFFF
专用外部总线
强秩序存储器哦
XN
这个区域包括NVIC、系统定时器和系统控制块。
这个区域只能使用字访问
0xE0100000-0xFFFFFFFF
Device
Device存储器
XN
厂商提供的特定存储器
Code、SRAM和外部RAM区域可以保存程序。
4软件的存储器访问秩序
程序流程的指令顺序不能担保相应的存储器交易顺序。
这是因为:
[1]为了提高效率,处理器可以将一些存储器访问的顺序重新安排,只要不影响指令序列的操作就行;
[2]存储器映射中的存储器或设备可能有不同的等待状态;
[3]某些存储器访问被缓冲,或者是刻意为之的。
“存储器系统的存储器访问秩序”小节描述了存储器系统在哪些情况下能保证存储器访问的秩序。
但是,如果存储器访问的秩序十分重要,软件就必须插入一些内存屏障指令来强制保持存储器访问的秩序。
处理器提供了以下内存屏障指令:
DMB—数据存储器屏障(DMB)指令保证先完成未处理的存储器交易,再执行后面的存储器交易,见本章“DMB”小节。
DSB—数据同步屏障(DSB)指令保证先完成未处理的存储器交易,再执行后面的指令,见本章“DSB”小节。
ISB—指令同步屏障(ISB)保证所有已完成的存储器交易的结果后面的指令都能辨认出来,见本章“ISB”小节。
下面是内存屏障指令使用的一些例子:
向量表—如果程序改变了向量表中的一项,然后又使能了相应的异常,那么就在两个操作之间插入一条DMB指令。
这就确保了,如果异常在被使能后立刻被采纳,处理器能使用新的异常向量。
自修改代码—如果一个程序包含自修改代码,代码修改之后在程序中立刻使用一条ISB指令。
这就确保了后面的指令执行使用的是更新后的程序。
存储器映射切换—如果系统包含一个存储器映射切换机制,在切换存储器映射之后使用一条DSB指令。
这就确保了后面的指令执行使用的是更新后的存储器映射。
对强秩序存储器(例如,系统控制块)执行的存储器访问不需要使用DMB指令。
处理器保护与所有其他交易相关的交易秩序。
5存储器的字节存储顺序
处理器看到的存储器是一个从零开始、编号逐次递增的字节集合。
例如,字节0~3存放第一个保存的字,字节4~7存放第二个保存的字。
“
(1)小端格式”小节描述了数据的字在存储器中是如何存放的。
(1)小端格式
在小端格式中,处理器将字的最低有效字节(lsbyte)保存在编号最小的字节中,最高有效字节(msbyte)保存在编号最大的字节中。
例如:
图2.5小端格式
2.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来进行任务切换。
SysTick—SysTick是一个系统定时器到达零时产生的异常。
软件也可以产生一个SysTick异常。
在OS环境下,处理器可以将这个异常用作系统节拍。
中断(IRQ)—中断(或IRQ)是外设发出的一个异常,或者是由软件请求产生的一个异常。
所有中断都与指令执行不同步。
在系统中,外设使用中断来与处理器通信。
表2.10各种异常类型的特性
异常编号
IRQ编号
异常类型
优先级
向量地址
1
-
复位
-3,优先级最高
0x00000004
2
-14
NMI
-2
0x00000008
3
-13
HardFault
-1
0x0000000C
4-10
-
保留
-
-
11
-5
SVCall
可配置
0x0000002C
12-13
-
保留
-
-
14
-2
PendSV
可配置
0x00000038
15
-1
SysTick
可配置
0x0000003C
16和大于16的值
0和大于0的值
中断(IRQ)
可配置
0x00000040
以及更高的地址
对于除复位之外的异步异常,在异常被触发和处理器进入异常处理程序之间,处理器可以执行条件指令。
被特许的软件可以将表2.10中列出的优先级可配置的异常禁能。
3异常处理程序
处理器使用以下处理程序来处理异常:
中断服务程序(ISR)—中断IRQ0~IRQ31是由ISR来处理的异常。
故障处理程序—HardFault是唯一一个由故障处理程序来处理的异常。
系统处理程序—NMI、PendSV,SVCall、SysTick和HardFault是由系统处理程序来处理的全部异常。
4向量表
向量表包含堆栈指针的复位值以及所有向量处理程序的起始地址(也称为异常向量)。
图2.6显示了异常向量在向量表中的放置顺序。
每个向量的最低有效位必须为1,表明异常处理程序都是用Thumb代码编写的。
图2.6向量表
向量表的地址固定为0x00000000。
5异常优先级
如表19.10所示,每个异常都有对应的优先级:
●越小的优先级值指示一个更高的优