由于后续的项目用到芯片是Tc3xx,因此以往Tc2xx的经验不再完全适用,因此重新阅读Tc3xx用户手册并查阅了相关资料,结合自身涉及的项目做一个总结。
Startup Software 是什么
Startup Software(SSW)是芯片复位后首个执行的软件,运行于CPU0,其他CPU在启动时保持暂停状态,需由用户软件启动。
具体的,有:
- 启动地址:SSW在BootROM中的起始地址即为CPU0 PC寄存器的复位值。从此地址获取的指令是设备启动后执行的第一条指令。
- 测试模式检查:执行入口指令后,固件立即检查测试模式。若选择测试模式,则跳转至测试固件执行。
- UserCode跳转:最后一条软件指令执行跳转至用户代码的首条指令,该指令的获取位置取决于用户选择的启动配置。
SSW包含以下初始化程序(基于以下一项或多项条件):
- 预先存储于专用Flash位置的信息
- 专用寄存器/内存位置中特殊位/字段的当前状态
- 触发软件执行的复位事件类型
- 外部配置引脚输入值(可选)
有哪几种Start Modes
其实就本人关注点而言,是我在烧入FBL后,软件是否能跑起来,如果跑不起来,为什么会跑到一些莫名其妙的地址,比如0xA0000020,或者0xA0000160。那么先了解下,对于Tc3xx而言,有哪些启动方式可选。
Internal Start
这种启动模式,设备将从内部PFlash获取首条用户指令。用户代码起始地址(STADD)可通过启动模式头(BMHDx.STAD)数据结构进行配置。
Bootloader Modes
这种启动模式,用户手册中描述地比较抽象,实际上就是通过ASC/CAN获取上位机的发送的代码数据,而后放入ECU的RAM中执行。(由于本人接触的项目有限,暂未涉及到此类型的Bootloader Modes,此处纯为个人理解,若理解有误请海涵指正。)
Alternate Boot Modes
这种启动模式,可以通过数据结构ABMHD中的ABMHDn.STADABM去配置启动地址,并使ECU从该地址开始执行,前提是满足部分前置条件,若不满足,则选用其他启动模式。
如何选择并评估启动模式
启动模式的评估流程如图所示,为了便于理解,个人将其分解为三部分,并重点关注第二部分的理解。
第一部分
第一部分是根据BMHD数据结构对其中各项子元素进行验证,例如UCB_BMHD的状态、BMHDID是否为0xB359、BMHD的CRC等等。
Note:UCB_BMHD实际上就是Tc3xx NvM模块中DFlash的一块区域,一共四个,如用户手册原文所描述。在项目中,会以Hex格式的数据与Bootloader或者Application代码一并烧入ECU。
第二部分
这个部分首先对是否由HWCFG pins决定启动模式进行判断,即由BMI.PINDIS决定,若0则启用HWCFG,反之则禁用。当使能HWCFG时,据HWCFG的pin脚高低决定启动模式,如图所示。
例如我接触的项目甲,从左往右是1 1 1 0 0 0,而项目乙则为 1 1 0 1 1 0,那么项目甲HWCFG[3] = 1,选用Flash BMI Boot,直接按上文UCB_BMHD结构中的BMI的信息进行启动;而项目乙HWCFG[3] = 0,那么需要继续一句HWCFG[4][5]判断启动模式,而HWCFG[4][5] = 1 1,最终选择了Internal Start。
而项目甲的UCB_BMHD被配置为如图,根据上文对BMI的结构介绍,可以知道BMI.HWCFG[3:1] = 1 1 1,殊途同归,也是走上了Internal Start的道路。
进一步,根据UCB_BMHD.STAD的解释,若选择Internal Start,那么直接选择STAD配置的地址为程序的起始地址,并从此处启动。
第三部分
若为选择为ABM,则加载ABMHD,按ABMHD中的配置启动,若非ABM,且非BSL启动,则为Internal Start,若未BSL启动,则根据BSL中获取的代码数据,从CPU0_PSPR_begin启动。
Note:BSL启动可以简单理解为通过ASC/CAN获取程序数据,而后根据获取的数据决定如何启动程序。
如何评估ABM启动模式
ABMHD的数据结构如图,在启动前会进行类似BMHD的校验流程。
此处需要额外理解的是,如图。n = 3意味着已经遍历到第四份BMHD了,仍然没找到有效的启动配置,那么就判断ABM启动失败,此时根据上文HWCFG[4][5]的信息选择相应的BSL启动模式。
若无有效BMHD及未配置启动模式的处理程序
若上述流程未找到有效的BMHD,SSW将不会执行用户代码。此时SSW会对设备进行预处理,使用户能够进行以下操作:
- 连接调试接口
- 安装有效的启动模式头
- 将应用程序代码烧录至PFlash
- 配置其他设备参数
如果HSM BOOT或者BM Lock使能了,还是没找到相应的启动地址,芯片就会上锁,调试器无法连接。若不是,那么仅仅是没法启动芯片,调试器还能连接。