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.

[参考译文] TMS320F28388D:闪存擦除

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1025899/tms320f28388d-flash-erase

器件型号:TMS320F28388D

您好!  

我正在使用 F28388D 控制器、我在闪存擦除操作期间观察到一个奇怪的行为。

我已经写入了一个功能来将 s2记录格式载入到闪存中,加电时我可以执行扇区7、8、9和扇区4、5、6的擦除操作,然后我将 s2记录载入到闪存扇区4、5、6。 成功将数据复制到闪存扇区7,8,9后,我将执行从扇区7,8,9到扇区4,5,6的闪存副本。 我使用了一个500 μ s 的任务来执行此操作、我还需要以至少500 μ s 的速度刷新外部 WD

现在,假设扇区4,5,6是备份扇区,我需要将其擦除,因此当我尝试擦除该扇区时 ,我可以看到外部 WD 刷新不会发生并导致复位。 当我在开始时执行擦除扇区7,8,9时,看不到同样的行为。

这种行为差异背后的原因可能是什么。 我尝试了扇区4、5、6、它也表现出相同的行为。

我已按如下方式初始化闪存

谢谢、

Nagesh  

#pragma CODE_SECTION(InitFlash, "ramfuncs");
void InitFlash(void)
{
    EALLOW;
    gstrFlash0CtrlRegs.FPAC1.bit.PMPPWR = 0x1;
   
    gstrFlash0CtrlRegs.FBFALLBACK.bit.BNKPWR0 = 0x3;

    gstrFlash0CtrlRegs.FRD_INTF_CTRL.bit.DATA_CACHE_EN = 0;
   
    gstrFlash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 0;
  
    gstrFlash0CtrlRegs.FRDCNTL.bit.RWAIT = 0xF;
   
    gstrFlash0CtrlRegs.FRD_INTF_CTRL.bit.DATA_CACHE_EN = 1;
   
    gstrFlash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 1;

    //->At reset, ECC is enabled. If it is disabled by application software and
    // if application again wants to enable ECC.
    // Set ENABLE member of gstrFlash0EccRegs to 0x0.
#warning"ECC disabled!"
    gstrFlash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;

   
    EDIS;

    //->Force a pipeline flush to ensure that the write to the last register
    // configured occurs before returning.
    // Invoke __asm with " RPT #7 || NOP" as parameter
    __asm(" RPT #7 || NOP");
}

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

    您好、Naresh、

    从以下数据表规格中、您是如何达到您提到的500us 超时的?

    您正在使用0xF 等待状态。  您可以在200MHz 时使用3个等待状态。  您有没有理由不享受此福利?

       

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、  

    我将每500us 向闪存写入15个字节的数据,我在编程时没有发现任何问题,它会相应地对闪存进行编程。

    我在   200MHz 时尝试了0x3等待状态、但我看到了相同的行为、因此我尝试了0xF 以查看是否有任何改进。

    谢谢、

    Nagesh

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

    Nagesh、

    好的、那是程序的时候-明白了。  您之前的帖子中不清楚。

    您是否说擦除操作在某些扇区需要更长的时间(但在数据表规格内)?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    是的、如果擦除需要更长的时间、直到我能够刷新连接到 GPIO-46的外部看门狗并且需要刷新时间少于7ms、我可以这么做。

    因此、每5ms 执行一次 CPU 定时器2中断、以在每次中断时刷新或切换 GPIO-46。 我已验证中断工作正常、但在擦除扇区4、5、6、7、8、9秒期间、我仍然看到它会导致复位、这是因为外部 WD 未刷新。

    当外部 WD 被禁用时、相同的代码运行正常、我确实对闪存 API 函数的执行执行了时序分析、在这里我可以看到每次调用它时花费大约3us

    函数: fapi_issueAppoedCommandWithAddress (Fapi_EraseSector,(UINT32 *)u32FlashSectorAddr)- 3us

    函数: fapi_checkFsmForReady();-1us

    函数: fapi_doBlankCheck():-4.327毫秒

    谢谢、

    Nagesh

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

    Nagesh、

    您能否向我发送链接器 cmd 和映射文件?

     如果您在其中有任何专有信息、则可以将其脱机发送。

    谢谢、此致、

    Vamsi

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

    Nagesh、

    我收到了映射文件。 我看不到闪存 API 使用有任何问题。 调用闪存 API 的函数如何-它们也是从 RAM 执行的?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    是的、所有闪存 API 函数都从 RAM 中执行。  

    您能 告诉我在执行闪存擦除时是否可以中断 CPU1或2、以便我可以执行外部 WD 刷新吗?

    它是否仅在加电时用于擦除操作而不是在稍后中断时工作?

    谢谢、

    Nagesh

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

    您好、Nagesh、

    是的、在闪存操作期间、CPU1/2可随时中断。  您没有回答我之前的问题-调用闪存 API 的函数如何-它们也是从 RAM 执行的?  它们应该从 RAM 中执行。

    您能否确认在中断期间没有任何类型的闪存访问?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

     调用闪存 API 的函数如何-它们也是从 RAM 执行的?

    是所有调用闪存 API 的函数,我已确保从 RAM 执行。

    您能否确认在中断期间没有任何类型的闪存访问?

    是的、中断中没有闪存访问。

    谢谢、

    Nagesh

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

    Nagesh、

    定时器中断位于何处?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    我已将中断 CPU 定时器2配置为1ms、以仅刷新 GPIO-46。

    CPU 定时器2通过此 RefreshWD 函数调用进行配置。

    #pragma DATA_SECTION (strGpioDataRegs、"GpioDataRegsFile");
    volatile struct GPIO_DATA_regs strGpioDataRegs;

    空 RefreshWD (空)

    if (cpuid_1 == gu16CpuId)

    EALLOW;


    strGpioDataRegs.GPBSET.BIO46 = 1;


    asm (" RPT #200||NOP");

    strGpioDataRegs.GPBCLEAR.bit.GPIO46 = 1;

    EDIS;

    谢谢、

    Nagesh

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

    Nagesh、

    此功能位于何处?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    此函数位于闪存中、该闪存将为扇区0至3、而不是超出扇区0至3。

    谢谢、

    Nagesh

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

    Nagesh、

    这不是复制到 RAM 吗?  如果我理解正确、当闪存擦除/编程操作在您的应用中处于活动状态时、将执行此操作-对吗?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    是的、从现在的代码中开始、这不会复制到 RAM、RAM 会刷新外部看门狗、

    是的、当我的应用程序中的擦除/编程操作处于活动状态时、此操作将处于活动状态、但我不会擦除应用程序所在的扇区。 禁用外部 WD 时、相同的代码工作正常。

    我有一个挂起的活动来测量 GPIO-46的电压输出、当擦除操作进行时、该输出应该为3.3V。我将告知这一点。

    谢谢、

    Nagesh

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

    Nagesh、

    如本指南中所述、在进行擦除或编程操作时、不应从闪存(任何扇区)执行任何函数。  请将其复制到 RAM。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    我创建了一个类似的问题、我正在使用启用的内部 WD 观察到这一问题、并且我每6ms 对内部看门狗进行一次处理。

    我已经修改了示例程序'flashapi_ex1_programming'、并相应地添加了一个函数调用来擦除扇区7、8、9和编程秒7、8、9并再次擦除秒7、8、9。 在扇区的第二次擦除期间、即使内部看门狗被处理、我也可以看到内部看门狗没有被及时处理、并且在闪存扇区7、8、9的第二次擦除操作期间被中断。

    下面是我已按顺序添加的函数调用

    Eraseallsectors ();

    Prgsector();

    Eraseallsectors (); ->在内部 WD 不被处理时在这里失败。

    我还更新了 sysctl.h 文件 以启用具有不同定时中断的内部 WD、我已验证擦除操作为6ms、13ms 和26ms、我的观察结果如下  

    internalWD 在6ms 时尝试进行处理时、擦除操作失败、并在中断时停止 -在6ms 时失败

    internalWD 在13ms 时尝试进行处理时、擦除操作失败、并在中断时停止-在13ms 时失败

    当 internalWD 在26ms 时被尝试进行处理时、擦除操作 正常。 -26ms 通过

    基本上、我想知道它为什么在6ms 时失败、以及我们如何解决这个问题。 如果有限制、请告诉我。

    #define SYSCTL_WD_CHKBITS_6ms 0x0C2CU
    #define SYSCTL_WD_CHKBITS_13MS 0x0C2DU
    #define SYSCTL_WD_CHKBITS_26MS 0x0C2EU

    和功能按如下方式更新  

    静态内联空

    SYSCTL_enableWatchdog (空)

    uint16_t sysctl_wd_Chkbits = sysctl_WD_CHKBITS;


    SYSCTL_WD_Chkbits = SYSCTL_WD_CHKBITS_6ms;
    //sysctl_wd_Chkbits = sysctl_WD_CHKBITS_13MS;
    //sysctl_wd_Chkbits = sysctl_WD_CHKBITS_26MS;

    EALLOW;

    //
    //清除禁用位。
    //
    HWREGH (WD_BASE + SYSCTL_O_WDCR)=(HWREGH (WD_BASE + SYSCTL_O_WDCR)&
    ~SYSCTL_WDCR_WDDIS)| SYSCTL_WD_ChKB;

    EDIS;

    我将向您分享要调试的示例项目文件、因为我无法在此处附加。

    谢谢、

    Nagesh

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

    Nagesh、

    您能否确认修复了我之前的发现?  ->您现在是否将看门狗服务代码/ISR 移至 RAM?  仍然看到这个问题吗?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    是的、我现在已将所有函数移动到 RAM 中。 包括 ISR。

    谢谢、

    Nagesh

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

    Nagesh、

    感谢您提供信息。  我将能够在下周中旬查看您的代码。

    谢谢、此致、
    Vamsi

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

    Nagesh、

    最好召开 WebEx 电话会议、这有助于审查项目的其他组成部分。

    请告诉我您的情况是否好。  如果您可以、我们可以按日期/时间对齐。

    谢谢、此致、
    Vamsi

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

    供其他人参考: 我们正在离线讨论此问题、因为我们正在查看 Nagesh 的自定义专有代码。

    谢谢、此致、
    Vamsi

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

    Nagesh、

    如会议期间所讨论:

    对于超时或看门狗服务、当闪存未处于擦除状态时、预期擦除时间处于数据表规格范围内。  当闪存已处于 擦除状态时、FSM 将在很短的时间内从忙状态返回-因此、不要依赖这种情况来描述您的看门狗服务时间。  只需符合数据表规格。

    2.此外,调整空白支票的起始地址和长度以调整看门狗复位窗口。  您可以通过递增起始地址来迭代调用空白检查(并且您可以保持与套接看门狗窗口相同的短长度)。

    3.将看门狗服务例程移动到 RAM -正如您看到的,当服务代码被复制到 RAM 时,示例工作正常。

    ECC 错误评估:由于您不想在闪存映像中包含物理错误、我建议您 查看 TRM 中的13.9.3 SECDED 逻辑正确性检查部分。  如果您想要更简单的方法、并且不想为其添加任何额外的代码、请告诉我、我会相应地提供指导(因为您听说它仅用于开发、而不是用于实际运行时检查、但还需要确认)。

    按照建议、根据以上内容恢复您的实际应用、并让我知道具体情况。

    谢谢、此致、
    Vamsi

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

    关于 Munaf 在会议期间讨论的两个内核共享 RAM 的使用情况: 请打开一篇文章、我们将指派一位专家来帮助您。

    谢谢、此致、
    Vamsi