文章目录
ARM处理器类型
ARM 处理器采用的是精简指令集 (Reduced Instruction Set Computing,RISC)处理器架构。RISC 架构的特点包括:
- 在功耗,尤其是低功耗方面优势明显。
- 这种架构已经被广泛的应用在移动设备中,比如: 智能电话和平板电脑中。
- 这种架构具有良好的生态系统支持,生态系统包括:技术文档、设计参考、驱动程序代码,以及不同的操作系统。对于设计用户来说,很容易找到相关的设计资源。
目前,ARM 处理器主要分为 Cortex-A、Cortex-R、Cortex-M、SecurCore 和 Classic 几大类
Cortex-A系列
该系列处理器也称为应用处理器,该系列属于高性能处理器,可使用各种开放的操作系统,比如 Linux。Cortex-A 系列处理器主要应用于智能电话、数字电视、智能书、家用网关等。
Cortex-R系列
该系列处理器也称为实时处理器,基于该处理器在异常事件处理方面的性能,它主要用于实时方面的应用,包括:汽车刹车系统、动力装置等。.
Cortex-M系列
该系列处理器主要应用于对价格比较敏感,也就是低成本的场合,比如:微控制器、混合信号设备、智能传感器、汽车电子和安全气囊。
SecurCore系列
该系列处理器主要应用于对安全性要求较高的场合。
Classic系列
该系列是以前传统的处理器架构,包括ARM7、ARM9 和ARM11等。
Cortex-M系列处理器的特点
Cortex-M 系列处理器包括: Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4、
Cortex-M7,该系列处理器的特点主要包括:
- 该系列处理器主要应用于低功耗,以及对电池续航能力要求较高的场合。
- 该系列处理器结构相对简单,所消耗的晶圆面积较少,因此该系列处理器封装体积较小。
- 通过 Keil uVision 集成开发环境,可以迅速完成软件应用程序的开发,以及实现设计代码的重用。·
Cortex-M0的ARM架构为ARMv6-M,内核架构为冯诺依曼架构,包含大部分的Thumb和Thumb-2子集,硬件乘法为1或者32个周期,无硬件除法,无饱和数运算,无DSP扩展,无浮点
ARM架构之间的关系
Cortex-M0处理器的性能
Cortex-M0处理器是Cortex-M 系列处理器中结构和功能最简单的一个处理器,其性能和特点主要包括:
- 采用32位RISC架构的处理器。
- 采用冯诺依曼架构,即:指令和数据共享一个总线接口。
- 当使用 Cortex-M0处理器的最小配置时,构成该处理器大约只消耗 12,000 个逻辑门资源。
- 该处理器支持绝大部分的16位Thumb-1 指令和某些32位Thumb-2 指令。
- 采用了90nm低功耗制造工艺。当使用Cortex-M0的最小配置时,功耗仅为16uw/MHz。
- 该处理器指令集包含 56 条指令,提供对C语言的友好设计框架 CMSIS。
- 该处理器采用ARMv6-M 架构。
- 该处理器支持一个不可屏蔽中断(NMI)和1~32个物理中断。
- 提供休眠模式。
Cortex-M0处理器结构
Cortex-M0微处理器内部结构,ARM Cortex-M0微处理器包括:处理器核、嵌套向量中断控制器 (Nested VectorInterrupt Controller,NVIC)、调试子系统、唤醒中断控制器 (WakeupInterrupt Controller,WIC)、AHB LITE 总线接口以及连接这些单元的内部总线系统。下面对这些单元进行详细说明:
处理器内核
处理器核是 Cortex-M0最核心的功能部件,它负责对数据进行处理。
- 该处理器包含内部寄存器、算术逻辑单元(ALU)、数据通路和控制逻辑
- 该处理器核内部用于取指、译码和执行指令的指令通道采用三级流水结构
嵌套向量中断控制器
专用的 NVIC用于对中断进行管理,并且向处理器核发出中断请求信号。
- 包含最多32个中断请求信号,以及1个不可屏蔽中断。
- 自动处理嵌套中断,包括: 比较中断请求之问的优先级、以及当前中断的优先级。
总线系统
总线系统用于将 Cortex-M0内部的各个功能部件连接在一起。总线系统包含:
- 内部总线系统
- 处理器核内部的数据通道
- AHB Lite 接口单元
Cortex-M0总线系统的所有总线均为 32位宽度。
AHB-Lite是ARM 公司指定的片上总线规范,广泛地应用在SOC 器件设计中。
调试子系统
作为 Cortex-M0处理器重要的一部分,调试子系统提供下面的功能:
- 管理调试控制、程序断点,以及数据监控点。
- 当产生调试事件时,它将处理器核设置为停止状态。此时,开发人员可以在该点分析处理器的状态,比如:寄存器值和标志。
唤醒中断控制器
WIC 用于低功耗应用。通过关闭大部分的元件,使微处理器进入休眠模式。当检测到发生中断事件时,WIC 通知电源管理单元给系统上电,使处理器从休眠状态进入到正常工作状态。
Cortex-M0处理器寄存器组
本节将详细介绍 Cortex-M0 处理器的寄存器组,对于处理器的内部寄存器来说,其特点主要包括:
- 它们用于保存和处理处理器核内暂时使用的数据。
- 这些寄存器在 Cortex-M0处理器核内,因此处理器访问这些寄存器速度较快。
- 采用加载-保存结构,即:如果需要处理保存在存储器中的数据,需要将保存在存储器中的数据加载到一个寄存器,然后在处理器内部进行处理。在处理完这些数据后,如果需要将其重新保存到存储器时,则将这些数据重新写回到存储器中。
对于 Cortex-M0寄存器来说,包含寄存器组和特殊寄存器。下面将对这些寄存器的功能进行详细介绍。
通用寄存器组
在寄存器组中,提供了16 个寄存器,其中 R0~R12 可作为通用寄存器,其中:
-
R0~R7 为低寄存器,这些寄存器可以被任何指令访问。
-
R8~R12为高寄存器,一些Thumb 指令不可以访问这些寄存器。
-
R13 寄存器可以用作堆栈指针 (Stack Pointer,SP)
-
SP 用于记录当前堆栈的地址。
-
当在不同的任务之间切换时,堆栈用于保存上下文(现场)。
-
在Cortex-M0中,将 SP 进一步细分为:
- 主堆栈指针(Main Stack Pointer,MSP)。在应用程序中,需要特权访问时会使用 MSP比如访问操作系统内核、异常句柄。·
- 进程堆栈指针(Process Stack Pointer,SP)。当没有运行一个异常句柄时,该指针可用于基本层次的应用程序代码中。-
-
-
R14 寄存器可用作链接寄存器(Link Register,LR),其功能主要包括:
- 该寄存器用于保存子程序或者一个程序调用的返回地址
- 当程序调用结束后,Cortex-M0 将链接存器 LR 中的值加载到程序计数器 PC
-
R15寄存器可用作程序计数器(Program Counter,PC),其功能主要包括:
- 用于记录当前指令代码的地址。.
- 除了执行分支指令外,在其它情况下,对于 32 位指令代码来说,在每个操作时,PC递增4,即: (PC)+4->(PC)
- 对于分支指令,比如: 函数调用,将 PC 指向所指定地址的同时,将当前 PC 的值保存到链接寄存器 (link Register,LR)R14中。
特殊寄存器
组合程序状态寄存器(xPSR)
组合程序状态寄存器 (x Program Status Register,xPSR),,用于提供执行程序的信息
以及 ALU 的标志位。它包含下面三个寄存器:
- 应用程序状态寄存器(Application Program Status Register,APSR)。
- 中断程序状态寄存器(Interrupt Program Status Register,IPSR)。
- 执行程序状态寄存器(Execution Program Status Register,EPSR)。
对于这三个寄存器来说,它们可以作为一个寄存器 xPSR 来访问。比如:当发生中断的时候,xPSR 会被自动压入堆栈,从中断返回时,会自动恢复数据。在入栈和出栈时,将 xPSR作为一个寄存器。
APSR
APSR 寄存器内保存着 ALU 操作后所产生的标志位,这些标志位包括:
-
符号标志 N
- 当ALU 运算结果为负数时,将该位设置为 1
- 当ALU 运算结果为正数时,将该位设置为 0
-
零标志Z
- 当ALU 运算结果等于0时,将该位设置为 1
- 当ALU 运算结果不等于0时,将该位设置为0
-
进位标志 C
- 当无符号数加法,如果产生了无符号溢出,将该位设置为 1;
- 对于无符号减法,该位为借位输出状态取反。
-
溢出标志V
- 对于有符号加法和减法,如果发生了有符号溢出,则将该位设置为 1;
- 否则,设置为 0。
在 Cortex-M0 中,几乎所有的数据处理指令都会更改 APSR,有些指令不会修改 V 和C标志。例如MULS指令只会修改N和Z标志。
IPSR
该寄存器保存当前正在执行中断服务程序 (Interrupt Service Routine,ISR)的编号。在Cortex-M0 中每个异常中断都回有一个特定的中断编号,用于表示中断类型。在调试时,它对于识别当前中断非常有用,并且在多个中断共享一个中断处理的情况下,可以识别出其中一个中断。
EPSR
该寄存器中,只包含了T比特位,该位用于表示是否处于 Thumb 状态。由于 Cortex-M0只支持 Thumb 状态,因此T位总是为1。
中断屏蔽特殊寄存器
中断屏蔽特殊寄存器(Interrupt Mask Special Register,IMSR)中包含一位 PRIMASK。当该位设置为 1时,除了不可屏蔽中断 NMI 和硬件故障异常外,将屏掉其它所有的中断。
特殊寄存器(CONTROL)
特殊寄存器(CONTROL) 中包含了一位,该位用于定义堆栈。
- 当该位设置为1时,使用进程堆栈指针 PSP:
- 当该位设置为0时,使用主堆栈指针 MSP。
Cortex-M0存储器空间映射
Cortex-M0处理器提供了4GB 的存储器寻址空间。根据不同的使用目的将该寻址空间分成不同的区域。
尽管默认规定了这些区域的使用方法,但是程序设计人员可以灵活的根据具体要求定义存储器映射空间,比如: 访问内部私有外设总线。
保留,用于其他目的
内部私有外设总线(外设是相较于内核而言的,只能被CPU内核访问),比如:NVIC、SCS
外部设备,主要用于外部外设,比如:SD卡
RAM,主要用于外部存储器,比如:DDR、FLASH、LCD
外设,主要用于片上外设,比如:AHB、APB外设
SRAM,主要用于数据存储器,比如:片上SRAM、SDRAM
代码,主要用于程序代码,比如:片上FLASH
Cortex-M0程序镜像原理及生成方法
Cortex-M0程序代码保存在片上代码存储空间,程序代码以镜像文件的形式存在
中断向量是异常向量的一部分
- 向量表,包含异常(向量) 起始地址,以及主堆栈点 (Main Stack Point,MSP)的值。
- C语言编写的启动代码。
- 程序代码,包含应用程序和数据。
- C库代码,用于C库函数的程序代码。
当上电后,对 Cortex-M0进行复位,复位启动步骤如下:
Cortex-M0的端及分配
端(Endian)是指保存在存储器中的字节顺序。根据字节在存储器中的保存顺序,将其划分为大端(Big Endian)和小端(Little Endian):
-
小端
对于一个 32 位字长的数据来说,最低字节保存该数据的第0位~第7位,也就是我们常说的“低址低字节,高址高字节”。
-
大端
对于一个 32 位字长的数据来说,最低字节保存该数据的第24位~第31位,也就是我们常的“低址高字节,高址低字节”
对于 Cortex-M0处理器来说,提供了对大端和小端的支持。然而,端概念只存在硬件这一层。
Cortex-M0处理器异常及处理
异常原理
异常(Exception)是事件,它将使程序流退出当前的程序线程,然后执行和该事件相关的代码片段(子程序),通过软件代码,可以使能或者禁止处理器核对异常事件的响应。事件可以是内部的也可以是外部的,如果事件来自外部,则称为中断请求(Interrupt Request,IRQ)。
- 异常句柄是指在异常模式中,所执行的一段代码,也称为异常服务程序。如果异常是由IRQ引起,则将其称为中断句柄 (interrupt Handler)/中断服务程序(Interrupt ServiceRoute,ISR)。
- 现场(上下文)切换 (Context Switching), 现场(上下文) 切换包括保存现场/上下文,以及恢复现场/上下文。
- 保存现场。在进入异常模式前,当前程序的现场/上下文,比如:当前寄存器的值,将被保存到堆栈中(入栈)。
- 恢复现场。当完成句柄后,将先前保存在堆栈中的内容从堆栈中取出 (出栈)。
异常优先级
在 Cortex-M0中,通常将异常 (中断)分成多个优先级。当 Cortex-M0的处理器核正在处理低优先级的异常事件时,可以触发高优先级的事件。高优先级事件可以打断正在处理低优先级事件的能力,称为中断嵌套。
在Cortex-M0中的NVIC,支持最多32个中断请求IRQ以及一个NMI的输入。
NMI 和IRQ类型的主要区别,NMI 是不能被屏蔽的,它具有最高优先级,因此它可以用于对安全性要求比较苛刻的系统,比如:工业控制或者汽车。
向量表
- 向量表中的第一个入口处为初始的 MSP。
- 其它入口用于异常句柄的地址。
- 向量表最多包含 496 个外部中断,可以根据实现的要求定义它们。在 Cortex-M0中向量表的大小为 2048 个字节。
- 在 Cortex-M0中,通过使用向量表偏置寄存器,用户可以重新分配向量表的位置但是,仍然要求在 0x0 有最小的向量表入口,它用于启动核。
- 在 Cortex-M0中,为每个异常分配了一个向量号,寄存器用于表示活动或者挂起的异常类型。
活动就是表示当前处理器核正在处理的异常事件,挂起就是等待需要处理的异常事件。
- 可以使用 C代码生成向量表。使用汇编语言定义的向量表。
__Vectors DCD __initial_sp ; Top of Stack,栈顶
DCD Reset_Handler ; Reset Handler,复位向量
DCD NMI_Handler ; NMI Handler,NMI句柄
DCD HardFault_Handler ; Hard Fault Handler,硬件故障句柄
DCD MemManage_Handler ; MPU Fault Handler,存储器管理句柄
DCD BusFault_Handler ; Bus Fault Handler,总线故障句柄
DCD UsageFault_Handler ; Usage Fault Handler,使用故障句柄
DCD 0 ; Reserved,保留×4
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler,SVCall句柄
DCD DebugMon_Handler ; Debug Monitor Handler,调试监控句柄
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler,PendSV句柄
DCD SysTick_Handler ; SysTick Handler,SysTick句柄
; External Interrupts,外部向量起始
异常类型
在 Cortex-M0中,提供了不同的异常类型,以满足不同应用的需求,包括:复位、不可屏蔽中断、硬件故障、请求管理调用、可挂起的系统调用、系统滴答和外部中断。
复位
ARMv6-M 框架支持两级复位,包括:
- 上电复位用于复位处理器,SCS 和调试逻辑;
- 本地复位用于复位处理器和 SCS,不包括与调试相关的资源。
- 对于复位来说,其优先级固定为 3,即最高优先级。
不可屏蔽中断NMI
对于不可屏蔽中断 NMI 来说,特点如下:
- 它的优先级仅次于复位,其优先级固定为 2,用户不可屏蔽 NMI:
- 它用于对安全性苛刻的系统中,比如工业控制或者汽车:
- 可以用于电源失败或者看门狗。
硬件故障(HardFault)
硬件故障常用于处理程序执行时产生的错误,这些错误可以是试图执行未知的操作码总线接口或存储器系统的错误,也可以是尝试切换到ARM 状态之类的非法操作。
请求管理调用(SVCall,SuperVisor Call)
在执行 SVC 指令时,就会产生 SVC 异常,通常用于运行操作系统的入式系统中,它为应用程序提供了访问系统服务的入口。
可挂起的系统调用(PendSV)
PendSV 是用于包含OS(操作系统)的应用程序的另一个异常,SVC 异常在 SVC 指令执行后会马上开始,PendSV在这点上有所不同,它可以延迟执行,在 OS 上使用 PendSV 可以确保高优先级任务完成后才执行系统调度。
系统滴答(SysTick)
NVIC 中的 SysTick 定时器为 OS 应用可以使用的另外一个特性。几乎所有操作系统的运行都需要上下文(现场)切换,而这一过程通常需要依靠定时器来完成。Cortex-M0内集成了一个简单的定时器,这样使得操作系统的移植更加容易。在实际应用中,SysTick 为选配。
外部中断
Cortex-M0 微控制器可以支持 1~32 个外部中断,中断信号可以连接到片上外设,也可以通过1/0 端口连接到外部中断源上。根据微控制器设计的不同,有些情况下,外部中断的数目可能与 Cortex-M0处理器的中断个数不同。
只有用户使能外部中断后,才能使用它。如果禁止了外部中断,或者处理器正在运行另·个相同或者更高优先级的异常处理,则中断请求会被保存在挂起状态寄存器中。当处理完高优先级的中断或返回后,才能执行挂起的中断请求。对于 NVIC 来说,可接受的中断请求信号可以是高逻辑电平,也可以是中断脉冲(最少为一个时钟周期)。
在MCU 外部接口中,外部中断信号可以是高电平也可以是低电平,或者可以通过编程配置;
程序可以修改外部中断的优先级
参考资料
《ARM Cortex-M0 全可编程SoC原理及实现》