前言
在 Cortex‑M 内核 STM32 汇编开发中,很多初学者会遇到同一个困惑:同样是自定义数据标签,加载到寄存器后地址却分属完全不同的区间。有人疑惑为什么会出现0x08xxxxxx、0x2000xxxx、0x4000xxxx三类地址;也会问到是否存在 “只写内存区域”。
本文从硬件内存分区、汇编段属性、读写权限、使用场景四个维度,完整梳理 STM32 全部地址区域,区分存储内存与外设寄存器,解答只读、可读可写、只写地址的核心差异。
一、核心基础概念
- 程序存储内存:分为 Flash、SRAM 两类,用于存放代码、常量、运行变量,由汇编
AREA伪指令分配地址;存储内存仅存在只读、可读可写两种属性,不存在纯粹只写的通用内存。 - 外设寄存器地址区:不属于存储内存,是硬件外设控制接口,这片区域内包含真正意义上的 “只写地址”。
- 地址区间是区分内存区域最直观的标识,链接器根据段属性自动分配对应地址,无需手动指定。
二、三大地址区域完整详解
1. Flash 只读存储区(RO 区)
基础参数
- 标准地址范围:
0x08000000 ~ 0x080FFFFF - 汇编段标识:
READONLY- 代码段:
AREA |.text|,CODE,READONLY - 常量 / 中断向量段:
AREA xxx,DATA,READONLY
- 代码段:
读写与存储特性
- 运行时仅支持读取,程序正常运行过程中无法修改;仅固件下载时可烧录更新。
- 断电后数据永久保存,不会丢失。
存储内容
中断向量表、程序执行代码、固定常量数组、只读配置参数。
常见疑问:为什么地址不是刚好 0x08000000?
Flash 地址段从0x08000000起始,但该地址固定存放中断向量表。向量表会占用一段连续空间,加上链接器自动的地址对齐填充,后续常量段会向后偏移,地址变为0x080004XX等数值,但本质仍属于 Flash 只读区域。
操作限制
仅能使用LDR/LDMIA读取数据,不可使用STR/STMIA写入。
2. SRAM 可读写运行内存(RW 区)
基础参数
- 标准地址范围:
0x20000000 ~ 0x2001FFFF - 汇编段标识:
READWRITE- 示例定义:
AREA BUFFER,DATA,READWRITE
- 示例定义:
读写与存储特性
- 程序运行期间可读、可反复写入修改,支持动态更新数据。
- 断电后所有数据清空,仅上电运行时临时存储数据。
存储内容
数据缓冲区、全局变量、运算临时数据、堆栈空间。
典型数据流转逻辑
程序从 Flash 读取固定常量到寄存器,再批量写入 SRAM 缓冲区,在 SRAM 中完成数据修改、运算。
3. 片内外设寄存器地址区(含只写地址)
基础参数
- 标准地址范围:
0x40000000 ~ 0x5FFFFFFF - 无汇编
AREA段定义,属于硬件外设专属控制地址,不属于存储内存,不长期保存数据。
寄存器三类读写权限
- 可读可写寄存器多用于外设配置,例如 GPIO 模式寄存器、定时器预分频寄存器;可读当前配置、写可修改外设参数。
- 只读寄存器仅用于读取硬件实时状态,例如 GPIO 输入数据寄存器、ADC 采样结果寄存器;写入操作无任何效果。
- 只写寄存器(业内俗称 “只写区域”)是单片机唯一具备只写特性的地址,典型如引脚置位 / 清零寄存器、中断标志清除寄存器。对该地址执行写操作可触发硬件动作;读操作无法获取有效数据,读取值无实际意义。
使用场景
通过读写该区域地址,完成 GPIO、定时器、ADC、串口等外设的硬件控制。
三、三大区域对比总表
| 区域分类 | 地址特征 | 汇编段属性 | 读写权限 | 断电数据状态 | 核心用途 |
|---|---|---|---|---|---|
| Flash 只读存储区 | 0x08 开头 | READONLY | 运行只读,不可改写 | 永久保留 | 存储程序代码、中断向量表、固定常量 |
| SRAM 读写内存区 | 0x20 开头 | READWRITE | 可读、可任意写入修改 | 全部丢失 | 运行缓冲区、临时变量、堆栈 |
| 外设寄存器区 | 0x40 开头 | 无 AREA 段定义 | 分为只读 / 只写 / 可读可写 | 无数据存储功能 | 操控 GPIO、定时器、ADC 等硬件外设 |
四、总结
- 汇编中由
AREA划分的程序存储内存只有两类:Flash 只读区、SRAM 读写区,不存在通用的只写内存; - 大家口中的 “只写区域”,特指
0x40000000起始外设寄存器中的部分控制寄存器,仅用于硬件驱动,不存放程序数据; - 快速识别地址区域口诀:
- 0x08 开头 = Flash,存放固定不变的代码与常量;
- 0x20 开头 = SRAM,存放运行过程中需要修改的临时数据;
- 0x40 开头 = 外设寄存器,包含只读、只写、读写三类控制地址;
- 单片机标准运行流程:从 Flash 读取代码与常量,在 SRAM 完成数据运算缓存,通过外设寄存器实现对外设的控制。