NVDS 数据存放在NVDS分区,如下图所示
/**
* @brief only test for nvds write and read
*! 特别注意 ,
*! (1)在调用 nvds_get() 之前,一定要对 待读取的长度nvds_data_length 进行赋值,设定要读多少内容。
*! 长度的类型最好为 nvds_data_length 定义,不能指定为uint8_t。
*! (2)要对判断返回值, 返回值为 0 ,才表示成功,数据可靠。
*! (3)nvds 读写,只关注Tag 标记, 对数据内容的格式并不敏感。均按Byte来处理,去不会判断字符串或者其它数据类型。
*! (4)Tag内容不必预先烧录, 可以在代码中直接写入。
*! (5) NVDS数据在flash不是固定的位置存放的。每次修改后,对应的位置,都会变化。 因此不适合用sf_read来读取。
*! (6) 用sf_write/sf_earse 操作nvds区域,会导致NVDS数据结构破坏并导致NVDS存储区域被Reset擦空。
*/
enum app_nvds_tag
{
// tag
NVDS_TAG_APP_FIRST = NVDS_TAG_APP_SPECIFIC_FIRST, //用户NVDS Tag 起始值
NVDS_TAG_CFG_INFO, //用户NVDS Tag,序号会排在NVDS_TAG_APP_SPECIFIC_FIRST 后
NVDS_TAG_XTAL_PARAM, //用户NVDS Tag,序号会排在NVDS_TAG_APP_SPECIFIC_FIRST 后
NVDS_TAG_User_TEST, //用户NVDS Tag,序号会排在NVDS_TAG_APP_SPECIFIC_FIRST 后
NVDS_TAG_User_TEST2, //用户NVDS Tag,序号会排在NVDS_TAG_APP_SPECIFIC_FIRST 后
// tag length
NVDS_LEN_APP_FIRST = 1, //用户Tag长度, 实际存取的长度,还是取决于调用接口时传入的参数
NVDS_LEN_CFG_INFO = 196, //用户Tag长度, 实际存取的长度,还是取决于调用接口时传入的参数
NVDS_LEN_XTAL_PARAM = 4, //用户Tag长度, 实际存取的长度,还是取决于调用接口时传入的参数
NVDS_LEN_User_TEST = 16, //用户Tag长度, 实际存取的长度,还是取决于调用接口时传入的参数
NVDS_LEN_User_TEST2 = 16, //用户Tag长度, 实际存取的长度,还是取决于调用接口时传入的参数
};
uint8_t nvds_put_usr(uint8_t tag, nvds_tag_len_t nvds_data_length, uint8_t *buf)
{
int err_code = cfg_put(CFG_SECTION_USR, tag, buf, nvds_data_length);
if (0 == err_code)
return NVDS_OK;
else
return NVDS_FAIL;
}
uint8_t nvds_get_usr(uint8_t tag, nvds_tag_len_t *lengthPtr, uint8_t *buf)
{
//int err_code = nvds_get(tag + NVDS_TAG_APP_SPECIFIC_FIRST, (uint8_t *)lengthPtr, buf);
int err_code = cfg_get(CFG_SECTION_USR, tag, buf, lengthPtr);
if (0 == err_code)
return NVDS_OK;
else
return NVDS_FAIL;
}
/**
* @brief 用户Tag 存取操作示例
*
*/
void nvds_get_usr_section_test(void)
{
uint8_t Write_Buff[10] = {0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea};
uint8_t read_buff[10] = {0};
nvds_tag_len_t nvds_data_length = 10;//
log_debug_array_ex("\nWrite_Buff:", Write_Buff, 10);
memset(read_buff, 0x00, 10);
//!!!必须赋值
nvds_data_length = 10;
if (NVDS_OK == nvds_get_usr(NVDS_TAG_User_TEST, (nvds_tag_len_t *)&nvds_data_length, read_buff))
{
log_debug("\n Read nvds_get_usr OK");
log_debug_array_ex("\nread_buff", read_buff, 10);
if (memcmp(Write_Buff, read_buff, 10) == 0)
{
log_debug("\nuser_nvds_Data verify OK");
}
else
{
log_debug("\nuser_nvds_Data verify Fail");
}
break;
}
else
{
log_debug("\nlen=%d", nvds_data_length);
log_debug("\nRead nvds_get_usr Fail");
log_debug_array_ex("\nread_buff:", read_buff, 10);
nvds_data_length = 10;
if (NVDS_OK == nvds_put_usr(NVDS_TAG_User_TEST, nvds_data_length, Write_Buff))
{
log_debug("\n nvds_put_usr OK");
}
else
{
log_debug("\n nvds_put_usr Error");
}
}
}
/**
* @brief read_nvds_device_mac_test 读写MAC 地址示例
*
*/
struct gap_bdaddr gap_addr;
void read_nvds_device_mac_test(void)
{
nvds_tag_len_t nvds_data_length = BLE_GAP_ADDR_LEN;//sizeof(ble_gap_addr_t);
if (nvds_get(NVDS_TAG_BD_ADDRESS, &nvds_data_length, (uint8_t *)&gap_addr.addr) == NVDS_OK)
{
gap_addr.addr_type = 0;
log_debug_array_ex("nvds bd_addr", &gap_addr.addr, 6);
log_debug("nvds bd typer = %s\n", gap_addr.addr_type == 0 ? "public" : "random");
}
else
{
log_debug("\nError for nvds read");
}
gap_addr.addr.addr[1] += 0x20; //增加0x20 ,并写入,用于测试查看变化
log_debug_array_ex("nvds bd_addr", &gap_addr.addr, 6);
nvds_put(NVDS_TAG_BD_ADDRESS, BLE_GAP_ADDR_LEN, (uint8_t *)&gap_addr.addr);
if (nvds_get(NVDS_TAG_BD_ADDRESS, &nvds_data_length, (uint8_t *)&gap_addr.addr) == NVDS_OK)
{
gap_addr.addr_type = 0;
log_debug_array_ex("nvds bd_addr", &gap_addr.addr, 6);
log_debug("nvds bd typer = %s\n", gap_addr.addr_type == 0 ? "public" : "random");
}
else
{
log_debug("\nError for nvds read");
}
}
如果需要预先烧录 NVDS的默认数据,可使用 OmBleConfigurator 工具生成默认数据, 或者直接在代码中生成默认数据。
OmBleConfigurator 配置工具及使用手册-昂瑞微论坛BBS (onmicro.com.cn)