剩余寄存器
仅收口不在主线重点展开的 Cortex-M4 内核寄存器。外设寄存器按 GPIO、DMA 等模块学习。
| 类别 | 寄存器 | 用途 | 学习优先级 |
|---|---|---|---|
| 浮点数据 | S0~S31 | 单精度浮点操作数与结果;每两个 S 寄存器可组成一个双精度 D0~D15 | 知道即可 |
| 浮点状态 | FPSCR | 舍入模式、异常标志、浮点比较结果 | 知道即可 |
| FPU 控制 | CPACR | 开启协处理器 CP10/CP11,即开启 FPU 访问 | 会配置 |
| FPU 上下文 | FPCCR、FPCAR、FPDSCR | 自动/惰性压栈控制、浮点栈帧地址、默认浮点状态 | RTOS/FPU 时再查 |
| 程序状态 | APSR、EPSR、IPSR | 分别记录运算标志、Thumb/IT 执行状态、当前异常号 | 见特殊寄存器 |
| 双栈指针 | MSP、PSP | 主栈与进程栈;通过 SP 访问当前选中的一根 | 见 CPU 通用寄存器组 |
FPU
- 仅 Cortex-M4F 或具体芯片带 FPU 时才有上述浮点寄存器;纯 Cortex-M4 没有 FPU。
- 裸机通常由编译器使用
S0~S31,无需手写访问。 - FreeRTOS 任务使用浮点运算时,需确认端口层已处理 FPU 上下文保存;否则任务切换后浮点结果会损坏。
/* STM32F4 等带 FPU 的芯片:允许访问 CP10、CP11 */
SCB->CPACR |= (0xFU << 20U);
__DSB();
__ISB();“影子寄存器”
- ARM-A/R 架构存在按处理器模式切换的 banked registers(常被称为影子/分组寄存器)。
- Cortex-M4 没有这类分组的通用寄存器;异常现场通过硬件压栈保存,而非切换一组
R0~R12。 MSP/PSP是两根独立的栈指针,容易被误认为影子寄存器,但用途不同。