第一次接触Tricore, 学习下从芯片上电到运行到main函数的过程,本文以TC36X为例,具体可参考英飞凌官方的Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN
首先Tricore类似三星的MPU,有一段自带的BROM,这段FLASH中存储了一段固化的启动代码,称为Startup Sofrware(SSW), 这个意味着这段代码是英飞凌出厂就烧进去的,且无法覆盖。

然后SSW什么时候执行呢?当然是RESET的时候,英飞凌把RESET分为三种:
- Cold (initial) power-on reset 上电复位,一切都处于初始状态
- System reset 触发源为内部看门狗,软件主动请求,PORST输入脉冲复位等,复位后一切都处于初始状态
- Application reset 触发源和System reset相同,只是可以通过复位前软件配置,使得复位后时钟,RAM不会跟着复位
复位后如果一切正常就会自动执行SSW
先放张图

SSW会去读取DFLASH UCB区的BMHD(Boot Mode Header)内容。

一共四个配置项,从BMHD0开始检测是否有效,如果BMHD0有效则使用它,否则依次检测出第一个有效的BMHD,如果都无效则需要进入BootStrap Loader刷程序,芯片无法正常启动,跳转到用户写的代码去执行

这就是一个UCB-BMHD内容,需要用户自己填写(不确定出厂是否会有默认的内容),编译链接到.section .bmhd_0_orig 并下载到DFLASH.UCB.BMHD对应的地址上去,这样下次芯片上电执行SSW才能读到正确的内容。
找了一个例程,大家看下配置
#if defined(__HIGHTEC__)
#pragma section
#pragma section ".bmhd_0_orig" a
#endif
#if defined(__TASKING__)
#pragma section farrom "bmhd_0_orig"
#endif
#if defined(__DCC__)
#pragma section CONST ".bmhd_0_orig" far-absolute R
#endif
#if defined(__ghs__)
#pragma ghs section rodata= ".bmhd_0_orig"
#endif
const Ifx_Ssw_Bmhd bmhd_0_orig =
{
0x003E, /* 0x000: .bmi: Boot Mode Index (BMI) PINDIS */
0xB359, /* 0x002: .bmhdid: Boot Mode Header ID (CODE) = B359H */
0xA0000000, /* 0x004: .stad: User Code start address */
0xD86CBDAB, /* 0x008: .crc: Check Result for the BMI Header (offset 000H - 007H) */
0x27934254, /* 0x00C: .crcInv: Inverted Check Result for the BMI Header (offset 000H - 007H) */
{
0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x010: Reserved (0x010 - 0x01F) */
0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x020: Reserved (0x020 - 0x02F) */
0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x030: Reserved (0x030 - 0x03F) */
0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x040: Reserved (0x040 - 0x04F) */
0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x050: Reserved (0x050 - 0x05F) */
0x00000000, 0x00000000, 0x00000000, 0x00000000,

本文以TC36X为例,介绍Tricore芯片从上电到运行到main函数的过程。Tricore有自带的BROM存储启动代码SSW,复位后执行。SSW读取DFLASH UCB区的BMHD内容,根据配置决定启动方式。上电时CPU0默认开启执行SSW,之后多核CPU执行各自的main函数,后续还需研究共享资源访问等问题。
1万+

被折叠的 条评论
为什么被折叠?



