1.寄存器

 

1.1通用寄存器

 

1.1.1 概述

Cortex-M3和M4处理器在处理器的内核中有多个执行数据处理和控制的寄存器,这些寄存器大多以寄存器组的形式进行了分组;对于ARM架构,若处理的是存储器的数据,那么需要将存储器的数据加载到寄存器当中,处理完毕后,若有必要,还要写回存储器,这种方式一般称为“加载--存储架构”。Cortex-M3和M4处理器的寄存器组中有16个寄存器,其中13个为32位通用寄存器,其余3个有特殊用途,如图所示

                                                                               

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构

1.1.2 寄存器r0~r12:

通用目的寄存器,前八个(r0~r7)也被称为低寄存器(供16位指令访问),高寄存器(r8~r12)为高寄存器,可用于32位指令访问,r0~r12的初始值未定义

 

 1.1.3 r13(栈指针):

 分为两个指针,主栈指针(MSP)为默认的栈指针,在复位后或处理器处于处理模式时被使用。另一个为进程栈指针(PSP),只能用于线程模式。栈指针的选择由CONTROL特殊寄存器决定

在应用需要嵌入式OS的时候,才会用到PSP,此时内核与应用任务的栈是相互独立的,MSP的初始值需要在复位流程中从存储器的第一个字中取出,PSP的初始值未定义。

 

 1.1.4 r14(链接寄存器LR)

用于函数或子程序调用时返回地址的保存,在函数或者子程序结束时,可以通过将LR的数值加载进程序计数器(PC)中返回程序并继续执行。

Cortex-M处理器的返回地址总是偶数(指令会对齐半字地址上,因此,第0位为0),LR的第0位可读可写,有些跳转、调用操作需要将LR的第0位置1表示Thumb状态。

 

1.1.5 r15(程序计数器PC)

可读可写,读操作返回当前指令地址加4(流水线特性),写PC会引起跳转操作。

 

1.2 特殊寄存器

 

1.2.1 概述

除了寄存器组中的寄存器外,还有多个特殊寄存器,这些寄存器表示处理器状态,操作状态,中断异常屏蔽。如图:

                                                  

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_02

 

特殊寄存器未经过存储器映射,可以使用MSR和MRS等特殊寄存器访问指令来进行访问,例如MRS<reg> ,<special_reg>等,不要把特殊寄存器和其它微控制器架构中的特殊功能寄存器(SFR)搞混了,

它们一般指的是用于IO控制的寄存器。

 

1.2.2 程序状态寄存器

 包含三个:应用PSR(APSR),执行PSR(EPSR),中断PSR(IPSR);这三个寄存器可以通过一个组合寄存器(xPSR)访问,ARMv7-M架构中各个PSR的定义如下图:

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_03

 

 

cotex m0和m3硬件架构 cortexm3架构_栈指针_04

 

1.2.3 PRIMASK,FAULTMASK和BASEPRI寄存器

 以上寄存器均用为异常/中断的屏蔽,每个异常/中断都有一个优先等级,数值越小优先级越高。这些特殊寄存器基于优先等级屏蔽异常,只有在特权等级才可以对它们进行操作。默认全部为0(不起作用)

这些编程寄存器的编程模型如下图:

cotex m0和m3硬件架构 cortexm3架构_优先级_05

 

 PRIMASK寄存器为1位宽的中断屏蔽寄存器,置位时,会组织不可屏蔽中断(NMI)和HardFault异常之外的所有异常/中断。实际上,它是将当前异常优先级提升为0。

FaultMask和PRIMASK非常相似,不过它能屏蔽HardFault异常,实际上是将优先级提升到了-1。

BASEPRI寄存器会根据优先等级屏蔽异常和中断。BASEPRI的宽度取决于设计实际实现的优先级数量,通常为3或4bit,当设置为非0值,它会屏蔽具有相同或更低优先级的异常/中断。

 

1.2.4 CONTROL寄存器

 CONTROL寄存器定义了:栈指针的选择(MSP/PSP),线程模式的访问等级(特权/非特权)。具体位域定义如下:

cotex m0和m3硬件架构 cortexm3架构_栈指针_06

 

 

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_07

 

 运行在非特权等级的程序无法再切换回特权访问等级,若有必要将处理器在线程模式切换回特权访问等级,则需要使用异常机制,在异常处理期间,处理程序可以清楚nPRIV位。

cotex m0和m3硬件架构 cortexm3架构_栈指针_08

 

在未使用嵌入式OS的多数简单应用,无需修改CONTROL寄存器的数值。整个应用可以运行在特权访问等级并且只使用MSP。

 

 

2.存储器系统

Cortex-M处理器的总线接口为通用总线接口。微控制器存储器系统中的存储器一般为两种或更多:程序代码用的Flash存储器,数据用的静态RAM(SRAM),有时还会有电可擦除只读存储器(EEPROM)。软件开发人员只需要了解程序存储器和SRAM的地址及大小即可。

  • 存储器映射:Coretex-M处理器的4GB地址空间被分为了多个存储器区域,主要用于:程序代码访问(CODE区),数据访问(SRAM区),外设区域,处理器的内部控制和调试部件,存储器映射如下:

 

cotex m0和m3硬件架构 cortexm3架构_寄存器_09

 

  •  栈存储

 栈可用于:

1.当正在执行的函数需要寄存器进行数据处理时,临时存储数据的初始值。这些数据在函数结束时可以被恢复出来,以免调用函数的程序丢失数据

2.往函数或子程序中的信息传递

3.用于存储局部变量

4.在中断等异常产生时保存处理器状态和寄存器数值

cotex m0和m3硬件架构 cortexm3架构_寄存器_10

 

 

cotex m0和m3硬件架构 cortexm3架构_栈指针_11

 

 

cotex m0和m3硬件架构 cortexm3架构_优先级_12

 

 

 

 三.异常和中断

cotex m0和m3硬件架构 cortexm3架构_寄存器_13

 

 处理器自身也是一个异常事件源,其中包括系统错误状态的错误事件以及软件产生,支持嵌入式OS操作的异常,这些异常类型如下:

cotex m0和m3硬件架构 cortexm3架构_栈指针_14

 

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_15

 

 编号1~15归为系统异常,16号及其以上则用于中断,Cortex-M3及M4的中断等待非常小,只有12个周期。

 

  •  嵌套向量中断表(NVIC)

NVIC是Cortex-M处理器的一部分,是可编程的,且寄存器位于存储器映射的系统控制空间(SCS)。NVIC处理异常和中断配置,优先级以及中断屏蔽。

 

  • 向量表

当异常事件产生且被处理器内核接收后,相应的异常处理就会执行。要确定异常处理的起始地址,处理器引入了一种向量表机制。向量表为系统存储器内的子数据数组,每个元素都代表一个异常类型的起始地址,向量表是可以重定位的,重定位由NVIC中的VTOR可编程寄存器控制。复位后,VTOR默认为0,向量表则位于0x0处,如下所示:

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_16

 

 

每个异常向量的最低位表示异常是否在Thumb状态下执行,由于Cortex-M处理器只支持Thumb指令,因此,所有异常向量的最低位为1。

 

四.复位和复位流程

对于典型的Cortex-M微处理器,复位类型有三种:

1.上电复位:复位微控制器的所有部分其中包括处理器,调试部件和外设等

2.系统复位:只复位处理器和外设,不复位处理器的调试部件

3.处理器复位:指复位处理器

 

在复位后以及处理器开始执行程序前,Cortex-M处理器会从存储器中读出头两个字,如下图

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_17

 

 MSP的设置是非常有必要的,因为在复位的很短时间内又产生NMI或HardFault的可能,在异常处理前将处理器状态压栈时需要栈存储和MSP。

 

示例如下:

cotex m0和m3硬件架构 cortexm3架构_cotex m0和m3硬件架构_18

 

 对于Cortex-M处理器,向量表中向量地址的最低位应该为1,以表示他们为Thumb代码。因此,上图复位向量为0x101,而启动代码从0x100开始,在取出复位向量后,Cortex-M处理器就可以从复位向量地址处执行程序,并开始正常操作。

 

种一颗树最好的时间是在十年前,其次是现在!