Cortex-M3基础
寄存器组
-
通用目的寄存器组R0-R7
-
通用目的寄存器组R8-R12
-
堆栈指针R13
- CM3中共有两个堆栈指针
- 主堆栈指针(MSP)
- 这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
- 进程堆栈指针(PSP)
- 能引用到的是当前正在使用的那个
- 另一个必须用特殊指令来访问(MSR,MRS)
- PUSH指令和POP指针默认使用SP
- 在 PUSH 新数据时,堆栈指针先减一个单元。通常在进入一个子程序后,第一件事就是把寄存器的值先PUSH 入堆栈中,在子程序退出前再 POP 曾经 PUSH 的那些寄存器。另外, PUSH 和 POP 还能一次操作多个寄存器,
- R13最低两位被硬线连接到0,并且总是读出0
-
连接寄存器R14
- 连接寄存器(LR)
- 用于在调用子程序时存储返回地址
- LR的LSB可读可写
-
程序计数器R15
- PC
- 读PC时返回的值是当前指令的地址+4
- 如果向 PC 中写数据,就会引起一次程序的分支(但是不更新 LR 寄存器)。 CM3 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而, 在分支时,无论是直接写 PC 的值,还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行。倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。
-
特殊功能寄存器
操作模式
异常与中断
Cortex-M3支持大量异常,包括11个系统异常和最多240个外部中断——简称IRQ
由外设产生的中断信号,除了 SysTick 的之外,全都连接到 NVIC 的中断输入信号线。
Cortex-M3堆栈的实现
向下生长的满栈
SP指向最后一个被压入堆栈的32位数值
下一次压栈时,SP先自减4,在存入新的数值
POP操作恰好相反
参考文档:Cortex-M3权威指南
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)