1 概述
1)存储器测试单(MTU)控制和监控AURIX™TC3xx系列微控制器中各种内部存储器的测试、初始化和数据完整性检查功能。
2)无创测试(NDT)是由内存内置自测试(MBIST)执行的,以验证同一SRAM内存的内容。内存内置自测试(MBIST)是一个MTU特性,它能够验证内部sram的完整性。
3)为了测试错误的场景,此实例提供了在内存中注入一个比特错误的可能性。
注意:对MTU MBIST SSH的具体理论知识可查看以下博客:https://blog.csdn.net/qq_41164088/article/details/134373862?spm=1001.2014.3001.5501。
2 步骤1:MTU 模块使能
当MTU模块未使能时,SSH警告将不会转发到SMU。如果在禁用期间产生了警告,那么当被使能后,之前触发的警告将会被转发到SMU。
2.1 控制MTU模块使能的寄存器 - Clock Control Register
- CLC.DISR = 1:MTU模块被禁用。(未配置之前默认MTU模块禁用。)
- CLC.EDIS=1:Sleep模式下,不接受任何请求。(MTU模块禁用。)
2.2 代码
void SM202_RamMtuMbist_MtuModuleEnableIinit(void)
{
Ifx_SCU_WDTCPU *wdt = &MODULE_SCU.WDTCPU[0];
unsigned short cpuWdtPw = Ifx_Ssw_getCpuWatchdogPassword(wdt);
Ifx_Ssw_clearCpuEndinit(wdt, cpuWdtPw);
/* Enable MTU Module. */
MTU_CLC.U = 0x0U;
Ifx_Ssw_setCpuEndinit(wdt, cpuWdtPw);
}
3 步骤二:获取当前警告状态
SSH向MTU提供如下三种警告:
- CE alarm(SRAM ECC Correction Error): ECCD.CERR表示CE警告状态。
- UCE alarm(SSH Un-Correctable Error): ECCD.UCERR表示UCE警告状态。
- ME alarm( SSH Miscellaneous Error):ECCD.MERR表示ME警告。
- 注意:要关注错误溢出(Error Overflow)。
3.1 包含警告状态的寄存器 - Memory ECC Detection Register(MCi_ECCD (i=0-95))
- ECCD.CERR=1:可纠正的错误警告产生。
- ECCD.UCERR=1:不可纠正的错误警告产生。
- ECCD.MERR=1:杂项错误警告产生。
- ECCD.EOV:检测到的错误比错误跟踪寄存器还多;或者有多个内存块同时出现错误。
3.2 代码
static uint32 SM202_RamMtuMbist_CheckEccdRegErrorAlarmStatusIinit(IfxMtu_MbistSel sramMbistSel)
{
Ifx_MTU_MC *mc = (Ifx_MTU_MC *)(MTU_MC0_ECCD + 0x100 * sramMbistSel);
return (uint32)(mc->ECCD.U & (IFXMTU_ERROR_FLAGS_MASK));
}
static void SM202_RamMtuMbist_ClearEccdAndFaultstsRegErrorAlarmStatusIinit(IfxMtu_MbistSel sramMbistSel)
{
Ifx_MTU_MC *mc = &MODULE_MTU.MC[sramMbistSel];
uint16 safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
mc->ECCD.B.SERR = 0; /* Error Detected */
mc->ECCD.B.CERR = 0; /* CE alarm occured */
mc->ECCD.B.UCERR = 0; /* Uncorrectable Error Alarm Occured */
mc->ECCD.B.MERR = 0; /* Miscellaneous Error Alarm Occured */
mc->ECCD.B.TRC = IFX_MTU_MC_ECCD_TRC_MSK; /* Tracking Clear */
mc->ECCD.B.EOV = 0; /* Error Overflow */
mc->FAULTSTS.B.OPERR &= MTU_CLEAR_FAULTSTS_OPERR0_MSK; /* SSH Critical Operation Error Occured */
Ifx_Ssw_clearSafetyEndinit(safetyWdtPassword);
Ifx_Ssw_setSafetyEndinit(safetyWdtPassword);
}
4 步骤三:初始化SRAM
4.1 初始化步骤
1)使能SSH初始化完整的SRAM可能触发UCE警告,因此,警告反应需要被禁用。ALMSRCS.OPENE = 0:禁止检测并转发SSH/SRAM操作关键错误作为UCE警告。
2)FAULTSTS. MISCERR存储各种错误的状态,这些错误可能对SSH或SRAM操作不直接关键,但如果存在隐藏状态,则可能导致未来的严重故障。因此,该警告反应需要被禁用。ALMSRCS.MISCERR= 0:禁止检测并转发SSH/SRAM操作关键错误作为ME警告。
3)使能SSH - MEMTESTi.MEMxEN(i=0-2,x=0-31) = 1;
4)检测内存自动初始化运行状态 - 轮询MEMSTATi.MEMxAIU(i=0-2,x=0-31)。MEMSTATi寄存器显示每个SSH实例当前是否正在执行一个自动初始化序列,1表示正在执行自动初始化序列。
5)使能清除SRAM - MCi_MCONTROL.SRAM_CLR=1,1表示清除SRAM,用0和正确的ECC填充。
6)启动内存测试 - MCi_MCONTROL.START=1,1表示启动内存测试功能。实测发现:内存测试启动后,需要先清除START,再去轮询DONE位。(注意:内存测试结束后, MSTATUS.DONE会被置1。可以轮询该位确认测试是否结束。)
7)检测内存测试状态 - 轮询MCi_MSTATUS.DONE。<