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.

[参考译文] RTOS/MSP432E401Y:闪存读取问题

Guru**** 2574795 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/783677/rtos-msp432e401y-flash-read-issue

器件型号:MSP432E401Y

工具/软件:TI-RTOS

您好!

我正在使用"nvsinternal"程序来读取和写入闪存、它工作正常。

但是、我更改了用于写入和读取1000个字节的代码。

我的代码如下所示。

首先、我将发送数据进行写入、然后发送数据进行读取。

因此、在读取时、我能够正确读取五个字节、剩余的所有字节都是零、而不是实际数据。

首先、让我知道编写代码的方式是否正确、还建议我 只正确读取5个字节的原因。

谢谢你

此致

Kalyan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我没有理由只正确读取5个字节。 我在您的代码中看不到任何擦除例程。 请注意、写入过程仅将1更改为0、因此在写入该空间之前擦除(0至1)很重要。

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

    e2e.ti.com/.../nvsinternal.c

    您好 Chris、

    感谢你的答复。

    我已将 nvsinternal.c 文件附加到此帖子。

    请仔细阅读。

    我将发送 A12美元用于写入数据、B34美元用于读取数据。

    谢谢你

    此致

    Kalyan。

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

    您好 Chris、

    请回复我之前的问题。

    我观察到的另一件事是-如果我一次写入1000个字节而不是250次写入4个字节、我将获得正确的读取操作结果。

    就是这样

    NVS_WRITE (nvsHandle、0、&Tx_Buffer、1000、NVS_WRITE_POST_VERIFY);

    NVS_READ (nvsHandle、0、&RD_Buffer、1000);

    工作正常。

    另外一件事是、如果我使用两个数组来写入数据-    第一个写入操作的偏移0和 array1为4字节、偏移4和 array2为5字节、那么我使用时结果是正确的

    NVS_READ (nvsHandle、0、&RD_Buffer1、4);

    NVS_READ (nvsHandle、4、&RD_Buffer1、5);

         

    但在随附的.c 文件中、我无法找到错误所在。 请仔细阅读。

    还有一件事是这样

    上述初始化意味着闪存被分成8个块、每个大小为16kB?。  

    谢谢你

    此致

    Kalyan

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

    您好!

    我无法运行代码、需要查看错误。

    在板级配置文件中、您应该会看到空间 flashBuf 被留出用于应用。

    #define SECTORSIZE (0x4000)
    #define NVS_REGESS_BASE (0xE0000)
    #define REGIZE (SECTORSIZE * 8)
    
    //
    *保留用于 NVS 驱动程序的闪存扇区
    *方法是在
    所需的闪存地址放置一个未初始化的字节数组*。
    //
    #if defined (__TI_Compiler_version__)
    
    //*
    将未初始化的数组放置在 NVS_REGESS_BASE
    */
    #pragma LOCATION (flashBuf、NVS_REGESS_BASE);
    #pragma NOINIT (flashBuf);
    static char flashBuf[REGIZE]; 

    每个扇区为16KB、每组8KB。  由于区域基地址为0xE0000、因此将位于高区域和扇区24-31中。

      

    此致、

    Chris

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

    您能确认您看到的是什么吗?

    (1)我可以在闪存中看到写入的正确值

    (2)我还可以看到 NVS_READ API 将正确的值返回 RD_Buffer[]

    (3) Display_printf 正在打印"0"、而不是 RD_Buffer[]的内容

    此致、

    Chris

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

    您好!

    在写入和读取 API 中、您要将偏移量乘以 NVS 区域、但不会将正在写入或来自缓冲区的索引乘以。

    NVS_WRITE (nvsHandle、0+(4*I)、&Tx_Buffer[i]、4、NVS_WRITE_POST_VERIFY);
    NVS_READ (nvsHandle、 (4*i)、&RD_Buffer[i]、4);
    
    NVS_WRITE (nvsHandle、0+(4*i)、 &Tx_Buffer[4*i]、4、NVS_WRITE_POST_VERIFY);
    NVS_READ (nvsHandle、(4*I)、&RD_Buffer[4*i]、 4); 

    此致、

    Chris