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.

CC2642R-Q1: cc2642

Part Number: CC2642R-Q1
Other Parts Discussed in Thread: SYSCONFIG

HI all:

        如下图,我在使用NVS时,在sysconfig中,配置了如下图的nvs区域,

    初始化之后,通过NVS_write(g_nvsHandle, info->offset, (void *)data, info->len, NVS_WRITE_POST_VERIFY);写入数据,第一次写入的成功,之后如果想覆盖写入不同的数据,会写入失败,除非擦除这一页之后,再写入才能写入成功,这是为什么?

  • 您好,

    感谢您的提问,我们需要一点时间查看这个问题,有结论及时联系您。

  • 您好,

    我的操作是直接使用NVS去读写,没有使用OSAL的nvsid的方法,我的期望是能够通过NVS去覆盖写入相同的区域,且不像NVSID那样,存在写入次数的限制。如果NVS无法实现,那是否存在其他的方式实现这样的文件读写(片上划出一块空间,不被其他程序使用,我想写入设备的一些配置信息且在修改部分配置信息时,其他数据信息不会被擦除。)?

  • 您好,

    第一次写入的成功,之后如果想覆盖写入不同的数据,会写入失败,除非擦除这一页之后,再写入才能写入成功,这是为什么?

    根据NVS.h File Reference所述,if NVS_WRITE_POST_VERIFY was requested and the destination flash range does not match the source buffer data. 可能是目标闪存范围与源缓冲区数据不匹配,需要重新擦除再写入。

    片上划出一块空间,不被其他程序使用,我想写入设备的一些配置信息且在修改部分配置信息时,其他数据信息不会被擦除。

    所以现在就是想要修改部分配置信息而不是全部修改。您这么做的目的是什么?

  • 您好,

    比如我写入的信息里可能会包含设备序列号,版本号等,我只想修改其中的一项,而不是全部修改,这就需要只对将要修改的内容覆盖写入就行,而不是全部擦除重新写入。如写入的数据是序列号+版本号,那么序列号是不变的,版本号会随着版本升级迭代而修改,那么我就需要降版本号覆盖写入,而不是全部擦除再写入。

  • 您好,

    感谢您的跟进,我们这边结合您的需求需要一点时间研究一下这个问题,有结论及时联系您。

  • 您好,

          好的,期待您的回复。

  • 您好,

    存在一个标志位,用于擦除从NVS_write()函数指定的偏移量开始的内存字节,这样就不会擦除所有扇区。

    您可以查看一下SDK中的 nvsexternal 和 nvsinternal 这两个例程。

    您也可以参考这篇api文档:NVSCC26XX_HWAttrs Struct Reference

    其中有说到:

  • 您好,

          按照上面的描述,我可以理解为将这块NVS区域,划分为几个不同的扇区进行操作,这样每次的擦除只是当前扇区,但存在一个问题,对于cc2642,它的sector size = 0x2000字节,这是固定的,所以每个小的分区,就必须是sector size的整数倍,用0x2000字节空间去保存几个字节的配置信息是否对flash存在严重的资源浪费。如下图:

    我的nvs区域总共只有0x2000的空间,那么假如我要写入A、B、C三条信息,那就无法对每条信息都划分一个0x2000的整数倍的空间区域,在这种情况下,我的这三条信息时在同一个扇区上,紧挨着写入的,这时候我要修改B的值,就会导致A和C的值丢失,所以如上回答,并没有解决我的疑问。

    我想如何能够做到只修改B的值,而不会导致A和C的值丢失,也就是只对指定的偏移地址开始的指定长度进行擦除和重写。

  • 您好,

    收到您的跟进,我们了解了您的需求,我们尝试和工程师探讨一下,有结论及时联系您。

  • 您好,

    和专家沟通后的确没有办法能满足您的这个需求,只能一个扇区的删除覆写。