CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

NVDS

NVDS是一个轻量级逻辑数据存储系统,它依赖于Flash硬件抽象层(Flash HAL)。其存储于Flash中,掉电时数据不会丢失。NVDS默认使用Flash最后一个扇区(Sector)作为存储区域。

NVDS系统适合存储小块数据,例如应用程序的配置参数、校准数据、状态和用户信息等。BLE协议栈也会使用NVDS存储设备绑定等参数。

NVDS系统具有以下特性:

  • 每个存储项(TAG)都有唯一的TAG ID用于标识,用户程序可以根据TAG ID对数据内容进行读取和更改操作,不需要关心存储的物理地址。
  • 针对Flash存储介质的特性进行了优化,支持数据校验、Word对齐、碎片整理和擦写平衡。
  • 存储区域的大小和起始地址可配置,Flash存储区以Sector为单位,一个Sector的大小为4 KB,NVDS存储区域可配置为若干个Sector;配置的起始地址须按4 KB对齐。

NVDS提供了以下五个简单的API用于操作Flash中的非易失性数据。

表 2 NVDS API
函数原型 描述

uint8_t nvds_init(uint32_t start_addr, uint8_t sectors)

初始化NVDS使用的Flash Sectors。

uint8_t nvds_get(NvdsTag_t tag, uint16_t *p_len, uint8_t *p_buf)

从NVDS中读出tag标识对应的数据。

uint8_t nvds_put(NvdsTag_t tag, uint16_t len, const uint8_t *p_buf)

将数据写入到NVDS并用tag标识。如果这个tag不存在,则创建一个新的。

uint8_t nvds_del(NvdsTag_t tag)

删除NVDS中tag标识的数据。

uint16_t nvds_tag_length(NvdsTag_t tag)

获取指定Tag的数据长度。

NVDS API的详细说明请参考GR551x API Reference,或直接查看NVDS头文件(位于SDK_Folder\components\sdk\gr55xx_nvds.h)。

NVDS存储数据的格式如图 7所示:

图 7 NVDS存储数据格式

数据头(Data Header)格式如表 3所示:

表 3 Data Header格式
Byte Name Description
0-1 tag 数据的tag标识
2-3 len 数据的长度
4-4 checksum 数据头的校验和
5-5 value_cs 数据的校验和
6-7 reserved 保留字段
说明:

BLE协议栈也会使用NVDS存储一些参数,因此必须为NVDS分配Flash存储区域。GR551x SDK会缺省使用Flash Memory最后一个Sector作为NVDS使用的存储区域,可通过更改custom_config.h文件中的宏NVDS_START_ADDR和NVDS_NUM_SECTOR来配置NVDS区域的起始地址和占用大小。BLE协议栈和Application共享相同的NVDS存储区域,但是TAG ID命名空间被划分为不同的类别,开发者只能使用分配给Application的TAG ID命名类别。

  • Application必须使用NV_TAG_APP(idx)来获取应用程序数据的TAG ID。该TAG ID被用作NVDS API的参数。
  • Application不能将idx直接作为NVDS API的参数。idx取值范围是0x0000 ~ 0x3FFF。

在Application第一次运行前,开发者可使用工具GProgrammar将BLE协议栈和Application所使用的TAG初始值写入到NVDS。如果开发者不使用GR551x SDK缺省的NVDS区域而要自行指定NVDS区域起始地址,请确保GProgrammar中的NVDS区域起始地址配置与custom_config.h中定义的NVDS区域起始地址相同。关于custom_config.h中NVDS区域起始地址的配置,参考配置custom_config.h

扫描关注

打开微信,使用“扫一扫”即可关注。