Cortex-M3 包含了一些专用寄存器,主要有 3 种类型,5(或者说 7)个寄存器,这些寄存器只能通过MSR或MRS指令操作,无对应内存地址。
(1)程序状态寄存器:该寄存器又分为 3 个子状态寄存器,分别是应用程序状态寄存器(APSR)、中断号状态寄存器(IPSR)、执行状态寄存器(EPSR)。
(2)中断屏蔽寄存器,有PRIMASK、FAULTMASK、BASEPRI。
(3)控制寄存器(CONTROL)。
1.程序状态寄存器
程序状态寄存器(如表 1-5 所示)可以作为一个整体访问或通过APSR、IPSR、EPSR形式独立访问。程序状态寄存器作为一个整体访问时,寄存器的名字是“xPSR”。可以使用MRS指令读取程序状态寄存器的内容,使用MSR指令改变APSR的内容;EPSR和IPSR为只读寄存器。CMSIS中的core_cm3.c给出了__get_IPSR, __get_xPSR, __get_APSR 3 个函数实现读取APSR、IPSR与xPSR,其中__get_APSR的代码如下,该函数通过MRS指令读取APSR。
表 1-5 程序状态寄存器
当需要读取EPSR及设置APSR寄存器时,可通过以下两条指令实现:
2.中断屏蔽寄存器
中断屏蔽寄存器用于实现对中断的开放与关闭。中断屏蔽寄存器主要有PRIMASK、FAULTMASK、BASEPRI。
(1)PRIMASK:只有一位的寄存器。该寄存器被置 1 后,除了NMI和硬故障(hard fault)之外的所有异常将被关闭;写 0,不影响。在特权模式下,可通过MSR、MRS、CPS指令对该寄存器进行访问。
(2)FAULTMASK:只有一位的寄存器。该寄存器被置 1 后,除NMI外的所有异常将被关闭。在特权模式下,可通过MSR、MRS、CPS指令对该寄存器进行访问。
(3)BASEPRI:定义了屏蔽异常的最低优先级。当BASEPRI设置为某数值时,所有不大于数值的异常将被屏蔽;写 0,不影响。
对时序要求严格的应用程序,可以通过PRIMASK与BASEPRI寄存器临时屏蔽中断,以达到时序控制目的。FAULTNASK主要用于在操作系统中关闭任务崩溃的各种异常。
CMSIS提供了如下函数,用于读取或设置中断屏蔽寄存器:
3.控制寄存器
控制寄存器(CONTROL)主要用于定义特权级别,以及选择使用哪个堆栈指针。
如表 1-6 所示是控制寄存器的位含义。
表 1-6 控制寄存器的位含义
在处理模式下,始终使用主堆栈指针MSP。只有在异常进入和返回情况下,才会更新控制寄存器。
CONTROL[0]:仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径就是触发一个(软)中断(SVC指令),再由服务例程改写该位。
CMSIS中提供了对该寄存器进行访问及操作的函数: