1. 为什么你需要关注STM32L431的内部Flash读写?
如果你正在用STM32L431做项目,不管是做物联网设备、智能穿戴,还是工业控制器,总有一个绕不开的需求:怎么把一些关键数据存起来,掉电了也不能丢? 你可能第一时间会想到外挂一个EEPROM或者SPI Flash芯片。这当然没问题,但这就意味着要多花一块芯片的钱,多占几个宝贵的IO口,PCB板子也得画大一点。其实,STM32L431这颗芯片内部就自带了一块“自留地”——它的内部Flash,除了存放你的程序代码,完全可以把剩余的空间利用起来,存储你的产品序列号、校准参数、运行日志,甚至是实现OTA升级时的固件备份。
我自己在好几个量产项目里都这么干过,实测下来非常稳,能省下不少成本。但和操作内存(SRAM)那种“随心所欲”的读写不同,操作内部Flash更像是在一块特殊的“石板”上刻字,有一套严格的规矩。你要是没按规矩来,轻则数据写不进去,重则可能把正在运行的程序代码给擦除了,导致系统崩溃,这可是个大坑。
所以,这篇指南的目的,就是把我踩过的那些坑、总结出来的最佳实践,用最直白的方式分享给你。我会从地址怎么选、擦除怎么写、代码怎么调这几个核心环节,手把手带你搞定STM32L431的内部Flash高效读写。你会发现,只要理解了它的“脾气”,用起来其实很简单。
2. 动手前必须搞清楚的Flash“家底”
在写第一行代码之前,我们必须像熟悉自己家一样,熟悉STM32L431内部Flash的布局。这决定了我们能把数据存在哪里,以及怎么存才安全。
2.1 Flash的地址地图与空间划分
对于STM32L431RCT6这款常见的型号(拥有256KB Flash),它的内存地图是这样的:
| 地址范围 | 区域名称 | 主要用途 | 可否用于存储用户数据? |
|---|---|---|---|
| 0x0800 0000 - 0x0803 FFFF | 主存储区 (Main Flash) | 存放用户应用程序代码和常量数据 | 可以,但需谨慎规划 |
| 0x1FFF 0000 - 0x1FFF FFFF | 系统存储区 (System Memory) | 存放出厂预置的Bootloader,用于串口/USB等ISP下载 | 绝对不可以 |
| 0x1FFF 7800 - 0x1FFF 7A0F | 选项字节区 (Option Bytes) | 配置读写保护、复位级别等芯片级功能 | 不可以 |
我们的操作对象,就是那256KB的主存储区。它被进一步划分成许多个页 (Page)。对于STM32L4系列,一个页的大小是 2KB(注意,早期一些STM32F1系列是1KB或2KB,L4统一为2KB)。这意味着,256KB的Flash一共包含 128页(256 / 2 = 128)。
这里有个核心概念:Flash的擦除是以“页”为最小单位进行的。 你可以一次擦除一页、多页,甚至整个Bank(批量擦除),但你不能只擦除某个页里的几个字节。想象一下,这一页就像一块白板,你想在上面改几个字,必须先把整块白板擦干净(全部写成1),然后再写上新的内容(把需要的位写成0)。
2.2 关键中的关键:如何选择安全的存储地址?
这是新手最容易出问题的地方。我们的程序代码(编译生成的.bin或.hex文件)就是从0x0800 0000开始往后存放的。如果你选了一个靠前的地址(比如0x0800 1000)来存数据,很可能在下次编译程序后,程序体积变大了,就把你存数据的位置给覆盖掉了,数据就丢了。
所以,一个黄金法则是:把你的用户数据存储区域,放在整个


171

被折叠的 条评论
为什么被折叠?



