STM32 的“内存划分”

STM32 的"内存划分"要分两层看:

  1. 芯片厂商规定的 地址映射表(4 GB 空间划成 8 大段,每段 512 MB);
  2. 用户程序里的 运行时分区 (代码段、数据段、堆、栈、FreeRTOS 任务栈等)。
    把两张图叠在一起,就能快速定位"我的变量/代码/外设到底落在哪条总线、哪块物理区域"。

一、4 GB 地址映射(ARM Cortex-M 统一规范)

地址范围 官方名字 实际内容(以 F1/F4 为例)
0x0000 0000 -- 0x1FFF FFFF Code 别名区:BOOT 后重映射到 Flash/SRAM/SystemMemory
0x0800 0000 -- 0x080F FFFF 内部 Flash 真正放用户代码、常量、中断向量表
0x1000 0000 -- 0x1FFF FFFF 片上额外 RAM CCM(F4)、ITCM/DTCM(H7)、系统 BootROM、OTP
0x2000 0000 -- 0x3FFF FFFF SRAM 主 SRAM1/2/3、备份 SRAM(电池保持)
0x4000 0000 -- 0x5FFF FFFF 外设寄存器 APB1、APB2、AHB1、AHB2......所有外设寄存器
0x6000 0000 -- 0x9FFF FFFF FSMC/FMC 外部 NOR/NAND/PSRAM/SDRAM
0xA000 0000 -- 0xDFFF FFFF 保留 某些型号接 Quad-SPI、LCD 控制器
0xE000 0000 -- 0xFFFF FFFF 系统级 Cortex-M 内核外设 NVIC、SysTick、MPU、调试器

注:BOOT0/BOOT1 引脚决定 0x0000 0000 这条 512 MB 段到底"影子"到谁身上------Flash、系统 BootROM 还是 SRAM。


二、用户程序运行时"五段"落在上面哪一区

段名 存放内容 存储介质 地址举例
.text 代码、常量、向量表 内部 Flash 0x0800 0000 起
.rodata 只读字符串、const 内部 Flash 紧接代码后
.data 已初始化全局变量 启动时从 Flash 拷贝到 SRAM SRAM 低地址
.bss 未初始化全局/静态 直接清零在 SRAM 接在 .data 后
heap malloc/new 动态区 SRAM _end ~ 栈底
stack 局部变量、中断现场 SRAM 栈顶向下长
FreeRTOS 任务栈 TCB+任务私有栈 在 heap_4 方案下属于 heap 区,即也在 SRAM

栈向低地址"倒长",堆向高地址"长",二者中间剩余空间就是动态内存最大可用值。


三、快速记忆口诀

"4 G 八段 512,

Code 别名可重影;

Flash 代码常量坐,

SRAM 数据堆栈行;

外设寄存 4 开头,

6 9 外存接大屏;

E 段系统不可动,

调试内核藏性命。"


四、开发时最常问的 3 个"在哪"

  1. 全局变量/静态变量

    → 编译后落在 .data/.bss,运行期在 SRAM(0x2000 0000 起)。

  2. malloc / free

    → 堆区,仍在 SRAM,大小由启动文件里的 _heap_size 决定。

  3. 外设寄存器

    → 0x4000 0000 开始,APB1 低速、APB2 高速、AHB 更高速,手册里查偏移即可。

把这张"两层图"印在脑子里,STM32 任何一段代码、变量、寄存器都能秒说出它走在哪条总线、位于哪块物理区域。

相关推荐
清风6666668 小时前
基于单片机的汽车安全气囊充气控制系统设计(protues仿真设计)
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
Darken038 小时前
中断程序设计需要注意什么?
单片机·中断函数
小李做物联网8 小时前
【单片机毕业设计】65.1基于单片机物联网智能书桌-超声+升降系统项目程序开发
stm32·单片机·嵌入式硬件·物联网
清风66666610 小时前
基于单片机的智能家居多参数环境监测与联动报警系统设计
数据库·单片机·毕业设计·智能家居·课程设计·期末大作业
自小吃多11 小时前
TMC2209与UART通信控制之搞不定
stm32·嵌入式硬件
普中科技12 小时前
【普中51单片机开发攻略--基于普中-2&普中-3&普中-4】-- 第 8 章 51 单片机工程模板创建
单片机·嵌入式硬件·51单片机·keil·普中科技·工程模版
强化学习与机器人控制仿真14 小时前
ProtoMotions 3 入门教程(一)开源 GPU 加速人形机器人强化学习仿真训练框架
人工智能·stm32·深度学习·机器人·强化学习·人形机器人·模仿学习
请叫我7plus14 小时前
用QEMU进行嵌入式Linux开发
linux·驱动开发·嵌入式硬件
d111111111d14 小时前
锁相环是什么,为什么可以用来放大时钟频率,怎么做到的,还有预分频起,为什么可以进行分频和倍频?
笔记·stm32·单片机·嵌入式硬件·学习
1379号监听员_17 小时前
hc05蓝牙模块
stm32·单片机·物联网