1、前言
STM32 MCU 双 Bank 功能有利于固件升级的实现。例如,新固件可以被写入在未运行的bank 中,而当前 bank 仍然运行旧固件;升级完成后,可以对新固件进行试运行,不合格则进行回滚;合格的话则可以简单地切换到新固件,减少了系统的停机时间。那么,对于 Security 用户,如果也使用双 Bank 功能,会带来一些问题,例如,入口地址发生变化,不符合安全启动的入口地址唯一化的原则;其次,双 Bank 切换也要求对两个Bank 进行正确的同样设置,否则,Bank 切换会导致 Security 漏洞;最后,OEMiROT 并没有提供双 Bank 切换的参考代码。但是,即使是安全升级,依然需要备份回滚的功能,例如,客户希望,新固件写入在未运行的区域,而当前的区域仍然运行旧代码;升级完成后,可以对新固件进行试运行,不合格则进行回滚;合格则保留。
OEMiROT 是可以支持这样的需求的。OEMiROT 的 SWAP 功能能够对新固件进行试运行,当用户确认后,系统默认引导新程序,否则继续使用旧固件。
2、STM32H563 OEMiROT 的默认行为
OEMiROT 的默认行为 Overwrite。也就是新的固件会覆盖旧的固件。这个可以从OEMiROT_S_Code_Image.xml 或者 OEMiROT_NS_Code_Image.xml的内容可以看出,例如,对于 OEMiROT_NS_Code_Image.xml 有以下配置。
3、修改成支持 SWAP
OEMiROT 基于 MCUBoot 开发了相应的工具,能够非常方便的进行是否支持 SWAP 的功能。只需要注解掉位于STM32CubeRepositorySTM32Cube_FW_H5_V1.3.0ProjectsNUCLEOH563ZIApplicationsROTOEMiROT_BootInc的 flash_layout.h 中的宏MCUBOOT_OVERWRITE_ONLY。
4、小结
我们可以看到,使用 STM32Cube 生态系统很容易根据客户自己的升级需求对 OEMiROT 的固件升级行为进行定制,例如,采用默认的覆盖模式或者支持升级后确认或者备份回滚的功能。
445