MCU存储器映射:Flash/SRAM/外设地址空间¶
难度:🟢 初级 | 领域:嵌入式存储体系 | 关键词:Memory Map, Flash, SRAM, MMIO | 阅读时间:约 15 分钟
日常类比¶
四层大厦:1 楼书房(Flash,代码常驻)、2 楼工作台(SRAM,可读写)、3 楼控制面板(外设寄存器)、4 楼物业(系统/私有外设)。门牌号就是地址;Cortex-M 的 32 位地址空间约 4 GB,但芯片真实存储器远小于此,大量为保留区[1][2]。
摘要¶
解释 ARM Cortex-M 典型地址分区、Flash/SRAM/MMIO 用途、链接脚本与启动相关性。具体基址以芯片参考手册 Memory Map 章节为准(厂商并不完全相同)[2][3]。
1. 典型分区(Cortex-M 惯例)¶
| 区域倾向 | 地址量级(常见) | 用途 |
|---|---|---|
| Code | 0x0000_0000 起 | Flash / 别名执行区 |
| SRAM | 0x2000_0000 起 | 数据、堆栈、堆 |
| Peripheral | 0x4000_0000 起 | 外设 MMIO |
| Vendor / System | 高地址 | 私有外设总线、调试等 |
注意:有的系列 Flash 在 0x0800_0000 并通过别名映射到 0x0000_0000 启动[2]。
| 存储器 | 特点 |
|---|---|
| Flash | 非易失;按页/扇区擦写;执行原地或经加速器 |
| SRAM | 易失;快;可分 DTCM/多 bank |
| 外设 | 读写作副作用;需 volatile |
2. 和软件的关系¶
| 产物 | 作用 |
|---|---|
| 链接脚本 | 把 .text/.data/.bss 放到正确区域 |
| 启动文件 | 拷贝 .data、清 .bss、设栈顶 |
| 寄存器头文件 | 外设基址 + 偏移结构体 |
误把代码链到无存储器的地址会硬 fault;写 Flash 需用编程接口而非普通指针乱写[3]。
部分 Cortex-M3/M4 有 bit-band 别名区,便于原子改位;M0/M7 等支持情况不同,查手册[1]。
3. 局限、挑战与可改进方向¶
1. 手册与板级不一致¶
局限:拷贝他芯片地址导致外设全错。 改进:只使用本型号 CMSIS/pack;启动后读 ID 校验。
2. 栈/堆碰撞¶
局限:SRAM 小,深调用 + 大缓冲覆盖。 改进:链接脚本设栈极限;运行时水位染色;避免大局部数组。
3. 缓存/加速器一致性¶
局限:改 Flash 或 DMA 后 CPU 见旧数据。 改进:按手册清理缓存;MPU 属性配置正确。
4. 安全分区缺失¶
局限:应用可改任意外设。 改进:MPU/TrustZone 划分;见安全启动相关文。
4. 实践要点¶
- 读手册 Memory map + 打开
.map文件核对。 - 外设访问一律
volatile。 - 架构总览见
arm-cortex-m-architecture-overview。
参考文献¶
[1] ARM, Cortex-M generic user guides / ARMv7-M ARM. [2] ST/NXP/Nordic 等 MCU Reference Manual — Memory map. [3] Linker script and startup code tutorials (MCU vendor). [4] CMSIS Core documentation. [5] MPU configuration application notes. [6] Flash programming model manuals. [7] SRAM retention in low-power modes notes. [8] Bit-banding usage and limitations articles. [9] Memory barriers and volatile in embedded C. [10] DMA and cache coherency guides. [11] Executable in place (XIP) from external Flash notes.