设计系统掉电保持参数参考
一、方案核心问题
解决 3 个问题:
- 怎么在 Flash 上安全存参数?
- 怎么更新参数(避免更新时断电丢失数据)?
- 怎么快速找到需要的参数?
二、分层结构
1. 底层:Flash 硬件层
- 是什么:实际存储数据的物理硬件
- 特性:
- 必须先 “擦除”才能 “写入”,擦除最小单位是 4KB(0x1000 字节)。
- 地址固定:例如从
0x300C0000
到0x30100000
(共 2 个扇区,每个 128KB),这部分空间专门用来存参数。
2. 中层:存储分区层
- 作用:把 Flash 划分为可管理的 “区域”,避免数据混乱。
- 关键划分:
- 扇区(Sector):Flash 的最小擦除单位(4KB),编号 0、1(共 2 个扇区)。
- 文件(File):每个扇区里划分多个 “文件”。
3. 上层:参数管理层
- 参数(Param):最终要存储的数据(如设备 ID、校准值)包含:
- 标签:参数名。
- 内容:参数值。
- 状态:是否有效。
- 文件头(File Header):每个文件的 “说明书”,记录文件是否有效、最新参数索引等。
三、核心操作流程
1. 存参数
- 场景:要修改参数。
- 步骤:
- 找空位:检查当前在用的 “文件” 里有没有空位置(参数未满),如果满了就找新的 “文件”。
- 备份旧数据:把旧文件里的所有参数复制到新文件。
- 写新数据:在新文件里修改目标参数。
- 标记旧文件无效:把旧文件的状态改为 “废弃”(
0x0000
),新文件改为 “在用”(0xAAAA
)。因为 Flash 不能直接改,必须先擦除,这样即使中途断电,旧文件还能用,不会丢数据。
2. 读参数
- 场景:要读取参数。
- 步骤:
- 找文件:找到当前 “在用” 的文件(状态为
0xAAAA
)。 - 找参数:在文件里按参数名查找,找到后返回参数值。
- 找文件:找到当前 “在用” 的文件(状态为
四、方案优点与注意事项
优点:
- 安全:更新参数时先写新文件再废弃旧文件,掉电不会丢数据。
- 结构化:分层管理,参数查找和维护方便。
注意事项:
- 擦除次数有限:Flash 擦写次数约 10 万次,频繁更新会缩短寿命(需优化擦写频率)。
- 空间浪费:即使只改 1 个字节,也要备份整个文件(4KB),可通过更小粒度管理优化。
五、思维导图(分层结构 + 核心操作)
读参数流程:找在用文件→按名查参数→返回值
存参数流程:找空位→备份旧数据→写新数据→标记旧文件无效
参数结构:名(28字节)+ 数据 + 状态(有效/废弃)
文件头:记录文件状态(在用/废弃)、索引
文件(File):每个扇区含多个文件,每个4KB
扇区(Sector):4KB/个,编号0、1
特性:先擦后写,最小擦除单位4KB