6621x nvds数据操作示例

wen sir · 772次点击 · 2023-06-27

    NVDS 数据存放在NVDS分区,如下图所示

  image.png   image.png




/**
 * @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)









nvds_example-202306278066.c
被收藏 1  ∙  1 赞  
加入收藏
点赞
5 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站