跳转至

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);