您好!
我正在编写 RAM 上各种 ECC 相关错误的测试用例。 首先、我使用的是 RAML1。 我可以看到、一旦关闭测试模式、所有的单个位都会被纠正。 但我看不到 RAMErrRegs 上的错误地址或计数器增量。 此外、我是否应该接收一个单个位错误中断? 如果是、您能告诉我是否缺少任何重要的初始化步骤?
我在 TRM 上发现了一条注释、提示"调试访问期间(RD/WR)可纠正和不可纠正的错误被屏蔽"。 这是我在纠正单个位错误期间看不到任何寄存器更新的原因吗?
初始化:
…
InitPieVectTable();
EALLOW;
//PieVectTable.TINT0 =&CPU_timer0_ISR;
PieVectTable.CFLSINGERR =单位 ISR;
PieVectTable.NMI =不正确的 NMIErrorISR (&U);
PieVectTable.CRAMSINGERR =斜升位错误(ramSingleBitError);
PieVectTable.ILLEGALISR =&illegalISR;
EDIS;
EALLOW;
NmiIntruptRegs.NMIFLGCLR.ALL = 0xFFFF;
NmiIntertRegs.NMICFG.bit.NMIEN = 1;
EDIS;
//在 PIE 中启用单个位错误:组12中断2
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;
PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//启用 PIE 组12 INT4 (RAM 单错误)
PieCtrlRegs.PIEACK.all = M_INT12;//启用 PIE 中的嵌套
asm (" NOP");//等待 PIEACK 退出流水线参考 使用说明勘误表 SPRZ272H
IER |= M_INT12;
//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//example_CallFlashAPI();
RAM_ECCSelftest();
===========================================================================================================================================
#ifdef __TI_Compiler_version__ #if __TI_Compiler_version__>=15009000 #pragma CODE_SECTION (RAM_ECCSelftest、".TI.ramfunc"); #pragma CODE_SECTION (ramSingleBitError、".TI.ramfunc"); #pragma CODE_SECTION (illegalISR、".TI.ramfunc"); 其他 #pragma CODE_SECTION (RAM_ECCSelftest、"ramfuncs"); #pragma CODE_SECTION (ramSingleBitError、"ramfuncs"); #pragma CODE_SECTION (illegalISR、"ramfunc"); #endif #endif #pragma DATA_SECTION (gRAMTest1L1、"RAMTestL1File"); #pragma DATA_SECTION (gRAMTest2L1、"RAMTestL1File"); volatile UINT32_t gRAMTest1L1; 易失性 uint32_t gRAMTest2L1; uint16_t ramSingleBitErrorISRTaken; void RAM_ECCSelftest (void) { //启用 RAM ECC EALLOW; RAMErrRegs.CCETRES = 4;//错误阈值 RAMErrs.CCEIE.bit.C28CEIE = 1;//当 CCEFLG 标志被置位时、会生成可纠正的错误中断。 EDIS; EALLOW; //通过将所有数据和 ECC/奇偶校验位写为0来初始化 RAM 以进行自检。 RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L1 = 1; //轮询 RINITDONE 寄存器中 RAM 块的 RAMINITDONE 位是否被置位 while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L1); EDIS; // ECC 错误计数器应为0 if (RAMErrRegs.CCECNTR){ return;//ecc_RAM_ERRCNTR_FAILURE; } //应清除 ECC 错误标志。 if (RAMErrRegs.CCEFLG.bit.C28CEFLAG){ return;//ecc_RAM_CEFLAG_FAILURE; } //如第5.1.1.8节中的菜单所示启用 RAM 测试模式 EALLOW; RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 1; EDIS; //翻转一位以创建可纠正的错误。 gRAMTest1L1 ^= 0x1; gRAMTest2L1 ^= 0x1; //现在,关闭 RAM 控制模块的测试模式以捕获错误 EALLOW; RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 0; EDIS; uint32_t errorRegister = RAMErrRegs.CCPUCREADDR; uint32_t errorCount = RAMErrRegs.CCECNTR; while (!ramSingleBitErrorISRTaken); //清除错误寄存器 RAMErrRegs.CCECLR.bit.C28CECLR = 1; } __interrupt void ramSingleBitError (void) { EALLOW; //确认此中断以接收来自组12的更多中断 PieCtrlRegs.PIEACX.ALL = PIEACK_Group12; EDIS; ramSingleBitErrorISRTake++; }