NXP实战笔记(十四):32K3xx基于RTD-SDK在S32DS实现HSE的安装。

目录

目录

1、概述

1.1、什么是HSE?

1.2、如何实现HSE的OTA功能

1.3、S32K3放置HSE的地址

1.4、MU用于APP与HSE通信

1.5、HSE FW下载

1.6、安装过程

2、通过调试器安装HSE

3、通过IVT方式安装HSE

4、坑点慎重踩

4.1、优化等级

4.2、Flash放RAM

4.3、C40_Ip配置更改

4.4、程序烧录

4.5、HSE时钟问题

4.6、输入输出参数放在nocache

5、测试结果

6、代码链接


1、概述

        首先需要明确一个问题:HSE的安装是一个独立的工程,在实际产品应用的时候有三个二进制文件需要烧录。

        1、HSE安装二进制位文件(首次烧录需要断电上电两次)

        2、BootLoader文件(升级用,可以直接覆盖掉HSE安装文件)

        3、APP文件,量产使用

        基于项目需要使用HSE的AB分区功能实现OTA,HSE在NXP的S32K3芯片上如何实现安装确实是一个比较头疼的问题,官方推荐两种安装方式,第一种为通过调试器安装,通过调试器复位两次安装。第二种是脱机运行,也就是下载HEX到MCU里面实现断电上电两次安装。在实际生产的时候第一种不是特别适用,毕竟不会有软件工程师一个一个的去给板子安装,最好通过烧录工装实现流水线烧录,所以第二种当时显得优点尤为突出,下面在第二章节开始详细介绍一下如何通过这两种方式安装。

1.1、什么是HSE?

对于S32K3系列,我们使用的是HSE_B,其他芯片平台的对应关系:

参考博文:

HSE简介icon-default.png?t=N7T8https://blog.csdn.net/weixin_43580890/article/details/139329518

1.2、如何实现HSE的OTA功能

        大前提:安装HSE需要重启两次,时间间隔稍微留一些,安装上毕竟也需要时间的,建议2S以上。

        在使用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

1.4、MU用于APP与HSE通信

        HSE 子系统的通信接口是通过MU来实现的,具体的通信过程如下:
        Host Core通过Application Space中的Tx寄存器向Hse Core发送数据,Hse拿到数据处理完
毕后再通过HSE Space的Tx寄存器返回响应给Host Core,这就是一个简单的通信方式。

        在实际的HSE FW安装以及block切换过程中,参与通信的MU模块通常是MU0,host发送切
换命令或者其他服务的时候,通常使用的是TR[0-1]和RR[0-1];针对HSE的使用来说,MU
通信模块的介绍如下文所述

MU的主要是用在不同内核之间的通信,分为A,B两面,分别有不同的用途,具体如下图:

在实际项目中,只有MUB的操作对我们来说是可见的。例如在使用SID
“HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK”的时候,我们操作的是MUB的MU0 CH1通道:

1.5、HSE FW下载

需要注意的是
:我们要获取最新的版本,目前为止最新版本为
[HSE_FW_S32K312_0_2_40_0] ;另外,原廠的K3芯片内有最新的Sbaf,因此不需要
在官网下载sbaf固件,暂时也不要去更新sbaf,以免变砖!

1.6、安装过程

NXP官网文档,给出了三种安装方式:

        在介绍具体的方式之前,现讲解一下,AB SWAP时的内存分配情况,方便后续的内存变化
过程的理解。

2、通过调试器安装HSE

 将HSE放在0x00400000地址上需要通过调试器启动,因为此时找不到启动地址了,启动地址(一般是IVT的)只能放在0x00400000、0x00500000、0x00600000、0x00700000的位置上,通过调试器能正确指向PC指针,所以可以实现正常运行,一旦脱机跑运行不起来的,设置如下。

链接文件设置

增加HSE的信息

使用起来也非常简单,在UTEST写入默认值就行了

初始化的时候调用就行了

HEX信息如下

安装原理图示如下

        两次reset之后,安装完成,同method1,FW-IMG可以被覆盖或者擦除,此时Sbaf会将FWIMG放在HSE专用NVM之中:

3、通过IVT方式安装HSE

链接文件处理如下

注意:

        1、IVT与代码需要放在同一个PF里面,一般都是PF0

       2、HSE放在PF1,地址信息与代码的是地址信息是对称的,例如代码是0x00402000那么HSE为0x00502000。

增加HSE的信息如上面通过调试器安装一致

注意重点

增加IVT信息,去除本身启动的boot_header信息

自己创建一个IVT就好了如下

        实现满足需求的安装工程,最主要的地方就是合理分配内存。我们工程的内存划分如上图,
将IVT放置在pflash的起始地址处,而IVT内包含了程序的启动地址,这样的话,就可以实
现在上电之后,没有挂调试器的时候,仍然可以重启,实现HSE的离线安装的目的。以下为
IVT的内容:

#define CM7_0_ENABLE            (1)
#define CM7_1_ENABLE            (0)
#define CM7_0_VTOR_ADDR         (0x00402000)
#define CM7_1_VTOR_ADDR         (0)
#define CM7_2_VTOR_ADDR         (0)
#define XRDC_CONFIG_ADDR        (0x00000000)
#define LF_CONFIG_ADDR          (0)
#define HSE_FW_ADDR             (0x00502000)

#define SECURE_BOOT_APP_ADDR    (0)
#define SECURE_BOOT_BACKUP_ADDR (0)

#define IVT_GMAC                (0xFFFFFFFF)

#define IVT_RESERVED            (0)

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即可。

安装原理图示如下

        所有的image通过JTAG烧录到内部flash之中,同时将IVT放在特定的地址处,对于S32K312
来讲的话,只能放在0x00400000处,参照HSE RM,如下:

注意:其他的imag,实际存放地址要和IVT的指向地址保持一致!
如果secure NVM内部还没有安装HSE时,在reset之后,会有以下的操作:

在安装完成以后,FW_IMG就可以被擦除或者覆盖掉了。操作流程示意图,如下:

安装AB SWAP需要经过两次reset,此时内部NVM发生了变化:

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版本号的现象,不知道是不是坏了。

4.5、HSE时钟问题

1.注意HSE时钟的设置,参照option B设定,设定为60MHz;

4.6、输入输出参数放在nocache

编译时,descriptor等HSE 输入输出的变量需要放在 nocachable内存中。见下图

HSE RM中也有类似表述:

因此,与HSE相关的输入输出变量,我们在工程中放在no-cable的内存区域中:

建议使用上述方法将变量分配在想要的ram中,社区里有些建议将compile选项中的
D-CACHE关闭,此种方法不建议!
        

5、测试结果

获取版本号信息

安装好之后千万别安装其他HSE了,否则HSE失效

6、代码链接

S32K3通过IVT的方式实现HSE的安装工程icon-default.png?t=N7T8https://download.csdn.net/download/weixin_43580890/89436822?spm=1001.2014.3001.5503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑从东方起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值