STM32系列——Cortex-M3寄存器简介

Cortex-M3系列处理器拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最“通用目的”的,但是绝大多数的16位指令只能使用R0-R7(低组寄存器),而32位的Thumb-2指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。

通用目的寄存器R0-R7
R0-R7也称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不可预料的。
通用目的寄存器R8-R12
R8-R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们。32位的指令则不受限制。它们也是32位字长的,且复位后的初始值是不可预料的。
堆栈指针R13
R13是堆栈指针。在CM3处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写作SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR指令)。这两个堆栈指针分别是:

  • 主堆栈指针(MSP),或写作SP_main。这是缺省的堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
  • 进程堆栈指针(PSP),或写作SP_process.用于常规的应用程序代码(不处于异常服用例程中)。要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用MSP就够了。堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。
    连接寄存器R14
    R14是连接寄存器(LR)。在一个汇编程序中,你可以把它写作bothLR和R14。LR用于在调用子程序时存储返回地址。例如,当你在使用BL(分支并连接,Branch and link)指令时,就自动填充LR值。
    尽管PC的LSB总是0(因为代码至少是字对齐的),LR的LSB却是可读可写的。这是历史遗留的产物。在以前,由位0来表示ARM/Thumb状态。因为其它有些ARM处理器支持ARM和Thumb状态并存,为了方便汇编程序移植,CM3需要允许LSB可读可写。
    程序计数器15
    R15是程序计数器,在汇编代码中你也可以使用名字“PC”来访问它。因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。比如说
0x1000: MOV R0, PC  ;  R0 = 0x1004

如果向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器)。CM3中的指令至少是半字对齐的,所以PC的LSB总是返回0。然而,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC 的值是奇数(即LSB =1),用以表面这是在Thumb状态下执行。倘若写了0,则视为企图转入ARM模式,CM3将产生一个fault异常。

你可能感兴趣的:(STM32)