1. 为什么需要在MCU中指定Flash地址存储数据?
在嵌入式系统开发中,直接操作Flash存储器地址的需求非常普遍。最常见的情况是需要存储一些固定参数或配置信息,这些数据需要在设备断电后依然保持,但又不需要频繁修改。比如:
- 设备序列号、MAC地址等唯一标识信息
- 校准参数(传感器偏移量、增益系数等)
- 固件版本信息
- 用户配置参数(如LCD背光亮度、语言设置等)
- 加密密钥或安全证书
与使用EEPROM或外部Flash芯片相比,直接利用MCU内部Flash存储这些数据有以下优势:
- 节省硬件成本(无需额外存储芯片)
- 简化PCB布局(减少元器件数量)
- 提高数据访问速度(内部总线速度通常更快)
- 增强数据安全性(不易被物理探测)
但这种方法也有明显限制:Flash的擦写次数有限(通常10万次左右),不适合频繁更新的数据。因此,在项目规划阶段就需要明确哪些数据适合存放在Flash中。
2. 理解MCU Flash存储器的基本特性
2.1 Flash存储器的物理结构
现代MCU的Flash存储器通常由多个扇区(sector)或页(page)组成,每个扇区的大小从几百字节到几十KB不等。以STM32F4系列为例:
| 型号 | Flash总大小 | 扇区大小分布 |
|---|---|---|
| STM32F405 | 1MB | 16KB×4, 64KB×1, 128KB×7 |
| STM32F407 | 1MB | 16KB×4, 64KB×1, 128KB×7 |
| STM32F411 | 512KB | 16KB×4, 64KB×1, 128KB×3 |
关键操作特性:
- 擦除操作必须以扇区为单位进行
- 写入操作可以按字(32bit)或半字(16bit)进行
- 已写入的数据只能通过擦除整个扇区来修改
2.2 Flash编程的基本流程
在指定地址存储数据的完整流程应该是:
- 解锁Flash控制寄存器(防止意外写入)
- 擦除目标扇区(如果需要修改现有数据)
- 写入新数据
- 锁定F
