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.

[参考译文] TMS320F280039C:如何了解闪存 ECC 及其如何影响程序运行

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1577887/tms320f280039c-how-to-understand-flash-ecc-and-how-it-effect-the-program-run

器件型号:TMS320F280039C
主题中讨论的其他器件:test2.

您好专家

客户希望将 MCU 闪存的一位从 1 更改为 0、但获得一些有趣的测试结果、下面介绍了背景和问题:

背景:他们想要更改 GPIO0 设置为高电平 将配置为 GPIO0 设置为低电平 编写一个新的脚本、以便他们更改代码、然后构建固件。 其结果是发现与中只有一位变化 0x0201 最终目的 0x0200 ,所以他们想尝试是否可以在他们的应用代码中使用闪存 API 直接更改闪存,以实现这种修改。

因此、我与客户一起进行以下测试:

TEST1:将 0x0201 更改为 0x0200:

我调用的闪存 API 为:   
Fapi_issueProgrammingCommand ((Uint32 *) 0x825e3、&BufferIO、1、0、0、Fapi_Data Only);

步骤 1:在没有闪存 API 的情况下测试 GPIO 切换 — 正常切换 GPIO

步骤 2:在切换 GPIO 之前添加闪存 API Fapi_issueProgrammingCommand、重新编译工程。

第 3 步:可以观察到闪存数据发生变化、但当汇编代码运行到 GPIO 代码时、GPIO 仍然像第 1 步一样切换、没有任何变化。

步骤 4:对电路板进行下电上电、使用 XDS 将电路板连接到 PC、通过 CCS 加载符号、GPIO 代码经确认更改为 0x0200、但 GPIO 仍按步骤 1 切换、没有任何更改。

测试 2:将 0x0201 更改为 0x0000:

执行步骤 1-4、器件将报告 ECC 问题并跳转到非法处理程序。

测试 3:在禁用 ECC 的情况下将 0x0201 更改为 0x0200(由客户测试):

测试结果与 test1 相同。 在我这边、即使我更改 ECC_Enable 字节托 0xB、程序运行时也会返回到 0xA。

测试 4:在禁用 ECC 的情况下将 0x0201 更改为 0x0000(由客户测试):

测试结果与 test2 相同。  在我这边、即使我将 ECC_Enable 字节更改为 0xB、程序运行时也会返回到 0xA。

因此、根据以上测试、问题如下:

  1. ECC 自动校正功能是否会使 GPIO 即使闪存数据已更改、也仍然切换?
  2. 在手动禁用 ECC 的情况下、为什么 ECC 功能和 ECC 错误仍由 MCU 生成?

谢谢

Joe

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

    您好 Joe、

    ECC 模块能够自行纠正一位错误。 这就是 GPIO 不变的原因 — single-bit 更改被视为单个位错误并会被纠正。 在对闪存重新编程时、您必须在对该区域进行重新编程之前将其擦除、以便闪存数据和相应的 ECC 代码都得到更新。

    何时设置 ECC_ENABLE 位? 可能是在器件初始化例程中将其设置回 0xA。 对闪存寄存器的任何修改都应在调用 Flash_initModule () 后完成。

    此致、

    Alex

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

    您好 Alex

    它将在器件初始化例程中设回 0xA。 对闪存寄存器的任何修改都应在调用 Flash_initModule () 后完成。

     在点击“恢复“之前手动更改 ECC_ENABLE 位是有意义的,因此寄存器状态应该由 Flash_initModule () 来纠正,我会在 Flash_initModule () 之后尝试。

    这就是 GPIO 不变的原因 — single-bit 更改被视为 single-bit 错误并被纠正。

    这是否意味着当发生一位错误时、程序根据 ECC 字节执行、但不意味着闪存中的数据?
    但是当我禁用 ECC 时、ECC 会影响程序的执行吗?

    谢谢

    Joe

     

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

    您好 Joe、

    ECC 模块包含 SECDED(单错校正双错检测)逻辑。 由于您只会引起一个位错误、因此从闪存读取的值会自动校正/更改回其初始状态。 禁用 ECC 模块将停止此行为、并将读取新值 0x0200。

    不过、我们不建议以此为解决方案禁用 ECC、理想情况下、客户会擦除整个闪存扇区并对其进行重新编程。

    此致、

    Alex

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

    您好 Alex

    感谢您的支持、我看到了一些有关禁用 ECC 的有趣事项、

    我使用演示:flashapi_ex1_programming、并使用 Flash_disableECC (FLASH0ECC_BASE);若要禁用 ECC、请使用 Fapi_issueProgrammingCommand ((Uint32 *) 0x825ab、&BufferIO、1、 0、0、Fapi_Data Only);用于更改一位闪存。

    如果我将  Flash_disableECC 放在 Flash_initModule 之后并在 ECC.FlashAPI 之前、Example_Call 仍将启用:

    但是,如果我将 Flash_disableECC 放在 ECC.FlashAPI () 之后,则可以禁用 Example_Call :

    这两种操作之间是否有任何差异?

    客户反馈  直接在 Flash_initModule 中将 Flash_enableECC 更改为 Flash_disableECC、也不会正确禁用 ECC。

    谢谢

    Joe

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

    您好 Joe、

    对延迟响应表示歉意。 在 NVM.UsingDataAndECC 和 Example_Program NVM.UsingDataOnlyECCOnly 函数中、Example_Program 会再次调用、这就是该值复位的原因。 您可以删除此调用以保持 ECC 禁用状态。

    此致、

    Alex