小猫爪:S32K3学习笔记12-S32K3之STCU2
1 前言
这一章来说说S32K3的STCU2(Self-Test Control Unit ),从名字就可以看出来,它是一个自测试控制模块,即BIST(Build-In Self-Test)控制器。BIST简单的来说就是一种芯片自我测试方式,谈到自我测试,无外乎就类似于那种给个输入然后对比输出的测试方法,当然我说的比较片面,感兴趣的小伙伴可以自行查阅资料进修一番。
BIST又分为LBIST(Logic BIST)和MBIST(Memory BIST)这两种。而在K3中,这两种BIST都是有的。而BIST又有两种模式,分别是off-line和on-line,其中off-line就是不需要软件的干预,硬件自己完成BIST测试,而on-line则需要软件来控制,S32K3只支持on-line模式。
2 STCU功能简介
下图为STCU的功能框图:
- 三个FSM:STCU有三个FSM,其中Master FSM为STCU的核心单元,主要负责BIST测试控制;Loader Shifter FSM主要负责控制参数和测试结果反馈到寄存器之间的交互;WDG FSM为STCU的超时监测单元,如果BIST运行超时,这个模块会中断BIST并发出超时信号,并且。
- LBIST和MBIST interface:在整个BIST自测试中,STCU只是控制单元,所以这两个interface是控制单元与执行单元之间的接口。
- Interrupt信号:STCU检测到错误时可以产生一个中断,STCU_LBIST_MBIST_IRQn =191(但是这个中断在RTD中并没有被实现)。
- FCCU信号:STCU可以将recoverable错误输送给FCCU,而这个是否为recoverable是可配置的。MBIST将K3分成了12个区域,而LBIST则共1个区域,总共有13个区域(详情请详见RM手册STCU章节的51.1.3 STCU2 LBIST/MBIST mapping),用户是可以将这些区域的配置成是否为recoverable和unrecoverable的BIST,如果是recoverable的区域在自测试的时候发生了错误,那么这个错误就会报告到FCCU模块,如果unrecoverable的错误发生了错误,则直接发送信号给MC_RGM触发破坏性复位。另外STCU也可以控制EOUT信号,发生错误时可以使用EOUT将错误信号传送给外部SBC。
2 BIST MCAL配置
在MCAL中,STCU的功能体现在Bist模块中,配置也是非常的简单,记得首先需要在Mcu模块中打开STCU的时钟,这里就不贴图了。首先首页中:
然后可以在Unrecovery中添加不可恢复发送触发破坏性复位信号到MC_RGM中的BIST区域:
2 BIST代码示例
下面直接进入主题,在代码中怎么实现BIST的功能?代码实现也非常简单,首先BIST的代码官方的例子已经写好了,直接拿过来如下:
#ifdef DEMO_ENABLE_BIST
bistStatus = Bist_GetExecStatus(BIST_SAFETYBOOT_CFG);
if( bistStatus != BIST_OK )
{
if(bistStatus == BIST_ERROR)
{
/* Reads STCU ERR_STAT register to identify what HW error occured */
stcuStatus = Bist_GetRawErrorStatus();
(void) stcuStatus;
}
else if(bistStatus == BIST_FAILED)
{
/* Analyze which reset domain is failing */
retStatus = Bist_GetFailRDs ( &Bist_LBistRDList, &Bist_MBistRDList );
(void) retStatus;
}
else if(bistStatus == BIST_BUSY)
{
while( 1U ); /* Handle BIST HW busy state */
}
else if(bistStatus == BIST_NORUN)
{
/* Bist execution was not successfully performed due to HW hazard state. */
Bist_Run(BIST_SAFETYBOOT_CFG); /* Re-start execution */
}
else if(bistStatus == BIST_INTEGRITY_FAIL)
{
while( 1U ); /* Handle the integrity fail state */
}
}
#endif
其中Bist_Run即是执行BIST测试,可以看到它可以以两种模式来运行,分别是BIST_SAFETYBOOT_CFG和BIST_DIAGNOSTIC_CFG,其中两者的区别为:
所以根据上面的描述,一般在代码中只需要执行BIST_SAFETYBOOT_CFG即可。当BIST测试完毕后,则会触发Function Reset信号复位K3,Function Reset是不会复位STCU模块的,所以在复位之后,在复位前BIST运行的结果是能读取的,在代码中就是Bist_GetExecStatus这个函数来获取BIST测试结果的,非常简单。
在这里需要注意一点就是,对于破坏性复位来说,是会复位STCU模块的,所以每一次的破坏性复位之后都会进行一次BIST测试。
另外在执行Bist_Run时,需要保证当前S32K3的状态,做好充足的准备,如下:
- 在执行时,只有一个核在运行,并且保证这个核的运行不会被其他操作影响。
- 所有的通讯外设必须Disbale,也就是说运行BIST前不要初始化任何通讯外设。
- FCCU所有错误响应都要Disable。
- 在执行BIST的时候,不能有任何的复位操作。
- S32K3的时钟要工作在高性能模式下。
- LBIST的时钟要设置成40MHz,即AIPS_SLOW_CLK=40MHz。
- 系统时钟来源于PLL。