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.
大家好、团队、
我正在尝试实现 用于中断矢量表 ECC 测试的 ECC 检查机制。 在 ECC 位中手动插入故障、并检查 TRM 中提到的 ESM 功能、如下所示
应使用以下序列将故障注入数据位并测试 ECC 检查功能。
1、在保持 ECCENA 激活的同时、用所需的模式写入 VIM RAM 的数据位置。 。
ECC 位将与数据位一起自动初始化。
2.通过在 ECCCTRL 寄存器中设置 ECCENA=0来禁用 ECC。 在这种模式下、写入数据位不会
自动更新 ECC 位。
3.在这种模式下,可以使用以下任何方法来破坏数据位。
•读取数据位、翻转一位并写回
•读取数据位、翻转2位并写回
4.根据所创建的损坏类型,读回数据位并检查校正错误
(单位错误或双位错误或无错误)。
5、读取 UERRADDR 和 SBERRADDR 寄存器、并检查地址捕获是否正确。
问题:
我被困在这些位置。请看下面的代码
/* 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. * * This function is called after startup. * The user can use this function to implement the application. */ /* USER CODE BEGIN (2) */ #define VIM_CHANNEL 20U #define vimRAM ((vimRAM_t *)0xFFF82000U) /* USER CODE END */ int main(void) { /* USER CODE BEGIN (3) */ uint32 index_value; uint32 channel_address; esmInit(); vimInit(); //esmGroup1Notification(esmREG,esmREG->SR1[2]); vimREG->ECCCTL = (uint32)((uint32)0xA << 0U | /* VIM ECC is enabled */ (uint32)0x5 << 8 | /* Enable memory-mapping of ECC bits for read/write operation */ (uint32)0xA << 16 | /* Enable correction of SBE detected by the SECDED block */ (uint32)0xA << 24); /* Enable Error Event upon detection of SBE the Interrupt Vector Table */ //Result after bitwise operation : 1010 0000 1010 0000 0101 0000 1010 //Read 32 bit volatile register index_value = vimREG->IRQINDEX;
写入向量表的数据应是有效的存储器地址。 最好使用虚拟中断处理程序的地址。 如果使用 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 中没有此类寄存器
您好!
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)。