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.

[参考译文] TMS570LS3137:只报告一次闪存 ECC 不可纠正的错误

Guru**** 2466550 points
Other Parts Discussed in Thread: TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/665055/tms570ls3137-flash-ecc-uncorrectable-error-reported-only-once

器件型号:TMS570LS3137

您好!

我使用的是 TMS570LS3137处理器。 我已启用闪存 ECC 保护、并执行以下操作:

  • 启用闪存 ECC 错误检测(FEDACCTRL1.EDACEN = 0xA)
  • 启用内核事件总线导出(调用 coreEnableEventBusExport 汇编函数)
  • 启用闪存 ECC 检查(调用 coreEnableFlashEcc 汇编函数)。

在位于闪存开头的引导加载程序中、我需要读取闪存中写入应用程序的位置、以确定是否对应用程序进行了编程。 如果未对应用软件进行编程、当我读取未写入的闪存位置时、会发生 ECC 组3错误、但电路板上未连接 nERROR 引脚、因此 DSP 不会复位、并生成数据中止异常(0x10)。 我在数据中止异常上放置了一个中断函数、我想清除错误并继续执行。

当我第一次读取未编程的闪存地址时、会生成数据中止、并且该错误也会被检测为 ECC 错误。 寄存器 ESMSR3为0x80、因为发生了 FMC -不可纠正的错误;寄存器 FEDACSTATUS 为0x100、因为发生了总线1不可纠正的错误。 这很好。

然后、我通过执行以下操作来清除该错误:

  • 通过写入 FEDACSTATUS = 0x00FFFFFF 来清除所有报告的闪存错误
  • 通过写入 ESMSR3 = 0xFFFFFFFF 来清除所有组3 ESM 错误
  • 通过写入 ESMEKR 位 eKEY = 5来禁用 ERROR 引脚

然后、我从中止异常返回、代码恢复正常执行。

我的问题是、当我再次读取未编程的闪存地址时、会生成数据中止异常、但这次 ECC 机制似乎未检测到错误、因为 ESMSR3为0、 FEDACSTATUS 也为0。

我是否还需要清除/复位其他内容以允许 ECC 机制检测另一个错误?

谢谢、

Martin

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

    您好 Martin、

    误差应可重复。 您是否无意中清除了其他寄存器? 这是我的测试代码,可以在 for (..)中重现错误。 环路。

    int main (空)

    /*用户代码开始(3)*/

      unsigned int i;

      /*为闪存访问启用 CPU 指示的 ECC 错误响应*/

      flashWREG->FEDACCTRL1 = 0x000A060AU;

      /*为 ATCM (闪存访问)启用 CPU ECC 检查*/

      _coreEnableFlashEcc_();

      对于(i=0;i<100;i++)

       值=*(unsigned int *)(0x20000 + I);

      值=*(unsigned int *)(0x300008);

      /*用户代码结束*/

      返回0;

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

    您能否分享一个工作示例、以便我可以自行运行?

    谢谢、

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

    当然、我将清理我的项目并在稍后发布。 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../6518.TMS570LS3137ZWT_5F00_HDK_5F00_ECC.7z

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

    您好、Wang、

    我修改了您的示例项目以反映我的问题。

    在 dabort.asm 中、我注释了分支到 flashAbortReal 的器件、因为即使错误是实际的2位错误、我也要将其清除并恢复执行。

    在 sys_main.c 中、我在地址0x6000和0x6001处读取、地址0x6000和0x6001在程序之后、不是由仿真器写入。 这样我就不会擦除所有闪存。

    因此、如果在地址0x6000读取时使用中断点执行此程序、则可以看到地址0x6000被读取时、会生成中止异常、如果观察寄存 器 esmsr3 (0xFFFFFF520)、则可以看到值为0x80 (不可纠正的 ECC 错误)。 然后执行中止代码、 它进入 flashErrorFound 部分并清除错误。 当代码从中止异常寄存器返回时、esmsr3为0。 然后代码读取地址0x6001。 生成另一个异常中断、但该时间寄存 器 esmsr3为0而不是0x80、并且异常中断代码不会进入 flashErrorFound 部分。

    我的问题是、第二次出现错误时、ESM 模块不会报告错误。 可能还有其他需要清除的东西。

    不确定我是否正确包含了该文件。 请告诉我修改后的项目是否未包括在内。

    谢谢、

    Martin

    e2e.ti.com/.../3034.TMS570LS3137ZWT_5F00_HDK_5F00_ECC.7z

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

    您好、Wang、

    您是否有时间查看我的示例?

    此致、

    Martin

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

    我终于找到了问题。

    首先、当读取一个带有1位错误的闪存中的位置时、错误一直被纠正、但是此事件只在第一次在 ESM 和闪存寄存器中被标记。 我通过读取不同的位置来解决这个问题。 很明显、当您在同一故障64位中多次读取时、错误会被纠正、但仅在第一次被标记。

    其次、当读取一个带有2位错误的闪存中的位置时、每次都会生成一个异常中断、但是此事件只在第一次在 ESM 和闪存寄存器中被标记。 我通过读取闪存寄存器中的 FUNC_ERR_ADD 并清除 ESM 状态和闪存状态寄存器来求解。 需要读取寄存器 FUNC_ERR_ADD 以清除偶数并允许标记另一个错误。

    感谢你的帮助。

    Martin