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