This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652P7:OSAL SNV 擦除多个客户's NV ID

Guru**** 2382230 points
Other Parts Discussed in Thread: SYSCONFIG, UNIFLASH
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1523305/cc2652p7-osal-snv-erase-multi-customer-s-nv-ids

器件型号:CC2652P7
Thread 中讨论的其他器件:SYSCONFIG、UNIFLASH

工具/软件:

您好、

我想擦除多个客户特定的 NV(非易失性)ID、大约需要 100 个条目、总计约 1KB。 但是、可用的 OSAL SNV API 仅提供用于读取和写入单个项目的函数。

为了解决这一限制、我将 NV 存储大小增加到 0x8000、并将 NVOCMP_NVPAGES 设置为 4。 目的是将客户的 NV ID 分配给 NV 第 2 页或第 3 页、允许通过一次擦除整个页面来擦除这些条目。

请您就这种方法的可行性和最佳做法提出建议。

SDK:simplelink_cc13xx_cc26xx_sdk_8_30_01_01

此致、

存储体

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    FLASH 有两个部分,用户可以与之交互: 简单 NV (SNV) 面积 和  应用程序的非易失性存储 (NVS) 区域 。 蓝牙栈使用 SNV 区域来存储绑定信息、但用于存储少量数据(低于 100 字节)。

    由于要存储 1KB 的数据、 我们建议使用 NVS 区域 。 NVS 具有 用于读取、写入和擦除存储器等的 API 函数、可满足您的需求。 您可以在 SysConfig 中定义一个新的 NVS 区域、并使用 API 写入、读取和擦除您的数据。

    您可以在 用户指南中有关闪存的一章中阅读有关如何处理闪存的更多信息

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Maxence、

    但对于少量数据(低于 100 字节)。

    我已经增加了 NV 存储容量。

    由于要存储 1 KB 的数据、 我们建议使用 NVS 区域 。 NVS 具有 用于读取、写入和擦除存储器等的 API 函数、可满足您的需求。 您可以在 SysConfig 中定义一个新的 NVS 区域、并使用 API 来写入、读取和擦除您的数据。

    为解决 NVS 问题、我擦除闪存并通过 UniFlash 加载映像、然后执行电路板的初始复位。 但是、闪存读取状态和数据似乎不正确。 随后对电路板进行复位会得到相同的错误结果。

    NVS_Handle nvsHandle;
    NVS_Attrs regionAttrs;
    NVS_Params nvsParams;
    uint8_t rgbVal[4];
    uint8_t rgbVal2[4];
    
    void rgbVal_Init(void) {
    //--------------------//
    
      NVS_init();
      NVS_Params_init(&nvsParams);
    
      nvsHandle = NVS_open(CONFIG_NVS_0, &nvsParams);
      if (nvsHandle == NULL) {
        while (1) {}
      }
    
      NVS_getAttrs(nvsHandle, &regionAttrs);
    
      uint16_t status = SUCCESS;
      uint16_t status2 = SUCCESS;
    
      status = osal_snv_read(NVID_GPWM, NVGPWM_SIZE, (uint8_t *)&rgbVal);
      status2 = NVS_read(nvsHandle, 0, (uint8_t *)&rgbVal2, 4);
      
      Log_info2("read status %x, %x", status, status2);
      Log_info4("dbg  %x, %x, %x, %x", rgbVal[0], rgbVal[1], rgbVal[2], rgbVal[3]);
      Log_info4("dbg2  %x, %x, %x, %x", rgbVal2[0], rgbVal2[1], rgbVal2[2], rgbVal2[3]);
      
      if (status != SUCCESS) {
        rgbVal[IDX_R_LED] = StatePWM_Val[STATE_POWER_ON_INIT][IDX_R_LED];
        rgbVal[IDX_G_LED] = StatePWM_Val[STATE_POWER_ON_INIT][IDX_G_LED];
        rgbVal[IDX_B_LED] = StatePWM_Val[STATE_POWER_ON_INIT][IDX_B_LED];
        rgbVal[IDX_W_LED] = StatePWM_Val[STATE_POWER_ON_INIT][IDX_W_LED];
        status = osal_snv_write(NVID_GPWM, NVGPWM_SIZE, (uint8_t *)&rgbVal);
      } // !SUCCESS
    
      if (status2 != SUCCESS) {
        rgbVal2[IDX_R_LED] = 0xAA;
        rgbVal2[IDX_G_LED] = 0xBB;
        rgbVal2[IDX_B_LED] = 0xCC;
        rgbVal2[IDX_W_LED] = 0xDD;
        status2 = NVS_write(nvsHandle, 0, (uint8_t *)rgbVal2, 4, NVS_WRITE_POST_VERIFY);
      }
    
      Log_info2("write status %x, %x", status, status2);
      Log_info4("dbg  %x, %x, %x, %x", rgbVal[0], rgbVal[1], rgbVal[2], rgbVal[3]);
      Log_info4("dbg2  %x, %x, %x, %x", rgbVal2[0], rgbVal2[1], rgbVal2[2], rgbVal2[3]);
    
      NVS_close(nvsHandle);
      
    } // void rgbVal_Init(void)

    此致、

    存储体

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您的 CONFIG_NVS_0 是否可能被 CONFIG_NVSINTERNAL 或 CONFIG_NVSINTERNAL 覆盖 ?
    您能给我发送这些配置的 SysConfig 屏幕截图吗?

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Maxence、

    供参考

    此致、

    存储体

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    很抱歉晚才回复。 您能否检查一下您是否可以写入 NVS、然后在之后立即阅读、看看它是否有效? 您现在的问题是、下电上电后 NVS 值没有得到保护、对吧?

    下面是您可以使用的代码:

    NVS_Handle nvsHandle;
    NVS_Attrs regionAttrs;
    NVS_Params nvsParams;
    
    void rgbVal_Init(void) {
    //--------------------//
    
      NVS_init();
      NVS_Params_init(&nvsParams);
    
      nvsHandle = NVS_open(CONFIG_NVS_0, &nvsParams);
      if (nvsHandle == NULL) {
        while (1) {}
      }
    
      NVS_getAttrs(nvsHandle, &regionAttrs);
      
      uint16_t status = SUCCESS;
      
      uint8_t dataArray[4] = {0xCA, 0xFE, 0xBE, 0xEF};
      status = NVS_write(nvsHandle, 0, (uint8_t *)dataArray, 4, NVS_WRITE_POST_VERIFY);
    
      Log_info2("write status %x", status);
    
      uint8_t dataArrayRead[4] = {0x00, 0x00, 0x00, 0x00};
      status = NVS_read(nvsHandle, 0, (uint8_t *)dataArrayRead, 4);
      
      Log_info2("read status %x", status);
      Log_info2("values read : %x, %x, %x, %x", 
        dataArrayRead[0], dataArrayRead[1], dataArrayRead[2], dataArrayRead[3]);
      
      NVS_close(nvsHandle);
      
    } // void rgbVal_Init(void)

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您能否检查您是否可以写入 NVS、然后在之后立即阅读它以查看它是否有效?

    此操作有效。

    您现在的问题是、下电上电后 NVS 值不会被保存、对吗?

    下电上电后、系统应验证 NVS 的内容。 如果闪存已被擦除或之前未存储数据、则读取操作不应返回成功状态。 应比较osal_snv_readNVS_read的结果以检测这种情况。“

    此致、

    存储体