一、写在前面的话
说来惭愧,最初思考这个话题,还是某天胡改初始化代码的时候。
仔细想想,在调试的过程中,我好像也遇到了很多问题:
PORST电平、PLL锁相环不稳、奇怪的Trap陷阱,乃至于还有经典的锁片(>_<)连不上...
Message from component ‘Controller0.Core0.Tc2CoreTargIntf’:
Failed to open JTAG IO communication!
在做新硬件环境的早期阶段,存在许多设想不到的问题,此时就要一步一步的往前查。
于是搜集了一下相关的学习资料,研究Infineon的AURIX 2G系列MCU启动流程。
二、从产品谱系看起
参照官网的说法,AURIX系列的历史包括:
起源于1999年所发布的第一代产品AUDO (Automotive unified processor),
中文直译为“汽车统一处理机”。
到2014年AURIX TC2xx问世(Automotive Realtime Integrated Next Generation Architecture),
中文直译为“汽车实时集成下一代架构”。
然后是2018年的AURIX TC3xx平台(40nm制程),此世代也就是本文所探讨的目标。
以SAK-TC377TP-96F300S为例,依据命名:
通过由上所见,结合整车分析,
从驾驶员拧下钥匙,
到KL15置高,再到电源管理网络,
最后到某一颗芯片启动后第一行“代码”的执行,
需要经过漫长的流程(请注意,这里特指的更多是步骤而非时间)。
在这其中,VDD等引脚、时钟的倍频,RAM/ROM的初始化,UCB的配置信息势必参与其中。
三、Startup流程
参照User Manual等文件的说明,大体上我整理为三个顺序执行的阶段:
①Startup之Fireware
②Startup之Boot Mode
③Startup之Software
其中,步骤2的Boot Mode主要为原厂自带的刷写功能,本文暂不详细展开。
Startup之Firmware
在此步骤中,其实就是我们常称为的SSW的部分,是英飞凌生产时灌装到其中的固定代码。
详细展开,分为了Reset和Fireware两块内容。
Reset复位
对于Reset部分而言,那就牵扯到如下的四种方式,影响后续步骤执行的顺序:
Ⅰ、Cold Reset
它的触发条件,在这里节选了一句手册中的描述,感觉总结的很好:
This is the initial powering-up of the device after the supply has been switched off,
or in other words - the only way to generate this reset event is by applying power to a previously un-powered device.
也就是说,产生此复位事件的唯一方法是对先前未通电的设备施加电源,类似于重新上电。
Ⅱ、Warm Reset
它的触发条件,类比35584外部看门狗触发。
Ⅲ、System Reset
可由软件触发,参照Autosar标准的Mcu_PerformReset函数。
Ⅳ、Application Reset
可由软件触发,参照Autosar标准的Mcu_PerformReset函数。
对于不同的Reset方式,它们的影响范围属于包含层级的关系,比如对于Cold Reset而言:
(1)所有寄存器都处于重置状态
(2)Flash处于复位状态,意味着不活动,并且不准备执行任何(读取/擦除/程序)操作。
(3)RAMs的内容变成未定义
(4)时钟系统处于初始状态
但是对于System和Application Reset而言,就不会将过往历史的RAM数据丢失。
Fireware执行
在此阶段,芯片主要执行以下动作:
(1)芯片开始检查当前Core ID;
(2)检查是否为TEST Mode(取自PIN20.2的输入状态);
(3)配置Clock用于SSW的输入时钟;
(4)配置ESR0引脚为低电平,当运行完SSW跳转后才会变为高电平;
(5)判断是否使能SWAP功能;
(6)初始化SRAM,包括清零;
(7)读取BMHD(Boot Mode Header)寄存器,这里包含了起始地址等重要信息;
(8)执行LBIST(Logic Built-in Self Test),检测内部逻辑电路;
(9)备份UCB信息,防篡改校验;
(10)判断是否锁住Debug口,Debug口会影响DAP和JTAG的连接;
(11)判断跳转Boot还是Software程序。
Startup之Software
本阶段已经进入用户可编程部分了,从软件工程中可以看到。
因此,我们通过Aurix Development Studio新建了一个TC377的工程,
(一个官网提供的免费小工具,内置了iLLD与编译环境)
并找到了里面的启动代码进行分析。
(1)_START函数
是芯片进入应用层程序后跑的第一个函数、第一行代码,随后跳转到_StartUpSoftware函数,即Phase1步骤。
(2)Phase 1
static void __StartUpSoftware(void)
{
/* Initialize A1 pointer to use the global constants with small data addressing */
Ifx_Ssw_setAddressReg(a1, __SDATA2(0));
/* Set the PSW to its reset value in case of a warm start,clear PSW.IS */
Ifx_Ssw_MTCR(CPU_PSW, IFX_CFG_SSW_PSW_DEFAULT);
/* This phase is executed only if last reset is not of type application reset */
if (Ifx_Ssw_isApplicationReset() != 1)
{
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase2);
}
else
{
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase3ApplicationResetPath);
}
}
通过寄存器Reset status Register记录发生复位的原因,
从而判断复位类型是否是Application Reset。
如果是Application Reset,启动代码跳转到Phase3,否则跳转到Phase2。
(3)Phase 2
static void __StartUpSoftware_Phase2(void)
{
/* Power and EVRC configurations */
IFX_CFG_SSW_CALLOUT_PMS_INIT();
/* LBIST Tests and evaluation */
IFX_CFG_SSW_CALLOUT_LBIST();
/* MONBIST Tests and evaluation */
IFX_CFG_SSW_CALLOUT_MONBIST();
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase3PowerOnResetPath);
}
由Phase1得知当前的复位类型后,进入不同的逻辑分支,执行不同的初始化流程。
如果当前复位类型为Power-on Reset,那么需要评估是否执行LBIST,因为LBIST可能已经在Startup Firmware的SSW中执行。
LBIST完成后,需要复位重新判断,还需要对CPU0的Stack和CAS执行MBIST (Memory Built-in Self Test),包括检测存储器的完整性和功能等,为Phase3做准备。
(4)Phase 3
static void __StartUpSoftware_Phase3PowerOnResetPath(void)
{
IFX_SSW_INIT_CONTEXT();
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase4);
}
static void __StartUpSoftware_Phase3ApplicationResetPath(void)
{
IFX_SSW_INIT_CONTEXT();
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase5);
}
此处,所有的复位类型都需要执行此步骤,其主要内容包括:
①初始化CPU0的USTACK(user stack pointer)和CAS(context save area)。
②首次处理CPU0的Watchdog和Safety Watchdog。
因为函数的调用需要入栈和出栈的过程,所以完成Phase3后可以进行函数的调用。
如果是Power-on Reset,启动代码跳转到Phase4。
如果是Application Reset,启动代码跳转到Phase5。
(5)Phase 4
static void __StartUpSoftware_Phase4(void)
{
/* This is for ADAS chip, where clock is provided by MMIC chip. This has to be
* implemented according the board.
*/
IFX_CFG_SSW_CALLOUT_MMIC_CHECK();
{
/* Update safety and cpu watchdog reload value*/
unsigned short cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPasswordInline(&MODULE_SCU.WDTCPU[0]);
unsigned short safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPasswordInline();
/* servicing watchdog timers */
Ifx_Ssw_serviceCpuWatchdog(&MODULE_SCU.WDTCPU[0], cpuWdtPassword);
Ifx_Ssw_serviceSafetyWatchdog(safetyWdtPassword);
}
/* Initialize the clock system */
IFX_CFG_SSW_CALLOUT_PLL_INIT();
/* MBIST Tests and evaluation */
IFX_CFG_SSW_CALLOUT_MBIST();
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase5);
}
Power-on Reset会执行此步骤,其内容包括:
①配置读写FLASH操作的等待周期,等待周期默认与CPU的最高频率相对应,即等待时间最短,使得芯片性能达到最佳。
②配置PLL (Phase-locked loop),包括System PLL和Peripheral PLL,与芯片的时钟系统有关。
③对整个RAM区域执行MBIST,此时不能使用任何RAM(亦不能使用Stack和CSA)。
(6)Phase 5
static void __StartUpSoftware_Phase5(void)
{
/* SMU alarm handling */
IFX_CFG_SSW_CALLOUT_SMU();
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase6);
}
使能SMU的ALARM
(7)Phase 6
static void __StartUpSoftware_Phase6(void)
{
/* Start remaining cores as a daisy-chain */
#if (IFX_CFG_SSW_ENABLE_TRICORE1 != 0)
Ifx_Ssw_startCore(&MODULE_CPU1, (unsigned int)__START(1)); /*The status returned by function call is ignored */
#endif /* #if (IFX_CFG_CPU_CSTART_ENABLE_TRICORE1 != 0)*/
#if (IFX_CFG_SSW_ENABLE_TRICORE1 == 0)
#if (IFX_CFG_SSW_ENABLE_TRICORE2 != 0)
Ifx_Ssw_startCore(&MODULE_CPU2, (unsigned int)__START(2)); /*The status returned by function call is ignored */
#endif
#endif /* #if (IFX_CFG_SSW_ENABLE_TRICORE1 == 0) */
Ifx_Ssw_jumpToFunction(__Core0_start);
}
在Phase6中,链路式逐个启动其他从核,
这样使得功耗不会跳变太快,相邻CPU启动的时间差为100us左右。
最后跳转到芯片的main函数开始执行OS启动代码。
六、关于高阶应用的思考
唤醒(CANTRCV)
这里更多是指芯片的硬件从睡眠状态正常启动后,即将进入产品功能上线前的时间段。
也就是Phase6无误后,需要基于部分数据判断,本次上电是否合理。
如若检测到误触发,则考虑应通过触发看门狗等方式复位。
功能安全(SMU)
对于TC3xx芯片,内置的SMU(Safety Management Uint)单元需要关注。
SMU单元规定了故障事件及其对应的复位方式,其中,牵扯到一些引脚。
/PORST: 对于MCU为双向,作为芯片常用复位引脚。
/ESR0: 对于MCU为输出,用于同步复位板载的其他部件。
/ESR1: 对于MCU为输入,用于触发特定中断。
/FSP: 对于MCU为输出,遵循Bi-Stable等三种协议,与外部交互。
信息安全(HSM)
对于功能安全,需要在启动代码中配置好HSM初始化信息。
OTA升级(SWAP)
对于OTA升级,需要在启动代码中配置好SWAP初始化信息,包含使能与默认Bank区域。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41989302/article/details/143782733
|