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.

[参考译文] F28M35H52C:RAM ECC 自检不会触发单位错误 ISR

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/896576/f28m35h52c-ram-ecc-selftest-not-triggering-single-bit-error-isr

器件型号:F28M35H52C

您好!

  我正在编写 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++;
} 

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

    尊敬的 Anija:

    您已将阈值设为4 (RAMErrRegs.CCETRES = 4;// Threshold of error),但仅生成两个错误。 此外、我不会看到您在代码中读回您生成错误的位置。 那么,您如何知道这些位置已被纠正? 如果您是通过 CCS 存储器观察窗口读取它们、则这是不正确的。 您需要在代码中读取这些位置。

    此致、

    Vivek Singh

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

    您好、Vivek、

      感谢您的回答。 它很有效!

    我现在还有另一个问题。 在测试之前、我们是否可以在不初始化 RAM 部分的情况下进行 RAM 测试? 我在应用程序设置时初始化了 RAM。 但是 RAM ECC 的测试在代码的后面完成、我不想擦除 RAML0的内容。  

    我注释了 RAM 初始化并运行测试。 这就是我观察到的情况。 在测试模式开启和关闭之间的时间内、多个位置会更改其值。 因此、发生的错误始终是不可纠正的错误。  是否可以在不进行初始化的情况下仅翻转一个位并产生单个位错误?

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

    您好!

    [引述]现在还有另一个问题。 在测试之前、我们是否可以在不初始化 RAM 部分的情况下进行 RAM 测试? 我在应用程序设置时初始化了 RAM。 但是 RAM ECC 的测试在代码的后面完成、我不想擦除 RAML0的内容。  [/报价]

    是的、您不必再次进行 RAM 初始化。 它需要在加电后执行一次。

    [引用]我评论了 RAM 初始化并运行测试。 这就是我观察到的情况。 在测试模式开启和关闭之间的时间内、多个位置会更改其值。 因此、发生的错误始终是不可纠正的错误。  是否可以在不进行初始化的情况下仅翻转一个位并产生单个位错误? [引述]

    我不理解这个问题。 测试模式打开后,用户代码会翻转这些位,为什么多个位置会更改该值,除非由软件代码完成? 我怀疑翻转位的代码存在一些问题。 必须对其进行读取、修改、并确保一个位反相。

    此致、

    Vivek Singh

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

    您好!

    如果您对此问题有任何进一步的疑问、请告诉我。 如果问题已解决、请将其标记为已解决。

    此致、

    Vivek Singh