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.

[参考译文] TMS570LS0432:TMS570 ECC 检测检查

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/774876/tms570ls0432-tms570-ecc-detection-check

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

您好、TI 团队、

 

我知道与 ECC 相关的论坛上有很多主题、但遗憾的是、我无法找到我的一些问题的答案、希望您能提供帮助。

在 OUT 应用程序内、我们希望在发生单个位错误时定期检查是否触发了 RAM 和闪存的 SECDED。

没有中断、没有地址检索(当前)、只需检查、是单个位翻转还是自上次检查以来没有。

在这里、我想根据 TRM、应用手册和 HalCoGen 等的代码、提供我的想法

首先、如果我想检查是否触发了 ECC 1位错误、我执行以下 TCRAM1/2配置:

ECC_DETK_EN = 0xA

RAMOCCUR = 0

RAMTHRESHOLD = 1.

RAMINTCTRL.SERR_EN = 1.

问题1:上述配置是否完整定义并正确监控 BTCM 的 SECDED 触发(1位)?

我通过以下方式进行监控(寄存器名称有点不同、但可识别、我想;代码仅用于 TCRAM1、因为使用了 TCRAM2其他寄存器并使用了其他 ESM 通道):

/*检查在最后一个帧期间 SECDED 是否在 TCRAM1 (B0TCM)内触发*/
if ((TcRam1Regs_G.RAMERRSTATUS.bit.lSERR EQU (uint32_t) 1U)或
(((uint32_t)((EsmRegs_G.lESMSR1 >>(uint32_t) shift_26_bits_C)和(uint32_t) 1U) EQU (uint32_t) 1U)
){

/*在 B0TCM 的最后一个帧期间触发 SECDED */
(笑声)

/*清除 RAMOCUUR 以计算后续单位错误校正的数量*/
TcRam1Regs_G.RAMOCCUR.bit.lSEO =(uint32_t) 0U;

/*清除 SERR 标志*/
TcRam1Regs_G.RAMERRSTATUS.bit.lSERR =(uint32_t) 1U;

/*清除 ESM 组1通道26标志*/
EsmRegs_G.lESMSR1 ||(uint32_t)((uint32_t) 1U <<(uint32_t) shift_26_bits_C);
} 

问题2:请确认 ECC (1位错误事件)可与上述代码一同查询、并且处理正确。

问题3:我是否也认为在上述代码的下一次调用中,我们能够捕获新的1位错误(如果确实出现:)?

问题4:我需要读取错误地址以捕获下一个错误事件还是执行其他一些处理?

现在、让我们继续闪存检查。 这里更复杂、因为我感觉 TRM 中存在一些拼写错误。

首先、为了监控1位错误、我已经按照如下方式配置包装程序:

FEDACCTRL1.EDACEN = 0xA

FEDACCTRL1.EOFEN = 1.

FEDACCTRL1.EZFEN = 1

FEDACCTRL1.EDACMODE = 0xA

问题5:请确认上面定义的配置是否完整且正确、是否可用于1位错误监控(检查是否发生了事件、是否发生了1次或100万次、无关紧要)?

现在、这里是事件发生检查代码本身:

IF (((FlashRegs_G.FEDASTATUS.bit.lERR_zero_FLG EQU (uint32_t) 1U)或
(FlashRegs_G.FEDASTATUS.bit.lERR_One_FLG EQU (uint32_t) 1U)或
(FlashRegs_G.FEDASTATUS.bit.lB2_COR_ERR EQU (uint32_t) 1U)或
(((uint32_t)((EsmRegs_G.lESMSR1 >>(uint32_t) shift_6_bits_C)和(uint32_t) 1U) EQU (uint32_t) 1U)
){
/*在 ATCM 的最后一个帧期间触发 SECDED *
(笑声)

/*清除单位错误标志*/
FlashRegs_G.FEDASTATUS.bit.lERR_zero_FLG =(uint32_t) 1U;
FlashRegs_G.FEDASTATUS.bit.lERR_One_FLG =(uint32_t) 1U;
FlashRegs_G.FEDASTATUS.bit.lB2_COR_ERR =(uint32_t) 1U;

/*清除 ESM 组1通道6标志*/
EsmRegs_G.lESMSR1 =(uint32_t) 1U << shift_6_bits_C;
} 

问题6:请确认上面的代码足以检查是否发生了1位错误事件?

问题7:我是否也正确、在上述代码的下一次调用中、我们能够捕获新的1位错误发生?

问题8:我需要读取错误地址以捕获下一个错误事件还是执行其他一些处理?

问题9:对于我来说、TRM 并不完全清楚为什么 ERR_One_FLG 的描述仅适用于 Bus2。

我认为对于诸如"whera 1 readas a 0"之类的 Bus1事件也适用、不适用?

ERR_zero_FLG 根据 TRM 适用于总线1和总线2。 这两个寄存器的真相是什么?

问题10:我是否需要检查 B2_COR_ERR 或检查是否超出范围? 总线2上发生 ECC 错误的其他指示器(ESM 除外)是什么?

问题11:如果由于总线1数据错误而设置了 ERR_Oe_FLG 和/或 ERR_ZERO _FLG、是否会触发 B2_COR_ERR?

我知道有很多问题、但我认为这些信息不仅对我有用、因为我看到有很多关于 ECC 的问题。

提前非常感谢!

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

    您好 Dmitry、

    首先、您需要启用 CPU 事件导出。 默认情况下、此机制处于禁用状态。 您可以调用 HALCoGen 生成的函数(_coreEnableEventBusExport_())来启用它、也可以将 PMNC PMU 寄存器的位4设置为启用。

    其次、应启用 RAM ECC。 这可以通过设置 ARM 辅助控制寄存器的位27和位26来完成、或者通过调用 HALCoGen 生成的函数_coreEnableRamEcc_()来完成。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题1:设置 ECC_DETK_EN 位将启用 ECC 检测、并在发生任何错误时生成 ECC 错误标志。 您是对的、可以设置 ECC 错误中断的阈值。

    问题2:您的函数能够检查状态:RAMERRSTATUS 的位0、以及 ESM 组1的位28和位26

    问题3:出于监控目的、如果错误发生、则会触发中断。 出于诊断目的、您将在第2次通话中不会收到错误。 如果您想获得相同的错误、请更改错误地址。

    问题4:要生成两次错误、您需要使用不同的地址。 你是对的。 要获得 ECC 错误、您需要从 SRAM 读取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题5:您需要通过调用_coreEnableFlashEcc_()或设置 ARM 辅助控制寄存器的位25来启用闪存 ECC。
    FEDACCTRL1.EDACEN = 0xA
    FEDACCTRL1.EOFEN = 1.
    FEDACCTRL1.EZFEN = 1
    FEDACCTRL1.EDACMODE = 0xA

    这些设置足以启用闪存包装程序内的 ECC 逻辑。

    问题6:您的内核将检查总线2可纠正错误(位16)、ERR_zero_FLG (位1)和 ERR_zero_FLG (位2)的错误标志、并检查 ESM 组1上的 FMC 可纠正错误(总线1和总线2接口)。 代码可用于轮询 ECC 错误。

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

    您好 QJ、

    非常感谢您的回答。

    如果您不介意、我想澄清几个问题:

    问题3、4:我不会更改错误的地址:)创建此监控代码是为了监控实际错误,而不是综合错误。

    同时、对于我们的架构、除了用于基于 RTI 的组帧的主中断外、我们不能有任何其他中断。

    因此、我们只需监控自上次检查以来是否发生了错误。 我知道由于 HEC、我无法在与前一个地址相同的地址检测到错误。

    我的问题是:是否需要在发生错误后读取 RAMSERRADDR 才能检测到不同地址的新错误? 或者是否不需要此步骤。

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

    下面是一些有关闪存的附加澄清问题:
    问题6:这些位 ERR_Zero_FLG (位1)和 ERR_Zero_FLG (位2)是否适用于总线1、总线2或两者? 在 TRM 中、有一些组合、我无法理解。
    问题7:正如我在上面提到的、除了组帧之外、我们的应用程序中禁止使用其他中断。 只能通过定期轮询来检查 ECC 1位故障。
    问题8:与 RAM 问题相同的问题是、代码检测到 ECC 1位错误时、我是否需要立即读取 FCOR_ERR_ADD/FCOR_ERR_POS?
    对我来说、地址本身并不重要、问题是我是否只为了正确检测上述代码标志中的下一个可能的1位错误而需要读取它? 仅为了澄清、如果出现任何新错误、我再次不需要知道其地址、而只是错误事实。

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

    尊敬的 TI 支持团队:

    您对我的上述问题是否有任何信息?

    谢谢

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

    闪存包装程序有两条总线、总线1和总线2。 总线1被 CPU 用来访问闪存的正常扇区、程序和数据被存储在这些扇区中。 CPU 将使用总线2来访问 OTP 扇区、EEPROM 仿真闪存组。 当 CPU 通过总线1访问程序和数据时、CPU 的内置 SECDED 逻辑将执行 ECC 检查。 请注意、这个 ECC 逻辑位于 CPU 内部、而不是闪存包装程序内部。 当 CPU 通过总线2访问 EEPROM 组或 OTP 扇区时、ECC 检查在闪存包装程序内完成。 原因是连接到闪存存储器系统总线2的 CPU 2级接口(AXI-M 总线)没有 ECC 检查功能。 因此、闪存包装程序有其自身的 ECC 逻辑、仅用于总线2访问。

    ERR_zero_FLG (位1)和 ERR_zero_FLG (位2)适用于总线1和总线2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    很抱歉耽误您的回答、感谢您提供如此描述的答案。

    现在,对我来说一切都很清楚,正式的话题可能会结束。

    我这边只需要另外一个好处、或许可以通知 TI 的某个人、最好在 spnu517内更新 ERR_zero_FLG 和 ERR_zero_FLG 字段的说明。

    目前、根据描述、可以认为这些标志中的一个甚至两个都只适用于总线2、