目录
1、概述
1.1、什么是HSE?
1.2、如何实现HSE的OTA功能
1.3、S32K3放置HSE的地址
2、通过调试器安装HSE
3、通过IVT方式安装HSE
4、坑点慎重踩
4.1、优化等级
4.2、Flash放RAM
4.3、C40_Ip配置更改
4.4、程序烧录
5、测试结果
6、代码链接
1、概述
首先需要明确一个问题:HSE的安装是一个独立的工程,在实际产品应用的时候有三个二进制文件需要烧录。
1、HSE安装二进制位文件(首次烧录需要断电上电两次)
2、BootLoader文件(升级用,可以直接覆盖掉HSE安装文件)
3、APP文件,量产使用
基于项目需要使用HSE的AB分区功能实现OTA,HSE在NXP的S32K3芯片上如何实现安装确实是一个比较头疼的问题,官方推荐两种安装方式,第一种为通过调试器安装,通过调试器复位两次安装。第二种是脱机运行,也就是下载HEX到MCU里面实现断电上电两次安装。在实际生产的时候第一种不是特别适用,毕竟不会有软件工程师一个一个的去给板子安装,最好通过烧录工装实现流水线烧录,所以第二种当时显得优点尤为突出,下面在第二章节开始详细介绍一下如何通过这两种方式安装。
1.1、什么是HSE?
参考博文:
HSE简介https://blog.csdn.net/weixin_43580890/article/details/139329518
1.2、如何实现HSE的OTA功能
大前提:安装HSE需要重启两次,时间间隔稍微留一些,安装上毕竟也需要时间的。
在使用OTA功能之前,应启用OTA功能。功能标志存储在UTEST中,并且只能编程一次。启用地址:0x1B00 0280值(8字节):0xAA, 0xBB, 0xCC, 0xDD,0xDD, 0xCC, 0xBB, 0xAA安装AB_SWAP FW后,HSE将书写该标志。
有两个选项可以启用AB_SWAP特性
在SBAF安装HSE固件时安装AB_SWAP固件映像。如果加密映像中的第一个字节是0xDB,则表示HSE固件的加密映像用于AB_SWAP配置。SBAF将在块1区域的末尾安装HSE固件,以启用SOC中的OTA功能。这是一个不可逆的过程,一旦设备处于OTA启用配置,就无法恢复到OTA禁用配置
通过向HSE固件提供固件更新服务,用AB_SWAP固件映像更新OTA禁用固件。HSE固件的新加密映像必须为AB_SWAP配置,即加密映像的第一个字节的值必须为0xDB。
通过第二种方式安装的时候有一个非常需要注意的点:应用程序必须确保有效的应用程序与IVT一起出现在块0和块1中,以便重置后,应用程序可以通过HSE固件启动。
在P-Flash中编程elf/bin/S19/hex并重置MCU后。当HSE FW(AB_SWAP)有效时,SBAF将在P-Flash(HSE空间)中使HSE FW有效(AB_SWAP),并对HSE FW进行编程,并在UTEST中启用OTA功能标志。重置并运行有源块后,SBAF还将对HSE FW版本从有源块编程为无源块。AB_SWAP和FULL_MEM HSE FW具有不同的标题。FULL_MEM HSE FW标头为:0xDAFFFF60,AB_SWAP HSE FW标题为0xDBFFFF60
NXP推荐需要遵循的地方如下
1、主机应用程序代码必须始终针对较低的地址空间进行编译
2、在交换主动分区和被动分区之前,必须确保被动分区中存在有效代码
3、主机(应用程序)可以读取DCM状态寄存器(DCMSTAT),以识别哪个分区是活动的,哪个分区是被动的;请参阅下表
1.3、S32K3放置HSE的地址
FULL_MEM
AB_SWAP
2、通过调试器安装HSE
将HSE放在0x00400000地址上需要通过调试器启动,因为此时找不到启动地址了,启动地址(一般是IVT的)只能放在0x00400000、0x00500000、0x00600000、0x00700000的位置上,通过调试器能正确指向PC指针,所以可以实现正常运行,一旦脱机跑运行不起来的,设置如下。
链接文件设置
增加HSE的信息
使用起来也非常简单,在UTEST写入默认值就行了
初始化的时候调用就行了
HEX信息如下
3、通过IVT方式安装HSE
链接文件处理如下
注意:
1、IVT与代码需要放在同一个PF里面,一般都是PF0
2、HSE放在PF1,地址信息与代码的是地址信息是对称的,例如代码是0x00402000那么HSE为0x00502000。
增加HSE的信息如上面通过调试器安装一致。
注意重点:
增加IVT信息,去除本身启动的boot_header信息
自己创建一个IVT就好了如下
static const unsigned int __attribute__((section("._int_ivt_0"))) ivt_flash[] =
{
/*00h*/ SBAF_BOOT_MARKER /* IVT marker */ ,
/* Boot configuration word */
/*04h*/ (CM7_0_ENABLE << CM7_0_ENABLE_SHIFT) | (CM7_1_ENABLE << CM7_1_ENABLE_SHIFT) ,
/*08h*/ IVT_RESERVED /* Reserved */ ,
/*C0h*/ CM7_0_VTOR_ADDR /* CM7_0 Start address */ ,
/*10h*/ IVT_RESERVED /* Reserved */,
/*14h*/ CM7_1_VTOR_ADDR /* CM7_1 Start address , lockstep only run CM7_0 */ ,
/*18h*/ IVT_RESERVED /* Reserved */ ,
/*1ch*/ CM7_2_VTOR_ADDR /* CM7_2 Start address , lockstep only run CM7_0 */ ,
/*20h*/ XRDC_CONFIG_ADDR /* XRDC configuration pointer */ ,
/*24h*/ LF_CONFIG_ADDR /* Lifecycle configuration pointer */ ,
/*28h*/ IVT_RESERVED /* Reserved */,
/*2ch*/ HSE_FW_ADDR /* Reserved */,
/*30h*/ SECURE_BOOT_APP_ADDR ,
/*34h*/ IVT_RESERVED ,
/*38h*/ SECURE_BOOT_BACKUP_ADDR ,
/*3ch*/ IVT_RESERVED ,
/*f0h*/ IVT_GMAC ,
};
IVT格式如下
然后安装也是写UTEST即可。
4、坑点慎重踩
4.1、优化等级
首先看下生成的HEX信息
这样肯定是不行的,前面已经提到IVT放置有地址的讲究的,这里压根没有IVT的信息还怎么启动对吧?回头看为啥呢?明明代码里面已经有IVT的就是没在HEX里面体现,想一下,C语言里面没用的数据会被优化掉的,所以此时找不到了,将优化等级调成最低如下更改(改单个IVT文件或整个工程都可以,建议改整个工程)。
由-Os改为-O0
改成功之后HEX显示如下:位置信息正确,分配大小与链接文件一致。
4.2、Flash放RAM
为什么的?操作UTEST的时候用到了flash驱动的,实际操作的时候放不放都行,但是建议放置一下。
Tips:flash驱动放在PF0能操作PF1,但是不能操作自身,所以操作UTEST的时候提到放不放RAM都行的原因在这。
4.3、C40_Ip配置更改
操作flash的UTEST的时候,根据RTD的版本不一样,生成的配置有时候有毛病的,这点一定要注意更改如下C40_IP生成的配置
4.4、程序烧录
在成功烧录HSE之后,千万千万不要烧录之前的调试不成功的HSE安装工程,这个小玩意儿安装好之后再烧录其他安装不好的工程会出现无法读取HSE版本号的现象,不知道是不是坏了。
5、测试结果
获取版本号信息
安装好之后千万别安装其他HSE了,否则HSE失效
6、代码链接
S32K3通过IVT的方式实现HSE的安装工程https://download.csdn.net/download/weixin_43580890/89436822?spm=1001.2014.3001.5503