打印
[AURIX™]

英飞凌TC3xx MCU的启动流程

[复制链接]
70|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-12-3 16:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、写在前面的话
说来惭愧,最初思考这个话题,还是某天胡改初始化代码的时候。

仔细想想,在调试的过程中,我好像也遇到了很多问题:

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1981

主题

15793

帖子

12

粉丝