HSE的AB swap功能验证与实现
前言
本文主要介绍NXP Hse的ab swap功能的验证,以及在开发过程中遇到的问题。
在前面文章完成HSE FW的安装之后,接下来就需要验证HSE 的ab swap功能。首先介绍一下ab swap的原理。
AB SWAP原理
安装hse ab swap之后,我们可以通过调用hse_interface里的SID =
HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK来实现A B bank之间的切换。切换的原理如下:
切换步骤
1.安装HSE ab swap模式后,需要保证B区里也必须有程序的存在。这里实现由两种方式:
第一,在切换前,将active的程序copy到passive;第二,在ld文件内,以bin文件拼接的方
式,在passive block内放置一版程序。
2.调用active passive block函数,完成切换。目前认为,我们在更新完passive的程序之后,
调用该SID之后,硬件执行remapping操作,在一次reset之后,程序还是从0x00400000处执
行。
注意点
1.必须保证passive 有程序,才能确保切换成功。
2.程序的更新地址永远是0x00500000,程序运行起始地址永远是0x00400000。
3.在ld文件拼接程序时,passive的程序运行其实地址必须是0x00400000,如果有
bootloader,地址信息也和active程序保持一致。
切换服务SID = HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK 时,代码的实现如下:
该SID是通过MU0_CH1来实现的,函数接口内容如下:
调试细节
可以通过UDE查看内存的方式,查看切换前后,单片机内存的变化:
在切换前后,查看内存变化,执行切换AB的SID之后,ab内存发生了替换。那么,会产生两
种认识:
1.passive区域的程序拷贝到A区域,然后程序表现为总是从0x00440000处开始执行;
2.并未拷贝,只是将原来passive区域的物理地址0x00540000重新remapping为 0x004400000,然后重新启动运行。 在社区的资料来看,目前应该是第二种可能。
潜在切换失败原因
1.HSE 切换服务相关的变量,要放在合理的内存空间,可以参照HSE 安装的潜在失败原因分
析。例如,在切换过程中,存在下面的变量,如果不放在dtcm或者no-cable的话,可能会
导致切换不成功。
2.连续两次操作,间隔时间太短,一般认为小于1s.如果连续两次切换,会导致程序死掉。
但是重新上电reset之后,程序仍然会执行切换后block的程序。解释如下图:
3.切换时未获取SU权限。但在实际的项目工程中,经调试发现如果不获取SU权限,也可以实现。因此此原因存在疑问。
不获取SU权限,也可以实现。因此该建议存在疑问。在本工程文件中,并未使用SU权限。
4.HSE和sbaf版本问题。首先二者版本要保持一致;另外,保证版本是最新的。
几点补充信息
1.SU权限的获取方法。
HSE RM手册里,给出了SU 权限的方法:
从社区下载的OTA demo中也给出了如何申请SU 权限的代码,可以参考S32K312_OTA demo
程序,函数接口如下:
2.AB BLOCK指示寄存器。
根据下图,显示DCM的bit17可以显示,哪一个block现在是active或者passive。
实际手册里寄存器DCMSTAT没有该bit:
但在实际调试过程中,是有bit的职位和清除操作的,在切换过程中,该寄存器的值变化如
下:
3.程序拼接
注意:
bootloader和应用有效标志位内容虽相同,但不能同名。否则,编译生成的map文件内,看不到passive的bootloader和app_valid信息:
4.程序回滚
在更新后的程序存在重大bug,需要将程序回滚时,S32K3芯片的操作流程非常简单:
结束语:
本文主要介绍了本人在使用NXP芯片的HSe模块的过程中,实现AB swap的方法以及潜在失败原因。后续会继续更新关于NXP芯片使用过程中心得以及踩过的坑。希望大家能多多批评指正,多多支持,互相进步!