Bootstrap

小猫爪:S32K3学习笔记12-S32K3之STCU2

小猫爪: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的功能框图:
在这里插入图片描述

  1. 三个FSM:STCU有三个FSM,其中Master FSM为STCU的核心单元,主要负责BIST测试控制;Loader Shifter FSM主要负责控制参数和测试结果反馈到寄存器之间的交互;WDG FSM为STCU的超时监测单元,如果BIST运行超时,这个模块会中断BIST并发出超时信号,并且。
  2. LBIST和MBIST interface:在整个BIST自测试中,STCU只是控制单元,所以这两个interface是控制单元与执行单元之间的接口。
  3. Interrupt信号:STCU检测到错误时可以产生一个中断,STCU_LBIST_MBIST_IRQn =191(但是这个中断在RTD中并没有被实现)。
  4. 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的状态,做好充足的准备,如下:

  1. 在执行时,只有一个核在运行,并且保证这个核的运行不会被其他操作影响。
  2. 所有的通讯外设必须Disbale,也就是说运行BIST前不要初始化任何通讯外设。
  3. FCCU所有错误响应都要Disable。
  4. 在执行BIST的时候,不能有任何的复位操作。
  5. S32K3的时钟要工作在高性能模式下。
  6. LBIST的时钟要设置成40MHz,即AIPS_SLOW_CLK=40MHz。
  7. 系统时钟来源于PLL。

END

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;