主题中讨论的其他器件: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 的问题。
提前非常感谢!