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.

[参考译文] TMS570LC4357:VIM ECC 检查

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1006172/tms570lc4357-vim-ecc-check

器件型号:

大家好、团队、

我正在尝试实现 用于中断矢量表 ECC 测试的 ECC 检查机制。 在   ECC 位中手动插入故障、并检查 TRM 中提到的 ESM 功能、如下所示

应使用以下序列将故障注入数据位并测试 ECC 检查功能。
1、在保持 ECCENA 激活的同时、用所需的模式写入 VIM RAM 的数据位置。 。
ECC 位将与数据位一起自动初始化。
2.通过在 ECCCTRL 寄存器中设置 ECCENA=0来禁用 ECC。 在这种模式下、写入数据位不会
自动更新 ECC 位。
3.在这种模式下,可以使用以下任何方法来破坏数据位。
•读取数据位、翻转一位并写回
•读取数据位、翻转2位并写回
4.根据所创建的损坏类型,读回数据位并检查校正错误
(单位错误或双位错误或无错误)。
5、读取 UERRADDR 和 SBERRADDR 寄存器、并检查地址捕获是否正确。

 

问题:

  1. 第一点所需模式的含义是什么?如何选择数据位置? 请提供一个示例
  2. 如何完成数据位的读写操作? 是否使用任何寄存器完成?

我被困在这些位置。请看下面的代码  

 

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* USER CODE BEGIN (0) */
/* USER CODE END */
/* Include Files */
#include "HL_sys_common.h"
/* USER CODE BEGIN (1) */
#include "HL_reg_vim.h"
#include "HL_esm.h"
#include "HL_gio.h"
#include "HL_reg_esm.h"
#include "HL_sys_vim.h"
#include "HL_system.h"
/* USER CODE END */
/** @fn void main(void)
* @brief Application main function
* @note This function is empty by default.
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    写入向量表的数据应是有效的存储器地址。  最好使用虚拟中断处理程序的地址。 如果使用 HALCOGen 生成的代码,则 vimInit()中已初始化 VIM 矢量表。 向量表中大部分位置的地址指向 phpomInterrupt (void)。

    2.直接从内存位置读取/写入数据

      数据= (*(volatile UINT32 *) 0xFFF82000U     -->从 VIM 矢量表中读取第一个字

      ECC = (*(易失性 UINT32 *) 0xFFF82400U     -->从 ECC 空间读取第一个数据

      您可以翻转 ECC 值中的一位:

      ECC ^= 0x1U;

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

    写入向量表的数据应是有效的存储器地址。  最好使用虚拟中断处理程序的地址。 如果使用 HALCOGen 生成的代码,则 vimInit()中已初始化 VIM 矢量表。 向量表中大部分位置的地址指向 phpomInterrupt (void)。

    2.直接从内存位置读取/写入数据

      数据= (*(volatile UINT32 *) 0xFFF82000U     -->从 VIM 矢量表中读取第一个字

      ECC = (*(易失性 UINT32 *) 0xFFF82400U     -->从 ECC 空间读取第一个数据

      您可以翻转 ECC 值中的一位:

      ECC ^= 0x1U;

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

    感谢您的反馈。  

    我的项目要求检查 RAM、闪存和大多数模块的 ECC。 RAM ECC 是否也具有相同的步骤? 我可以在 TMS 中引用哪个模块?

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

    是的、您可以使用相同的方法来测试 RAM ECC。

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

    我已经尝试通过引用 TRM 来实现 RAM ECC 逻辑。

    TRM   的 第8.2.5节仿真/调试模式行为中提到了 RAMOCCUR 和单位纠错阈值的编程。 但 没有可用的寄存器。  

    我也提到   了器    件型号 TMS570LS3137中的函数 checkRAMECC(),其中有诸如 RAMOCCUR、RAMTHRESHOLD 和 RAMINTCTRL 的寄存器。

    另外、还提到 了->导致故障的 L2RAMW 或 ECC 地址在 RAMUERRADDR 寄存器中被捕获。 但 在表8-2中列出的 L2RAMW 模块寄存器下的 TRM 中没有此类寄存器

    halcogen 需要什么配置?
    4.您能简单解释一下我必须执行的 RAM ECC 检查步骤吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RAMUERRADDR 和 RAMOCCUR 不在 TMS570LC43x 器件中使用。 这两个寄存器仅在 TMS570LSx 和 RM4x 器件上可用。

    对于 TMS570LC43x,ECC 在默认情况下处于启用状态,并且不能被禁用。  因此 、您不能简单地关闭 ECC、然后创建不匹配。  有一种替代方法可让您直接写入 ECC 存储器并以此方式造成损坏。

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

    您好!

    生成失配的另一种方法是什么? 在第 L2RAMW 章中、未提供任何步骤。 您能否提供步骤或提及要参考的章节

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

    您好!

    RAM ECC 存储器从0x08400000开始。 ECC 存储器可通过存储器映射的偏移地址直接访问。  写入 ECC 存储器必须是64位对齐的。

    要写入 RAM ECC 存储器、必须将 RAM 控制寄存器(RAMCTRL)的第8位置位:

      l2ramwREG->RAMCTRL |= 1 << 8;

    如果一个单位 ECC 错误发生、那么没有 ESM 标志被置位。 错误地址存储在 EPC 内容寄存器中。  

    例如

    RAM 位置0x08004000的原始内容为0x1234567812345678、0x08404000的 ECC 值为0x8D

    2.启用 ECC 写入:  l2ramwREG->RAMCTRL |= 1 << 8;

    3.通过将0x8c8c8c8c8c8c8c8c8c8c8c 写入0x08404000来翻转 ECC 值的一位  

    4.读取0x08004000。 生成单位 ECC 错误并校正数据。

       

    EPC 寄存器:CAM 索引0的字节0显示条目0被占用、CAM 内容0是错误地址

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

    SECDED 比较逻辑可使用测试模式进行测试。 通过将0xA 写入 ramtest 寄存器来启用测试模式。 数据矢量和 ECC 被编程为 DIAG_DATA_Vector 和 DIAG_ECC。

    请参阅 TRM 的第8.2.6节。

    第一个单位 ECC 错误、RAMERRSTATUS 寄存器的位19和21被置位  

    第一个2位 ECC 错误、RAMERRSTATUS 寄存器的位20和22被置位  

    以下是示例代码:

    /* 1位 ECC 错误*/
    /*将值写入测试向量*/
    l2ramwREG->DIAGDATAVECTOR_L = 0x00000000;
    l2ramwREG->DIAGDATAVECTOR_H = 0x00000000;
    l2ramwREG->DIAG_ECC = 0x0D;//正确的 ECC 为0x0C

    /*启用测试模式*/
    l2ramwREG->ramtest =(2 << 6)|(0xA << 0);

    /*触发测试*/
    l2ramwREG->ramtest =(1 << 8);

    /* 2位 ECC 错误*/
    /*将值写入测试向量*/
    l2ramwREG->DIAGDATAVECTOR_L = 0x00000000;
    l2ramwREG->DIAGDATAVECTOR_H = 0x00000000;
    l2ramwREG->DIAG_ECC = 0x0F;

    /*启用测试模式*/
    l2ramwREG->ramtest =(2 << 6)|(0xA << 0);
    /*触发测试*/
    l2ramwREG->ramtest =(1 << 8);

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

    您好、Wang、

     RAM ECC 单位错误是否报告给 ESM?

    组3通道3是否用于 L2RAMW -双位 ECC 不可纠正的错误? 您能否分享执行此操作的步骤?

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

    如果在将数据写入 SRAM 时出现一位 ECC 错误、该错误将报告给 ESM 组1 (1.26)。