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.

[参考译文] TMS570LS3137:不生成 B1TCM ECC 检查数据中止

Guru**** 2615645 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/774180/tms570ls3137-b1tcm-ecc-check-data-abort-is-not-generated

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

您好论坛、

我正在使用 TMS570LS3137DZWT 并开发一个运行时间超过24小时的 EN50129应用。 因此、我想检查是否存在有效的 SRAM ECC。 我用 SPNA126和 Halcogen 4.07作为起点。

数据中止处理程序用于检查是否存在双位故障(esmr3)

 

执行以下步骤:

1) 禁用 B0TCM 和 B1TCM 的 RAMECC;

2) ECC RAM 中的双位翻转;[#define tcramA2bitError (*(volatile UINT32 *)(0x08400010U);#define tcramB2bitError (*(volatile UINT32 *)(0x08400018U))]

3) 为 B0TCM 和 B1TCM 启用 RAMECC;

4) 从 RAM 读取 B0TCM 的故障位置[#define tcramA2bit            (*(volatile uint64 *)(0x08000010U));#define tcramB2bit                (*(volatile uint64 *)(0x08000018U))]

5) -->数据中止处理程序确认 esmr3位3 (B0TCM 上的不可纠正的 ECC 错误)

6) 从 RAM (

7) -->数据中止处理程序应该确认 esmr3位5 (B1TCM 上的不可纠正的 ECC 错误),但是 esmr1、esmr2、esmr3都为0,没有要清除的内容。

 

我的测试函数现在会查找到

 

(笑声)

volatile uint64 ramread = 0U;
易失性 UINT32 regread = 0U;
//uint32 tcram1ErrStat、tcram2ErrStat = 0U;

uint64 tcrama1_bk = tcramA1bit;
uint64 tcramB1_bk = tcramB1bit;
uint64 tcrama2_bk = tcramA2bit;
uint64 tcramb2_bk = tcramB2bit;

/*在设置 RAMTHRESHOLD 寄存器之前清除 RAMOCUUR */
tcram1REG->RAMOCCUR = 0U;
tcram2REG->RAMOCCUR = 0U;

/*将单位错误阈值计数设置为1 */
tcram1REG->RAMTHRESHOLD = 1U;
tcram2REG->RAMTHRESHOLD = 1U;

/*启用单个位错误生成*/
tcram1REG->RAMINTCTRL = 1U;
tcram2REG->RAMINTCTRL = 1U;

/*启用对 ECC RAM 的写入、启用 ECC 错误响应*/
tcram1REG->RAMCTRL = 0x0005010AU;
tcram2REG->RAMCTRL = 0x0005010AU;

//第2部分
// coreDisableRamEcc
asm ("MRC P15、#0、R1、C1、c0、#1");
asm ("MVN R0、#0x1<<26");//;B0TCM ECC 检查禁用
asm ("和 R1、R1、R0");
asm ("MVN R0、#0x1<<27");//;B1TCM ECC 检查禁用
asm ("和 R1、R1、R0");
asm ("DMB");
asm ("MCR P15、#0、R1、C1、c0、#1");
asm ("isb");//;确保在继续之前写入

asm ("MRC P15、#0、R1、C9、C12、 0");
asm ("MVN R0、#0x00000010");//;禁用 PMNC 中事件的导出
asm ("和 R1、R1、R0");

asm ("DMB");
asm ("MCR P15、#0、R1、C9、C12、 0");
asm ("isb");//;确保在继续之前写入
// asm ("MOV PC、LR");

/*在两个组中强制出现双位错误*/
tcramA2bitError ^= 3U;
tcramB2bitError ^= 3U;

// coreEnableRamEcc
asm ("MRC P15、#0、R1、C9、C12、#0");//读取辅助辅助辅助辅助寄存器
asm ("ORR R1、R1、#0x00000010");
asm ("DMB");
asm ("MCR P15、#0、R1、C9、C12、#0");//;启用 PMNC 中事件的导出
asm ("isb");//;确保在继续之前写入
asm ("MRC P15、#0、R1、C1、c0、 1");
asm ("ORR R1、R1、#0x1 <<26");//;B0TCM ECC 检查使能
asm ("ORR R1、R1、#0x1 <<27");//;B1TCM ECC 检查使能
asm ("DMB");
asm ("MCR P15、#0、R1、C1、c0、 1");
asm ("isb");

/*读取损坏的数据以生成双位错误*/
ramread = tcramA2bit;//#define tcramA2bit(*(volatile uint64 *)(0x08000010U))
ramread = tcramB2bit;//#define tcramB2bit(*(volatile uint64 *)(0x08000018U))

 

问题1:上述 ECC 使能代码是否正确? (在文档 SPNA126;第3.3.2章(禁用 ECC 的步骤)中,_disable_ecc_r4_RAM 的代码不完整,所以我不确定 coreEnableRamEcc 是否正确。

 

Q2:启用 ECC 检查是否正确?

 

Q3:为什么从故障 B0TCM 地址读取数据正常工作(出现 esmr3数据中止错误)? 从 B1TCM (tcrB2bitError)读取会导致数据中止而不会出现 esmr3错误、因此在数据中止处理程序(来自 halcogen 4.07)中不会报告 noRAMerror。

 

问题4:此问题是否与以下帖子有关:

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/665055?tisearch=e2e-sitesearch&keymatch=ECC%20check

 

此致

Lorenz

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

    1和2。 您的代码看起来正确。 您可以使用 HALCOGen 生成的 sys_core.asm 中的代码。 您不必在此处禁用 CPU 事件导出。

    /*在为主 RAM 执行 PBIST 之前禁用 RAM ECC */
    _coreDisableRamEcc_();

    /*启用 TCRAM 访问的 ECC 检查。
    *此函数为 B0TCM 和 B1TCM 的访问启用 CPU 的 ECC 逻辑。
    *
    _coreEnableRamEcc_();

    /*启用 CPU 事件导出*/
    /*这允许 CPU 发出检测到的任何单位或双位错误的信号
    *通过其 ECC 逻辑访问程序闪存或数据 RAM。
    *
    _coreEnableEventBusExport_();

    3.如何在 B0TCM 和 B1TCM 上单独进行测试?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lorenz、

    请参考此主题作为参考:

    e2e.ti.com/.../777332