本系列的其它几篇文章:
《英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM》
《英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器》
《英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法》
《英飞凌 AURIX 系列单片机的HSM详解(5)——HSM硬件加速模块的使用》
本文以TC397为例,来介绍一下HSM的开发方法。
HSM开发时分两类工程,一类工程是编译Tricore内核代码的,用到的编译器是Tasking for Tricore;
另一类工程是编译HSM的ARM Cortex-M3内核的,用的是Tasking ARM for HSM。
各个版本可以在下面Tasking的官网上找到,需要试用的话要联系Tasking的销售:
https://www.tasking.com/support/tricore-and-aurix-toolset-support#4.3
调试器可以用Lauterbach,配合软件Trace32,需要有Tricore和ARM的license。用Trace32软件结合Lauterbach硬件调试器可以实现HSM核和Tricore核程序的烧写和调试。此外还有iSYSTEM等不太常用的调试器。
HSM核的程序代码可以存放于PFlash0的S0-S39这40个16K的PFlash块中,手册中对该区域的定义如下,我们暂时先考虑右侧“HSM only”的情况,先不管TP:
我们此次将该区域划分成如下三部分:
PF0的起始地址0x80000000处的S0-S1用于存放Tricore APP的部分代码,Tricore上电后从0x80000000处开始执行。
HSM代码分为BootLoader和APP两部分,此次将HSM的BootLoader起始地址放在S2 - 0x80008000处,HSM的APP起始地址放在S24 - 0x80060000处,将S2-S39共38个Sector都预留给HSM使用,其中BootLoader分配352K空间,APP分配256K空间。
预留给HSM的这38个Sector要被保护起来,是通过寄存器SP_PROCONHSMCX0/1两个寄存器设置的,HSM的BootLoader启动地址由寄存器SP_PROCONHSMCBS设置,这三个寄存器又都由UBC中的UCB_HSMCOTP0/1_ORIG和UCB_HSMCOTP0/1_COPY定义,详细定义见上一篇文章。这三个寄存器的设置值如图中所示。
MCU上电时,SSW代码先判断UCB中的内容,如有效则将其复制到响应的寄存器中,然后查找SP_PROCONHSMCBS获取HSM核的启动代码地址,启动HSM核。
Flash地址分配可以用链接脚本来控制,代码共分为三个部分,Tricore的APP,HSM的BootLoader和HSM的APP,三个工程的链接脚本要相互配合好,保证编译出来的代码不会互相覆盖。
例如,HSM BootLoader工程中的链接脚本中,PFlash起始地址定义如下:
#define HSM_FLASH 0x80008000
HSM APP工程链接脚本中的PFlash起始地址定义如下:
#define HSM_FLASH 0x80060000
Tricore APP工程链接脚本中,应将PF0中用于HSM的一段剔除,例如:
原链接脚本:
修改为:
(这里pfls01的大小为了方便就写了2M,实际剩余空间>2M)。
将原来放在pfls0的代码段都改为pfls01,只有启动代码放在pfls00中,要修改的地方比较多就不一一列举了:
编译后的Hex文件地址如下图所示:
我们可以看到0x80008000-0x8009FFFF这一段已经没有代码了,被预留出来烧写HSM的代码。
根据上文所述,共有三个工程,分别编译得到三个elf或hex文件。程序烧写步骤如下:
首先确保BMHD区域的值正确,保证Tricore可以正常启动。
在烧写HSM程序前,要保证HSM处于禁用的状态,即UCB_HSMCOTP0/1_ORIG和UCB_HSMCOTP0/1_COPY两个UCB中 PROCONHSMCFG 中的HSMBOOTEN值为0。
向PFlash中烧写HSM的BootLoader程序、APP程序和Tricore的APP程序。
查看PFlash相应地址处的程序,确保三个程序烧写完整,彼此没有覆盖。
在PROCONHSMCBS寄存器中配置正确的HSM BootLoader启动地址,依据前文所述,向UCB_HSMCOTP0/1_ORIG 和UCB_HSMCOTP0/1_COPY两个UCB中的PROCONHSMCBS中的BOOTSELx填入0x02(暂定,待验证)。
以上准备工作完成后,就可以启用HSM配置了,即向UCB_HSMCOTP0/1_ORIG和UCB_HSMCOTP0/1_COPY两个UCB中 PROCONHSMCFG 中的HSMBOOTEN写入1.
以上配置都完成且正确后,再次给MCU上电,MCU即可启动Tricore核和HSM核。