尊敬的 TI 员工:
我正在执行一个例程来验证 RAM 的 ECC 模块是否正常工作。 我遇到单个校正错误计数器的问题、该错误计数器不会递增... 您可以查看我的以下代码并提出建议吗? 在观察窗口中、CCETRES 被正确设置为4、 当测试模式被禁用时、gRAMTestL0..3被正确地位翻转、然后被纠正回0。
#define DEFAULT_ECC_ERROR_THRESHOLD 4.
#pragma DATA_SECTION (gRAMTestL0、"RAMTestL0File");
volatile uint32_t gRAMTestL0;
#pragma DATA_SECTION (gRAMTestL1、"RAMTestL1File");
volatile uint32_t gRAMTestL1;
#pragma DATA_SECTION (gRAMTestL2、"RAMTestL2File");
volatile uint32_t gRAMTestL2;
#pragma DATA_SECTION (gRAMTestL3、"RAMTestL3File");
volatile uint32_t gRAMTestL3;
void enableRamECC (){
EALLOW;
RAMErrRegs.CCETRES = DEFAULT_ECC_ERROR_THRESHOLD; //错误阈值
RAMErrRegs.CCEIE.bit.C28CEIE = 1; //设置 CCEFLG 标志时会生成可纠正的错误中断。
EDIS;
}
systemControlError_t RAMSelfTest (void){
enableRamecc();
EALLOW;
//初始化 RAM 以进行自检。 相应地写入0x0数据和相应的 ECC/奇偶校验位。
RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L0 = 1;
while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L0);
RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L1 = 1;
while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L1);
RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L2 = 1;
while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L2);
RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L3 = 1;
while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L3);
EDIS;
// ECC 错误计数器应为0
if (RAMErrRegs.CCECNTR){
返回 ECC_RAM_ERRCNTR_FAILURE;
}
//应清除 ECC 错误标志。
if (RAMErrRegs.CCEFLG.bit.C28CEFLAG){
返回 ECC_RAM_CEFLAG_FAILURE;
}
//启用 RAM 测试模式(第5.1.1.8节),禁用奇偶校验/ECC 测试
EALLOW;
RAMRegs.CLxRTESTINIT1.bit.ECPARTEST_L0 = 1;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 1;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L2 = 1;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L3 = 1;
EDIS;
//准备错误... 翻转一位以产生可纠正的错误。
//在 RAM 测试模式中,只更新数据,而不是 ECC。
//因此,当测试模式关闭时,ECC 模块应该捕获这些错误。
gRAMTestL0 ^= 0x1;
gRAMTestL1 ^= 0x1;
gRAMTestL2 ^= 0x1;
gRAMTestL3 ^= 0x1;
EALLOW;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L0 = 0;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 0;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L2 = 0;
RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L3 = 0;
EDIS;
//清除 CCEFLG
EALLOW;
RAMErrRegs.CCECLR.bit.C28CECLR = 1;
EDIS;
if (gRAMTestL0 || gRAMTestL1 || gRAMTestL2 || gRAMTestL3){
返回 ECC_RAM_FAILURE;
}
返回 NO_ERROR;
}
我的命令文件:
RAMTestL0文件 :> RAML0, PAGE = 0
RAMTestL1文件 :> RAML1, PAGE = 0
RAMTestL2文件 :> RAML2, PAGE = 0
RAMTestL3文件 :> RAML3, PAGE = 0
(笑声) 可有效地将变量放置在预期的存储器组中(通过存储器浏览器验证)。