NV 持久化存储
使用技术:NV(Non-Volatile)存储 API
学习目标
- 理解 NV 存储的用途——保存配网信息、配对密钥、配置参数、校准数据等掉电不丢失的数据
- 掌握
uapi_nv_write()/uapi_nv_read()的基本操作 - 理解 NV 区域划分和容量限制
- 能够在 WS63 上实现配置参数的持久化存储
基本概念
NV 存储的定位
Flash 中划出专用区域用于 Key-Value 存储。
| 对比项 | NV | LittleFS |
|---|---|---|
| 数据模型 | Key-Value | 文件 |
| 适合数据 | 少量结构化数据(几十B~几KB) | 大量文件型数据(日志/配置) |
| 写入方式 | 按 ID 读写 | 按文件路径读写 |
NV 区域划分
| 区域 | 说明 | 访问 |
|---|---|---|
| Factory | 出厂校准数据(如 TCXO 值) | 只读 |
| Keep | 系统配置(MAC 地址等) | 系统保留 |
| User | 应用数据 | 可读写 |
写入寿命
Flash 写入次数有限(通常 10 万次)。频繁变化的参数(如运行时间计数器)不应直接写 NV——推荐定时批量写入。
涉及 API
| API | 用途 |
|---|---|
uapi_nv_write(nv_id, data, len) |
写入 NV 数据 |
uapi_nv_read(nv_id, data, &len) |
读取 NV 数据 |
uapi_nv_delete(nv_id) |
删除 NV 数据 |
案例说明
做什么
上电时从 NV 读取已保存的配置(上报间隔/告警阈值),收到新配置后写入 NV——断电重上电后自动恢复上次配置。
关键配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
| NV ID 范围 | 0x1000~0x1FFF | 应用层使用,避免与系统预留冲突 |
| 写入时机 | 配置变化后立即写入 | 避免高频写入(磨损 Flash) |
代码详解
#define NV_ID_REPORT_INTERVAL 0x1000
#define NV_ID_ALARM_THRESHOLD 0x1001
/* 写入配置 */
uint32_t interval = 60; // 上报间隔 60 秒
uapi_nv_write(NV_ID_REPORT_INTERVAL, &interval, sizeof(interval));
float threshold = 40.5; // 告警阈值
uapi_nv_write(NV_ID_ALARM_THRESHOLD, &threshold, sizeof(threshold));
/* 读取配置 */
uint32_t saved_interval;
uint16_t len = sizeof(saved_interval);
uapi_nv_read(NV_ID_REPORT_INTERVAL, &saved_interval, &len);
printf("interval: %u s\n", saved_interval);