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**** 1791630 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1392934/tms570ls3137-flash-ecc

器件型号:TMS570LS3137
主题中讨论的其他器件: HALCOGEN

工具与软件:

您好!

我正在开发用于航空电子的安全项目、并且我正在使用 TMS570LS3137。 我的 IDE 是 CCS。 我在评估板上尝试了 ECC 功能、 我已经过测试、检查了 RAM ECC 功能。 它工作正常、我在调试模式下观察到。

现在、我想尝试闪存 ECC。 首先、我想说明我正在使用 HALCOGEN、而在 halcogen 上启用了闪存 ECC。 比我观察到的 sys_startup.c 被称为 checkFlashECC()函数。 这里没有问题。

但我无法理解如何更改闪存上的任何位。 我认为我需要更改闪存和 ECC 闪存校验器中的任何位、应该会检测到位正在更改并运行错误中断。 请更正此情形中的问题。

您可以查看下面的 checkFlashECC()函数。

void checkFlashECC (void)

/*检查 CPU 内部 ECC 逻辑的操作以便访问程序闪存的例程*/
Volatile UINT32 flashread = 0u;

/*用户代码 begin (40)*/
/*用户代码结束*/

/*启用闪存模块 ECC 响应*/
flashWREG->FEDACCTRL1 = 0x000A060AU;

_coreEnableFlashEcc_();

/*启用诊断模式并选择诊断模式7 */
flashWREG->FDIAGCTRL = 0x00050007U;

/*选择 ECC 诊断模式、将被损坏的单一位*/
flashWREG->FPAROVR = 0x00005A01U;

/*设置诊断模式的触发器*/
flashWREG->FDIAGCTRL |= 0x01000000U;

/*从镜像存储器映射中读取闪存位置*/
flashread = flashBadECC1;

/*禁用诊断模式*/
flashWREG->FDIAGCTRL = 0x000A0007U;

/*这将导致由 CPU 生成和更正一个 single-bit 错误*/
/*未在闪存模块中捕获 single-bit 错误*/
/* SAFETYMCUSW 139 S MR:13.7. "硬件状态位读取检查"*/
如果((flashWREG->FEDASTATUS & 0x2U)=0U)

selftestFailNotification (CHECKFLASHECC_FAIL1);
}
设计

/*清除单位错误标志*/
flashWREG->FEDACSTATUS = 0x2U; //通过向该寄存器提供值2、我们如何清除该位?

/*清除 ESM 标志*/
esmREG->SR1[0U]= 0x40U;

/*启用诊断模式并选择诊断模式7 */
flashWREG->FDIAGCTRL = 0x00050007U;

/*选择 ECC 诊断模式、将损坏两位 ECC */
flashWREG->FPAROVR = 0x00005A03U;

/*设置诊断模式的触发器*/
flashWREG->FDIAGCTRL |= 0x01000000U;

/*从闪存位置从镜像存储器映射中读取这将导致数据中止*/
flashread = flashBadECC2;

/*读取 FUNCHERRADD 寄存器*/
flashread = flashWREG->FUNCHERRADD;

/*禁用诊断模式*/
flashWREG->FDIAGCTRL = 0x000A0007U;
}

/*用户代码 begin (41)*/
/*用户代码结束*/
}

我是否需要用于检查闪存 ECC 的额外函数或代码? 此函数在 sys_starup.c 中运行、因此它在 main 之前运行、但我在无穷循环中调用了此函数。 但没有任何变化、所以不起作用。


此外、您可以为该 MCU (F021)建议使用 flashECC 测试代码吗?

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

    尊敬的 Muhammet:

    您可以从以下链接找到并下载 Hercules Safe TI 诊断库:

    SAFETI_DIAG_LIB 驱动程序或库| TI.com

    该库包括用于 Hercules 控制器中可能的各种诊断例程的代码。

    下载后、您可以打开用户指南并搜索闪存的 ECC 错误例程

    您可以获得闪存 ECC 错误例程的结果。

    现在将控制器的诊断代码导入 CCS

    在这里、您可以搜索和访问与相应错误诊断相关的代码:

    您可以看到、下面是在闪存中创建 single-bit 错误的代码、类似地、您可以找到所需的所有例程。

    ——
    谢谢、此致、
    Jagadish。

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

    感谢您的支持、

    但我仍然不明白如何实现用于该闪存 ECC 的主代码  

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

    尊敬的 Muhammet:

    您只需执行另外一项操作:

    在 HALCoGen 中、选中"Enable Flash ECC Check"复选框

    如果您启用此选项、则将在代码中生成"checkFlashECC"函数。

    在上电复位后、将在 startup.c 文件中调用该函数来测试闪存 ECC:

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我在 HALCOGEN 上生成了闪存 ECC 代码。 但你知道, checkFlashECC()函数在 startup.c.中调用  

     我有几个问号、您能回答一下吗?

    1.我认为这不足以只在 startup.c 中调用这个函数 因为我们不应该在 main 的无限循环中调用该函数呢?

    2.我不明白如何结合和测试 checkFlashECC 函数与安全库创建的代码。
    您能更清楚地说明这一点吗?

    3.在 checkFlashECC 函数中有一条 if 语句可以检查 FEDACSTATUS 寄存器。 当闪存上有1位错误时、此 if 语句将我们定向至空的中断函数(selftestFailNotification)。 我应该在这个函数中做什么?
    我还看到、这一 if 语句无论如何都不符合条件。 您可以对此提供建议或评论如何测试此项。

    4. checkFlashECC 函数内部有如下操作。 当我们在 FEDASTATUS 寄存器中设置2时、我们会设置 ERR_ZERO_FLG 位、但这里没有复位操作。 您能解释一下吗?
    flashWREG->FEDACSTATUS = 0x2U;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1. 我想这不足以只在 startup.c 中调用这个函数 因为我们不应该在 main 的无限循环中调用该函数?[/QUOT]

    这只是应用要求。

    可以、如果您希望、可以根据您的应用要求以一定的频率调用此函数。

    2. 我不知道如何将 checkFlashECC 函数与从安全库创建的代码结合在一起并进行测试。
    您能否更清楚地了解这一点?

    如果您从 HALCoGen 生成代码以测试闪存 ECC、则无需包含用于闪存 ECC 测试的安全库代码。

    3. checkFlashECC 函数中有一条 if 语句、用于检查 FEDASTATUS 寄存器。 当闪存上有1位错误时、此 if 语句将我们定向至空的中断函数(selftestFailNotification)。 我应该在这个函数中做些什么?

    它还是用户要求、

    我是说、可以重置控制器、也可以执行一些日志并根据日志执行操作。

    4. checkFlashECC 函数内有一个如下的操作。 当我们在 FEDASTATUS 寄存器中设置2时、我们会设置 ERR_ZERO_FLG 位、但这里没有复位操作。 您还能解释一下吗?

    我们可以进行软件复位;这只是应用要求。

    ——
    谢谢、此致、
    Jagadish。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jagadish gundavapu 说:
    如果您从 HALCoGen 生成代码以测试闪存 ECC、则无需包含用于闪存 ECC 测试的安全库代码。
    我已经从 HALCoGen 生成了闪存或 RAM ECC 代码。 但是、如何验证校正闪存或 RAM? 我可以 在调试中测试 ECC 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想在调试会话中更改闪存或 RAM 的任何变量、并想观察中断调用。 有可能吗? 您能给我介绍一个这样的场景吗?我需要以某种方式验证 checkFlashECC 和 checkRAMECC ()函数,并看到处理器实际上纠正或检测到该位。

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

    尊敬的 Mahammet:

    对于 RAM、您可以轻松地使用变量。 但对于闪存、我们无法轻松更改存储器内容、因此我们使用诊断寄存器。使用这些诊断寄存器、我们可以在闪存中创建与 ECC 相关的故障、并可以尝试。

     要了解该过程、请参阅 checkFlashECC 例程和 TRM 的以下部分。

    此外、您还可以查看以下主题:

    (+) TMS570LS1224:FEE ECC 自检触发 ESM 通知-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    我们在此测试了闪存 FEE 区域的 ECC 错误。

    ——
    谢谢、此致、
    Jagadish。

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

    首先、我检查了 RAM ECC。 我仔细地扫描了 checkRAMECC()函数、我想我已经得到了。
    我发现 checkRAMECC()仅检查两个 RAM 地址的一位和两位错误。
    是否有一种一次性检查 RAM 中所有地址的简单方法、或者我是否必须从地址0x088400000开始并使用到地址0x0803FFFF 的循环来检查它?

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

    尊敬的 Muhammet:

    [报价 userid="579927" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1392934/tms570ls3137-flash-ecc/5342133 #5342133"]是否有一种简单方法可以一次性检查 RAM 中的所有地址或者我是否必须从地址0x08400000开始并使用到地址0x0803FFFF 的循环来检查它?

    无需测试整个 RAM、因为如果 RAM 的数据或 ECC 区域中的任何特定区域发生任何问题、那么每当您在后台读取该区域时、都会发生 ECC 验证、显然 ECC 将失败。 您将收到基于区域的 single-bit 错误或 double-bit 错误。

    因此、没有必要为 RAM 的所有位置创建 ECC 错误、即使您希望这样做、也没有任何其他简单的方法可以满足所有位置的相同步骤。

    ——
    谢谢、此致、
    Jagadish。

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

    我想我明白了。 我知道 checkRAMECC()函数用于测试使用的 ECC RAM 地址。 因此我无需检查所有 ECC RAM 地址。
    你认为我需要在无限循环中调用 checkRAMECC()函数吗? 我认为也没有必要这样做。 您能否确认这一点?

    我检测到了其他情况。 下面是一个由 Halcogen 生成的 checkRAMECC()函数。 我在该函数中注释掉了生成代码片段时出现的一位错误(代码图的2046年代码行)。 但是、下面生成代码的两位错误仍在执行(代码图中的第2084行和第2085行)。 所以我将在 ECC RAM 中生成一个2位错误。 当出现两位错误时、我无法生成中断。 您可以帮助解决此问题吗?

    注意:通过 Halcogen 设置的配置如下所示。

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

    尊敬的 Muhammet:

    您觉得我需要在无限循环中调用 checkRAMECC()函数吗? 我认为也没有必要这样做。 您能否确认这一点?

    是的、也没有必要这样做。

    出现两位错误时无法生成中断。 您能对此提供帮助吗?

    我将检查此值并对您进行更新。

    ——
    谢谢、此致、
    Jagdish。

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

    你好、jagadish

    我扫描了数据表、发现了两位错误的详细信息、如下所示;

    "你说什么?

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

    尊敬的 Muhammet:

    这是一个有趣的发现、

    那么、您是否可以尝试使用 SCI 并将数据发送到 COM 端口? 我的意思是、如果代码进入中断、那么通过 SCI 作为指示器发送数据。 通过这种方法、我们可以在不使用调试模式的情况下确定中断是否生成。

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

    我在 SCI 上尝试过、但失败了。 当我仅强制执行 single-bit 错误时、我观察到进入了 ESM1通道26和28个中断。 但是、我通过对单个位错误强制执行进行注释并仅生成双位错误、同时注释 ECC RAM 调节器件并产生未校正的错误、强制执行 ESM2通道6和通道8中断、但失败了。

    我把下面的代码留给你的评论,请引导我。
    可能、我犯了一个错误、创建了不可纠正的错误。 您能给我讲一讲这一点吗?

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

    尊敬的 Muhammet:

    我需要一些时间在我结束时测试这一点,平均时间你可以做以下的事情:

    我想过去对于 CAN-RAM、我们还面临着类似的问题、

    (+) TMS570LC4357:CAN ECC 单位自检在 CAN ECC CS 寄存器中设置 DEFLG 而不是 SEFLG -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    您能验证一次以上线程中给出的权变措施吗?

    ——

    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我尝试了您提到的建议、即 TCRAM 自动初始化。

    应用自动初始化后、我强制出现双位错误、然后读取它调用 ESM 组3通道3和通道5的地址。(dabort.asm)。之后、当代码进入自动初始化行时、双位错误会自动校正。

    在应用自动初始化前 、我强制出现双位错误、然后读取它在哪里调用 ESM 组3通道3和通道5的地址。(dabort.asm)、在这个地址之后 它在 dabort.asm 中被称为无穷循环

    我所需要的就是将其定向到低电平中断或高电平中断、就像在单个位错误中那样。 但是、正如我告诉过您的、在双位错误中、ESM 调用组3。 不是不是在双位错误中重定向到 ESM 组1或者组2错误吗?

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

    尊敬的 Muhammet:

    很抱歉我的答复出现延误。

    确切地说、我需要的是将它指向低电平中断或高电平中断、就像出现一位错误一样。 但是、正如我告诉过您的、在双位错误中、ESM 调用组3。 不能重定向到双位错误中的 ESM 组1或组2错误吗?[/QUOT]

    SRAM 或 TCRAM 中不可纠正的 ECC 错误将一直只生成组3 (通道3和/或通道5)错误。

    有关更多详细信息、另请参阅以下主题:

    (+) TMS570LS0432:不可纠正的存储器错误的 ESM 组2和组3 -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    重要的是、具有高严重性的组3错误不会生成中断、它们将始终在错误引脚上生成低级别来指示此错误。 请参阅以下有关 TRM 的重点部分:

    根据我的理解、不为不可纠正的错误提供中断的原因是、

    如果闪存或 RAM 中存在不可纠正的错误、则我们无法保证正确的代码执行;如果我们执行具有不可纠正错误的代码、则意味着这些错误有时会导致中止、因此我们无法保证对组3错误具有正确的中断。

    因此、不能将组3错误重定向至中断处理程序。

    ——
    谢谢、此致、
    Jagadish。

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

    感谢您的答复。


    但是、如下面所示、它在不可纠正的错误中也显示为 Group2。 我想知道为什么没有发生这种情况。

    我遇到的另一个问题是 ESM Gropu3错误是否优先于组2?

    我还想指出、当我在 ECC RAM 中发生不可纠正的 double-bit 错误时、该错误将进入 abort.asm、完成所有操作、并且代码从中断的位置继续。 换句话说、虽然 ECC RAM 中存在双位错误、但代码会在运行时继续执行其任务。 但是、ECC RAM 中仍然存在错误。 我们只能在调试中注意到这一点。
    想象一下、在运行时无法注意到这一点。 这就是我认为它应该会生成一个中断的原因。 我已经理解应该在上面分享的映像中激活组2 ESM。 如果我想错了、请引导我。

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

    我从您提供的链接中了解组2和组3之间的区别。 那么、当发生不可纠正的 double-bit 错误时、如何识别它。 现在、它将重定向到 abort.asm 函数、并且在函数完成后代码继续在无限循环中运行。 但我可以在调试中看到 ECC 中有一个永久性错误。

    您能指导我解决这个问题吗?

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

    尊敬的 Muhammet:

    如果发生 Group3错误或不可纠正的错误、我们不能保证代码执行正确、对吗?

    我们可以使用 ERROR 引脚状态寄存器和 ESMSR3寄存器来识别组3错误:

    我们如何对这个组3错误采取行动、因为我们不能保证操作代码没有任何不可纠正的错误、有时这个代码也可以不可纠正的错误?

    因此、这就是客户使用外部显示器的原因:

    (+) TMS570LS1224:TMS570LS -出现 nERROR 时复位-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛 

    该外部监测器可以监测 nERROR 信号、并在发生任何不可纠正的错误时将控制器复位。

    ——
    谢谢、此致、
    Jagadish。