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:非易失性存储器

Guru**** 2562460 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/986551/cc2642r-non-volatile-memory

器件型号:CC2642R
主题中讨论的其他器件:UNIFLASH

您好!  

我使用的是具有最新的 BLE 5 SDK 的 CC2642R1。 在我的项目中、我需要为所有用户将数据保存在闪存中。 我尝试使用 osal_SNV_read/write 函数、也尝试使用 NVS 函数。  

-当我使用 osal_SNV_read/write 函数时;它将数据写入最后数据的末尾。 我多次调用具有相同页 ID 的 osal_sv_write 函数、写入数据、新数据的地址从最后一个 结束位置开始。  

这里的问题是、假设我有2个数据(x 和 y)。  首先我写入  x (osal_SNV_write (0x101、sizeof (x)、&x)),然后我写入 y (osal_SNV_write (0x101、sizeof (y)、y)))。 x 和 y 端到端位于非易失性存储器中 问题是当我调用 osal_SNV_read 函数时、它开始读取 y 被写入位置的起始地址。 我尝试了几次呼叫、但每次它开始读出 y 的开始位置。 因此我只能读取 y、然后读取 y。如何读取 x、那么?  

由于每个值都是在最后一个值之后写入的、为什么有页 ID? 即使 地址大于255、也不会在最后一个值之后停止写入。 最后、即使我更改页 ID、它也不会写入其他位置。 使用 uniflash 擦除所有存储器后、即使 pageID 不同、它也会启动 samme 地址。

-我尝试根据 nvsinternal 示例使用 NVS 函数,但 NVS_open 失败。 我使用的是 simple_peripheral。 在简单的外设示例中、我应该如何处理 NVS 函数而不是 osal_SNV 函数。 我应该关闭 osal_SNV 吗? 我已经尝试不在 osal_iCall_Ble.c 中初始化 osal_SNV、但程序在 BIOS_start 函数之后停止工作。 那么、我应该怎么做才能使用 NVS 函数呢?
此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    NV 项目(通常为0x101)的 ID 与页码之间存在混淆。 一般来说,应用程序不能访问 NV 页码-只能访问 NV 项目 ID。

    对于要保留在 NV 存储器中的每个变量、应使用一个不同的 NV ID。 换句话说、我建议将 nv id 0x101用于 x、将 nv id 0x102用于 y。在场景后面、nv 驱动程序将为您实际读取/写入/擦除页面。

    我希望这将有所帮助、

    此致、

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

    感谢您的重播。 我知道。 但我仍然想知道如何使用 NVS 函数而不是 osal_SNV。 功能? 我有很多数据、数据的每个部分都会改变不同的频率、因此如果我对具有 NVS 功能的存储器进行全部控制、那就更好、更高效。 那么、您能帮我将 NVS 函数与简单的外设示例结合使用吗? (当我尝试使用 NVS NVS_open 时失败。)

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

    您好!

    首先、BLE 堆栈使用 osal_SNV API 访问 NV 存储器。 因此、我们建议使用此 API 来访问 NV 存储器、以避免冲突。 根据您提供的详细信息、我认为使用 NVS 驱动程序不会有所帮助-尤其是因为只要 NVS 驱动程序是唯一的、您几乎可以定义所需的 NV ID 数量。 但是、如果您有兴趣遵循此路径、我可以向您介绍 文档 和 驱动程序 API 说明。

    此致、

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

    我不认为使用 NVS 驱动程序会有所帮助-尤其是因为只要 NVS 驱动程序是唯一的、您几乎可以定义所需的 NV ID 数量。

    BLE_NVID_CUST_START 定义为0x100、 BLE_NVID_CUST_END 定义为0x11F。  这意味着我可以使用31个 ID。 我能否只更改  BLE_NVID_CUST_END 并增加 ID 数量? 此外、在 syscfg NVS 中、区域大小为0x4000、我还可以随机更改它或区域基址吗? 我的限制是什么?

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

    您好!

    您一定可以减少客户区域中的 ID 数量。 为此、请将 BLE_NVID_CUST_END 的值更改为任何低于0x3FF 的值(0x3FF 是可用的最大值)。

    NVS 区域的大小受器件上实际显示和可用的闪存大小的限制。 如果您声明的区域过大、链接器将无法链接映像、并会引发错误。

    此致、

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

    您好!

    非常感谢您迄今的回答。 我知道我问的太多了,但是:)这是最后一个问题,我得到了关于 ID 的所有信息,但是关于页面的信息是什么? 页256字节是否长? 在文档中、显示了 SNV 的1页或2页。 我相信它不能仅仅是 SNV 256个字节中的2个:)那么页面的大小是多少,我可以使用多少? 在 syscfg 中、区大小为0x4000、扇区大小为0x2000。 我认为 SNV 仅使用其中的一部分、而不是全部、因为存在差距的经理。 我如何知道 SNV 使用了多少?  

    我不想用几页定义过多的 ID。 听起来是错误的:)是不是错误的? 在一个页面中写入多少 ID、它是否受限?  

    我知道我问了很多,但如果你能回答,我会很高兴

    此致、

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

    您好!

    请务必仔细阅读我们的文档。 闪存分为8KB 的可擦除页。  

    闪存用于保存您的软件和 NVS。

    每页 ID 数没有限制。 仅限数据量。

    此致、

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

    感谢你的帮助。

    最棒的雷加斯