Cortex-M3 内部寄存器

寄存器组

R0-R12

R0-R12,通用寄存器;
R0-R12都是32位通用寄存器,用于数据操作;但是绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb指令可以访问所有寄存器;

R13

R13,SP,堆栈指针;
Cortex-M3有两个堆栈指针,它们是Banked,任一时刻只能使用其中一个;当引用R13/SP时,引用的是当前正在使用的那一个,另一个必须使用MRS/MSR指令来访问;

  • 主堆栈指针MSP:复位后缺省堆栈指针,用于操作系统内核操作和异常处理例程;
  • 进程堆栈指针PSP:由用户的应用程序代码使用;
    堆栈指针的最低两位永远为0,这意味着堆栈总是4字节对齐的;

R14

R14,LR,链接寄存器;
当调用子程序时,由R14存储返回地址;如果子程序多于1级,则需要把前一级的R14压入堆栈;

R15

R15,PC,程序计数器寄存器
读PC值,返回的是当前指令地址+4;如果修改它,就能改变程序的执行流;
在分支时,无论直接写PC,还是使用分支指令,都必须保证加载到PC的数值是奇数(LSB=1),用以表明是在Thumb状态下执行,如果为0,将产生fault;

特殊功能寄存器

特殊功能寄存器必须通过MRS/MSR指令操作;

程序状态寄存器

程序状态寄存器(PSRs或xPSR)在内部可分为3个子状态寄存器:

  • 应用程序PSR(APSR)
  • 中断号PSR(IPSR)
  • 执行PSR(EPSR)
    通过MRS/MSR指令,这3个PSR可以单独访问,也可组合访问:
  • PSR = APSR + IPSR + EPSR
  • IAPSR = IPSR + APSR
  • IEPSR = IPSR + EPSR
  • EAPSR = EPSR + APSR
    |||31|30|29|28|27|26-25|24|23-20|19-16|15-10|9|8-0|
    |–|:-|:-|:-|:-|:-|:----|:-|:----|:----|:----|:-|:-|:----|:-----?
    |APSR|N|Z|C|V|Q|
    |IPSR||||||||||||Exception Number|
    |EPSR||||||ICI/IT|T|||ICI/IT|

中断屏蔽寄存器

PRIMASK

这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0;
操作指令:

MRS R0, PRIMASK        ; R0=PRIMASK
MSR PRIMASK, R0        ; PRIMASK=R0
CPSID I                ; PRIMASK=1
CPSIE I                ; PRIMASK=0

FAULTMASK

这个寄存器也只有一位,置1后,屏蔽除NMI外的所有异常(包括硬fault),默认值为0;
操作指令:

MRS R0, FAULTMASK       ; R0=FAULTMASK
MSR FAULTMASK, R0       ; FAULTMASK=R0
CPSID F                 ; FAULTMASK=1
CPSIE F                 ; FAULTMASK=0

BASEPRI

这个寄存器有9位,它定义了被屏蔽优先级的阈值;当它被设定为某个值后,所有优先级号大于等于此值得中断都被关闭,若设为0,则不关闭任何中断,默认值为0;

MRS R0, BASEPRI       ; R0=BASEPRI
MSR BASEPRI, R0       ; BASEPRI=R0

控制寄存器(CONTROL)

  • CONTROL[1]:为0表示选择MSP,为1表示选择PSP;
  • CONTROL[0]:为0表示特权级的线程模式,为1表示用户级的线程模式;

你可能感兴趣的:(ARM,Cortex-M3)