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.

[参考译文] TMS320F28377D:跳转到地址会导致 ECC 错误

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1350835/tms320f28377d-jumping-to-the-address-causes-ecc-errors

器件型号:TMS320F28377D

您好、专家!

在我们的应用程序中,我们需要使用汇编语言(特别是指令)从应用程序代码过渡到引导加载程序代码asm(" LB 0x8349b");。 请注意,地址可能会有所不同。

我们的应用程序代码初始化矢量表中断、同时设置不可屏蔽中断(NMI)。 在程序初始化期间也会激活纠错码(ECC)。

调用后asm(" LB 0x8349b");,NMI 被触发,NMISHDFLG 寄存器显示 FLUNCHERR。 这表示闪存不可纠正的错误 NMI 标志已置位。

是否应在跳转到指定地址之前停用此芯片的 ECC? 或者是否有任何其他原因可以导致 NMI 被触发?

谢谢。

此致、

C.C.刘  

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

    尊敬的 C.C.C.Liu、

    必须对 ECC 进行正确编程、并且不能停用。

    您能否确认是否对 ECC 进行了编程?

    如果使用 CCS 将代码加载到闪存中、请确保在 CCS 片上闪存插件 GUI (CCS 调试视图-->工具-->片上闪存)中启用 AutoEccGeneration。  默认情况下启用该功能、除非用户禁用该功能。

    谢谢。此致、
    瓦姆西

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

    尊敬的 Vamsi:

    感谢您的快速回复。

    我们使用引导加载程序来下载我们的应用代码、而不是通过 CCS。 以下是我们的设置:

    在引导加载程序中、将停用 ECC 以对应用程序代码进行编程、并将编程模式选择为 Fapi_Auto EccGeneration。 下面是我们的扩展问题:我们可以在编程期间激活 ECC 吗? 我们停用了 ECC、因为手动 spnu629a.pdf 说明 F2837xD ECC 存储器空间不支持某些 F021函数。 但是、如果我们激活 ECC、仍然可以完成编程过程。

    在我们的应用代码中、ECC 已激活。

    我们要做的是通过汇编代码从应用程序跳转到引导加载程序:asm(" LB 0x8349b");。 但是、当我们调用此函数时、NMI 会使用 FLUNCHERR 触发。 请注意、如果我们在跳转到地址之前停用 ECC、则不会触发 NMI。

    根据您关于检查是否对 ECC 进行了编程的建议、您能指导我们如何操作吗? 顺便说一下、我已经通过读取所有闪存数据(引导加载程序+应用程序区域)进行检查、以查看启用 ECC 后是否设置了寄存器 ERR_STATUS。 ERR_STATUS 显示0、指示未检测到 ECC。

    谢谢。

    C·C·刘

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

    尊敬的 C.C.C.Liu、

    感谢您的澄清。

    请注意: ECC_ENABLE 寄存器与 ECC 的编程无关。  ECC_ENABLE 寄存器用于启用/禁用针对 ECC 错误从闪存读取的数据的评估。

    Spnu629a:本指南指出 READ 函数不支持读取 ECC 区域。  这与编程无关。

    您能否在启用 ECC_ENABLE 寄存器后共享读取整个闪存空间的代码?

    谢谢。此致、

    瓦姆西

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

    您好 Vamsi、

    感谢您的解释。

    以下是我用于读取闪存数据的代码:

    静态 Cvn_Calculation (uint32 *current_addressuint32 *cvndata)
    {
      uint32 CVN_temp = 0

      CVN_temp = * cvndata
      *cvndata =(uint32)((uint32)(*cvndata)^(*current_address));
      *cvndata = CVN_temp;
    int main()
    {
      /*其他代码... */
      EALLOW
      ECC_ENABLE = 0x0A
      EDIS
       /*其他代码...... */
      静态 uint32 *CVN_FLASH_Value_ptr =(uint32*)(0x80000)
      静态 UINT32数据= 0xA0A0A0A0A0
      while (1){
         Cvn_Calculation (CVN_FLASH_VALUE_PTR、&data);
         CVN_FLASH_VALUE_PTR++

         if (CVN_FLASH_VALUE_PTR >(uint32*)(0xBDFFF))
        {
           中断;
        }
      }
      /*如果未检测到 ECC,切换 GPIO。 */
      if ((ERR_STATUS0x00070007)== 0x00000000){
        GPBTOGGLE = 0x01
      }
    注:
    引导加载程序区域:0x80000 - 0x87FFF
    应用区域:0x88000 - 0xBDFFF
    此致、
    C·C·刘
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 C.C.C.Liu、

    当您说是  FLUNCHR 引起了 NMI、您可以在 NMI ISR 中检查 ECC 错误地址寄存器吗?

    这有助于集中精力处理该地址范围并进行进一步调试。

    谢谢。此致、
    瓦姆西

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

    您好 Vamsi、

    ECC 寄存器的信息如下所示。

    但我想我已经发现了触发 NMI 的原因。 我跳转到相应地址的是重新启动 PLL。 我没有按照手册的说明延迟69个写入周期。 添加100周期延迟后、不会触发 NMI。

    但是、我不知道为什么缺少延迟会触发 ECC 错误。

    谢谢。

    C·C·刘

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

    尊敬的 C.C.C.Liu、

    如您所见、对于显示的地址、确实发生了 ECC 错误。

    关于 PLL 初始化:好的、如果您不遵循指导、可能会导致 SYSCLK 不稳定、因此来自闪存的数据不可靠、从而导致 ECC 错误。

    谢谢。此致、

    瓦姆西