请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:RM48L530 主题中讨论的其他器件: TMS570LS20216
器件:RM48L530
IDE:IAR 8.11.3.13984
编译器:IAR 8.11.3.13950
操作系统:Sciopta 1.9.15.10
您好!
我正在尝试在 RM48上实施 RAM ECC 的故障插入测试、并在为 TMS570LS20216提供的测试之后对我的解决方案进行了建模。 当读回 tcram1位时、RAMOCCUR 不会递增、因此不会发生错误处理。 我在下面添加了我的实施。 请有人解释这种行为吗? 谢谢你。
#ifndef __FI_RAM_ECC_CHECK_H__ #define __FI_RAM_ECC_CHECK_H__ #include #ifdef __cplusplus extern "C"{ #endif #define tcram1REG ((tcramBASE-t *)(0xFFFFFF800U) )#define tcram2REG ((tcramBASE-t *)(0xFFFFFF900U) )#define tcram1bit (*(unsigned int *) 0x08000000) #define tcram2bit (*(unsigned int *) 0x08000008) #define tcram1bitError (*(unsigned int *) 0x08400000) #define tcram2bitError (*(unsigned int *) 0x08400008) #define TCRAM_RAMCTRL_ECCWREN (Ucr32_t)(1U <<8u) /* Tcram/ @ *框架@ 定义*每个 TCRAM 帧/框架的定义* TRL * TRL_ECTCRAM 帧/ TRL 定义* TRL * TRL * TRF_ECCWREN (Utram.t)(Utram/TcrRAM)*框架 // /**@typedef tcramBASE-t *@简短的 TCRAM 包装器寄存器帧类型定义 * 此类型用于访问 TCRAM 包装器寄存器。 */ typedef volatile struct tcramBase { uint32_t RAMCTRL;/* 0x0000 */ uint32_t RAMTHRESHOLD; /* 0x0004 */ uint32_t RAMOCCUR;/* 0x0008 */ uint32_t RAMINTCTRL;/* 0x000C */ uint32_t RAMERRSTATUS;/* 0x0010 */ uint32_t RAMSERRADDR;/* 0x0014 */ uint32_t rsvd1;/* 0x0018 */ uint32_t RAMUERRADDR;// 0x001C */ uint32_t rsvd2[4U];/* 0x0020 */ uint32_t ramtest;/* 0x0030 */ uint32_t rsvd3;/* 0x0034 */ uint32_t RAMADDECVECT;/* 0x0038 */ uint32_t RAMPERADDR; /* 0x003C *} tcramBASE-t; typedef 枚举 { 正确、 检测 } ECCAction; void FI_CheckRAMECC (ECCAction testType); #endif #ifdef __cplusplus } #endif
#include "ram_ecc_check.h" #include "flexconn_interface.h" void FI_CheckRAMECC (ECCAction testType) { volatile uint64_t u64_RamRead = 0; /*对后续捕获的错误地址进行读解锁*/ u64_RamRead = tcram1REG->RAMUERRADDR; u64_RamRead = tcram2REG->RAMUERRADDR; /*启用对 ECC RAM 的写入*/ (tcram1REG->RAMCTRL)|=(TCRAM_RAMCTRL_ECCWREN); (tcram2REG->RAMCTRL)|=(TCRAM_RAMCTRL_ECCWREN); switch (testType) { 大小写正确: /*在设置值之前清除 RAMOCCUR */ tcram1REG->RAMOCCUR=0U; tcram2REG->RAMOCCUR=0U; /*将 RAMTHRESHOLD 设置为1 */ tcram1REG->RAMTHRESHOLD = 1U; tcram2REG->RAMTHRESHOLD = 1U; /*允许向 ESM 报告错误*/ tcram1REG->RAMINTCTRL = 0x01; tcram2REG->RAMINTCTRL = 0x01; /*导致1位 ECC 错误*/ tcram1bitError ^= 0x01; /*恢复 Ctrl 寄存器*/ tcram1REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN; tcram2REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN; /*从相应的 RAM 位置读取*/ u64_RamRead = tcram1bit; /*检查记录的错误*/ 如果(!((tcram1REG->RAMERRSTATUS & 1)||(tcram2REG->RAMERRSTATUS & 1))) { FC_ErrorHandler (RAM_ERROR); } 其他 { tcram1REG->RAMERRSTATUS = 0x1;//清除 SERR 标志 tcram2REG->RAMERRSTATUS = 0x1; } 中断; 外壳检测: /*导致2位 ECC 错误*/ tcram2bitError ^= 0x03; /*恢复 Ctrl 寄存器*/ tcram1REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN; tcram2REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN; /*从相应的 RAM 位置读取*/ u64_RamRead = tcram2bit; 中断; 默认值: 中断; } }