Cortex-M3 内部寄存器
2016-05-04 22:18
495 查看
寄存器组
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=0 CPSIE I ; PRIMASK=1
FAULTMASK
这个寄存器也只有一位,置1后,屏蔽除NMI外的所有异常(包括硬fault),默认值为0;操作指令:
MRS R0, FAULTMASK ; R0=FAULTMASK MSR FAULTMASK, R0 ; FAULTMASK=R0 CPSID F ; FAULTMASK=0 CPSIE F ; FAULTMASK=1
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表示用户级的线程模式;
相关文章推荐
- LM3S 串口收发心得
- STM32启动过程解读与跟踪验证
- STM32学习顺序
- fans-rt 任务调度-堆栈切换篇(4)tiny模型详细分析
- 【Open】2015.08.03-连接脚本配置错误导致“不精确的数据访问违例”
- 【怎样在fans-rt上进行开发】1.windows 系统下 gcc 交叉编译环境搭建(cortex-m3)
- STM32中异常、中断、事件辨析
- STM32系统时钟配置
- STM32 GPIO配置
- STM32外部中断无法触发的问题
- Cstyle的札记,Freertos内核详解,第0篇
- Cortex-M3与ARM7的比较
- 记一次STM32中HardFault问题的调试解决(INVPC, LR 0xFFFFFFF5)
- Cortex-M KEIL特殊用法
- Cortex-M3启动代码分析
- ARM CORTEX-M3简介
- Cortex-M3 内部寄存器
- Cortex-M3 中断的具体行为
- Cortex-M3 操作模式和特权级别