CortexM3与M4寄存器学习笔记

寄存器学习

CortexM3和M4处理器的寄存器组中有16个寄存器,其中13个为32位通用目的寄存器,其它3个有特殊用途,如下图所示。
述

1、R0~R12

寄存器R0-R12为通用目的寄存器,前8个(R0-R7)也被称作低寄存器。由于指令中可用的空间有限,许多16位指令只能访问低寄存器。高寄存器(R8-R12)则可以用于32位指令和几个16位指令,如MOV。R0-R12的初始值是未定义的。

2、R13,栈指针(SP)

物理上存在两个栈指针:主栈指针(MSP,SP_main)为默认的栈指针。另一个为进程栈指针(PSP,SP_process),其只能用在线程模式。

3、R14,链接寄存器(LR)

LR用于函数或子程序调用时返回地址的保存。在函数或子程序结束时,程序控制可以通过将LR的数值加载程序计数器(PC)中返回调用程序处并继续执行。当执行了函数或子程序调用后,LR的数值会自动更新。若某函数需要调用另外一个函数或子程序,则它需要首先将LR的数值保存在栈中,否则,当执行了函数调用后,LR的当前值会丢失。

4、R15,程序计数器(PC)

PC是可读可写的,读操作返回当前指令地址加4(由于设计的流水线特性),写PC会引起跳转操作。
由于指令必须要对齐到半字或字地址,PC的最低位为0。不过,在使用一些跳转/读存储器指令更新PC时,需要将新PC值的LSB置1以表示Thumb状态,否则就会由于试图使用不支持的ARM指令而触发错误异常。对于高级编程语音(包括C和C++),编译器会自动将跳转目标的LSB置位。

5、特殊寄存器

处理器存在多个特殊寄存器,如下图所示。这些寄存器表示处理器状态、定义了操作状态和中断/异常屏蔽。
在这里插入图片描述
特殊寄存器未经过存储器映射,可以使用MSR和MRS等特殊寄存器访问指令来进行访问。

MRS < reg >,< special_reg > ; 将特殊寄存器读入寄存器
MSR < special_reg >,< reg > ; 写入特殊寄存器

5.1、程序状态寄存器

程序状态寄存器包括三个状态寄存器:

  • 应用PSR(APSR)
  • 执行PSR(EPSR)
  • 中断PSR(IPSR)

这三个寄存器可以通过一个组合寄存器访问,该寄存器在有些文献中也被称作xPSR。对于ARM汇编器,在访问xPSR时使用的是PSR。例如:

MRS r0,PSR
MSR PSR,r0

还可以单独访问每个PSR。每个PSR的定义如下图所示。
在这里插入图片描述在这里插入图片描述

5.2、PRIMASK、FAULTMASK和BASEPRI寄存器

在这里插入图片描述

5.2.1、PRIMASK

PRIMASK寄存器为1位宽的中断屏蔽寄存器。在置位时,它会阻止不可屏蔽中断(NMI)和HardFault异常之外的所有异常。

5.2.2、FAULTMASK

FAULTMASK和PRIMASK非常类似,不过它还能屏蔽HardFault异常。

5.2.3、BASEPRI

为使中断屏蔽更加灵活,该寄存器会根据优先级屏蔽异常或中断。BASEPRI为0时不会起作用,当被设置为非0数值时,它就会屏蔽具有相同或更低优先级的异常(包括中断),而高优先级的还可以被处理器接受。

CMSIS-Core提供了多个C函数用于访问上述3个寄存器。

x = _get_BASEPRI(); // 读BASEPRI寄存器
x = _get_PRIMASK(); // 读PRIMASK寄存器
x = _get_FAULTMASK(); // 读FAULTMASK寄存器
_set_BASEPRI(x); // 设置BASEPRI的值
_set_PRIMASK(x); // 设置PRIMASK的值
_set_FAULTMASK(x); // 设置FAULTMASK的值
_disable_irq(); // 设置PRIMASK,禁止IRQ
_enable_irq(); // 清除PRIMASK,使能IRQ

还可以用汇编代码访问这些寄存器。

MRS r0,BASEPRI
MRS r0,PRIMASK
MRS r0,FAULTMASK
MSR BASEPRI,r0
MSR PRIMASK,r0
MSR FAULTMASK,r0

另外,利用修改处理器状态(CPS)指令,可以很方便的设置或清除PRIMASK和FAULTMASK的数值。

CPSIE i ; 使能中断(清除PRIMASK)
CPSID i ; 禁止中断(设置PRIMASK)
CPSIE f ; 使能中断(清除FAULTMASK)
CPSID f ; 禁止中断(设置FAULTMASK)

5.3、CONTROL寄存器

在这里插入图片描述
在这里插入图片描述

未完待续…

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值