[STM32F1] STM32F103内存划分

[复制链接]
319|0
renzheshengui 发表于 2025-8-17 14:52 | 显示全部楼层 |阅读模式
下面这份是 STM32F103(Cortex-M3)常用、够用、对开发最有帮助的“内存功能区划分”速查版。数值以通用 F103 为准,个别容量因具体料号不同而异(如 C8=64 KB Flash/20 KB SRAM,RE/VE=512 KB/64 KB 等)。

1) 顶层地址空间分区(ARM Cortex-M3 标准映射)
0x0000_0000 ~ 0x1FFF_FFFF  代码区(映射到 Flash/System Memory/SRAM 的别名视启动方式而定)
0x2000_0000 ~ 0x3FFF_FFFF  SRAM(含位带区)
0x4000_0000 ~ 0x5FFF_FFFF  片上外设(APB1/APB2/AHB,含位带区)
0x6000_0000 ~ 0x9FFF_FFFF  外部存储器/FSMC(NOR/NAND/SRAM/LCD 等)
0xA000_0000 ~ 0xDFFF_FFFF  保留
0xE000_0000 ~ 0xFFFF_FFFF  Cortex-M3 私有外设总线(NVIC/SysTick/调试等)


2) 片上存储器(最常用)
主 Flash:0x0800_0000 起(大小随型号 64 KB / 128 KB / 256 KB / 512 KB / 1 MB)

扇区(页)大小:中密度通常 1 KB,高密度通常 2 KB(擦写以“页”为单位)
常放:中断向量表、.text、.rodata、初始化数据镜像等
SRAM:0x2000_0000 起(常见 20 KB 或 64 KB)

常放:.data(运行时)、.bss、堆(heap)、栈(stack)、DMA 缓冲
系统存储器(BootROM):约 0x1FFF_F000 起(只读,ST 出厂引导加载程序)

用于串口/USB/CAN/I2C 等 ISP 启动下载(具体支持依不同子系列而异)
系统信息区(只读)(常用寄存只读表):

UID(96 位唯一芯片 ID):常见 0x1FFFF7E8
Flash 大小寄存器:常见 0x1FFFF7E0
Option Bytes(选项字节):常见 0x1FFFF800 一带(读写需经 Flash 接口解锁/编程流程)
3) 位带(Bit-Band)
SRAM 位带区:0x2000_0000 ~ 0x200F_FFFF
对应的位带别名:0x2200_0000 ~ 0x23FF_FFFF
外设 位带区:0x4000_0000 ~ 0x400F_FFFF
对应的位带别名:0x4200_0000 ~ 0x43FF_FFFF
访问公式(把“某一位”映射为“可字节寻址的 32 位地址”):
alias = base_alias + (byte_offset * 32 + bit_number * 4)
高效按位读写,不用读-改-写。
4) 外设地址空间(概览)
APB1(低速外设,基址约 0x4000_0000):TIM2–TIM7、USART2/3、I2C1/2、SPI2/3、CAN、PWR/BKP…

APB2(高速外设,基址约 0x4001_0000):GPIOA–E、AFIO、USART1、SPI1、TIM1/8、ADC1/2…

例:GPIOA 常见 0x40010800,RCC 常见 0x40021000,USART1 常见 0x40013800
AHB:DMA、RCC、CRC、FSMC(高密度/带外设型号)等

PPB(私有外设总线):0xE000_0000 区域,含 NVIC、SysTick、SCB->VTOR(向量表重定位)等

调试模块 DBGMCU 常见:0xE0042000
5) 启动与“0 地址映射”
启动选择由 BOOT0(引脚)与 BOOT1(PB2)决定,将下列之一映射到 0x0000_0000:

主 Flash(常规应用上电启动)
系统存储器(进 ST Bootloader)
SRAM(用于从 SRAM 启动/调试)
运行中可通过 SCB->VTOR 重定位中断向量表 到 Flash 或 SRAM,需 128-字节对齐。

6) 典型“功能分区/链接脚本”布局(以 F103C8 64 KB/20 KB 为例)
Flash(0x0800_0000, 64 KB)

[0x0800_0000 ~ …] .isr_vector(中断向量表)
之后是 .text(代码)、.rodata(常量)、.init_array 等
末尾常放 .data 的加载镜像(启动时拷到 SRAM)
SRAM(0x2000_0000, 20 KB)

低地址开始:.data(已初始化的全局/静态变量,开机从 Flash 拷入)
紧接:.bss(未初始化的全局/静态变量,开机清零)
再往上:heap(malloc/new)
顶部向下:stack(MSP/PSP)
DMA 缓冲建议放在 SRAM,注意 4/8 字节对齐,避免与栈/堆冲突
GCC 链接脚本片段(示意)

MEMORY
{
  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 64K
  SRAM  (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}


7) 常见开发要点
擦写 Flash:按“页”擦,写前需解锁 Flash 接口,写半字/字(依型号);自编程避免在执行所在页写擦(可搬运 IAP 函数到 SRAM 执行)。
向量表搬移:Bootloader + App 常见做法:Bootloader 设置 SCB->VTOR = APP_BASE,然后跳转。
位带:GPIO/标志位极简按位访问,写裸寄存器时尤其好用。
FSMC 外扩:若用外部 SRAM/NOR/NAND/LCD,地址位于 0x6xxx_xxxx 段,注意时序与片选。
顶层差异(一句话版)
桌面/服务器: 有 虚拟内存、分页/MMU、动态链接库/mmap,一个进程看到的是自己的地址空间。
STM32F103: 无虚拟内存,全是 物理映射;固件 静态链接成一个镜像,运行时段布局由 链接脚本固定在 Flash/SRAM 上。
一、段(Section/Segment)一一对应速查表




关键词:桌面 = 装载器(loader)+ 内核 帮你布置段;STM32 = 链接脚本+启动文件 决定一切。

二、启动流程对照(谁来把 .data 搬进 RAM?谁来清 .bss?)
桌面进程

内核创建进程的虚拟地址空间并装载可执行文件/动态库。
装载器把 .data 初始化、把 .bss 清零,设定初始栈/环境。
跳到 C 运行时入口(_start)→ 构造器 → main()。
STM32F103

上电/复位后取**向量表[0]**为初始 MSP(栈顶),跳入 Reset_Handler。
拷贝 .data:把 Flash 中的初始化镜像复制到 SRAM 的 .data。
清零 .bss:把 .bss 全部置 0。
C++ 构造:调用 .init_array 的全局/静态对象构造函数。
跳转 main()(RTOS 则再启动调度器)。
三、地址与增长方向(STM32F103 具体些)
Flash:0x0800_0000 起(64K/128K/256K/512K 视料号)→ 放 .isr_vector/.text/.rodata 与 .data 的镜像。

SRAM:0x2000_0000 起(常见 20 KB 或 64 KB):

低地址:.data → .bss → heap(向上长)
高地址:stack(从 SRAM_END 向下长,MSP/PSP)
四、运行期内存管理的“同与不同”
相同点

都有 .text/.rodata/.data/.bss/heap/stack 等抽象。
C++ 全局/静态对象都需要构造/析构;都有异常栈展开、vtable 等语义(嵌入式往往禁用异常/RTTI 以省资源)。
不同点(关键)

桌面:段→虚拟页→按需分页、换页、mmap、动态库;内核维持隔离/保护。
STM32:无 MMU,地址即物理;无动态库/共享区;堆/栈大小编译时/设计时就要算好;越界=硬 fault。
DMA/中断:嵌入式要考虑 缓存一致性(若有)/对齐/volatile;ISR 里一般禁用动态分配。
五、工程实践建议(把桌面思路改成嵌入式思路)
尽量静态分配:优先 .data/.bss 或内存池;若用堆,选 RTOS 提供的 heap_4/5,开溢出检测。
常量进 Flash:大表、字符串留在 .rodata;需要可改的才放 .data。
中断/Boot:必要时用 SCB->VTOR 重定位向量表(Bootloader + App 常见)。
RAM 执行函数:擦写 Flash、时序关键函数可放 .ramfunc。
多任务栈:估算每任务 PSP,开启栈溢出钩子;MSP 留给中断。
无 mmap/共享库:若需“资源文件”,在 Flash 指定段打包,运行时自己解析。
六、把两套话翻译成一句话
桌面模型依赖操作系统和 MMU:装载器把段映射到进程的虚拟空间,支持动态库和 mmap;
STM32 模型依赖链接脚本和启动代码:把相同的段静态地放进 Flash/SRAM 的固定地址,开机自己完成 .data 复制和 .bss 清零;没有虚拟内存/动态库/映射区,栈和堆就在那点 SRAM 里“对顶生长”。
————————————————
版权声明:本文为CSDN博主「m0_55576290」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_55576290/article/details/150379557

您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

4331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部