YTM32的flash存储器boot-swap功能详解
文章目录
Introduction
客户在开发量产型的ECU软件时,大多会考虑实现OTA
(在线更新)的功能,方便在将ECU设备装车之后,可以利用通信过程更新固件。OTA
的实现技术中,为了提升更新过程的安全性,避免在更新过程中因意外中断导致整个ECU软件系统崩溃,通常会考虑备份更新的方式,如果本次更新固件的过程被意外中断,MCU仍可启动至最近一次能够正常运行的固件中,故而在MCU的片内flash中实际会存放至少两份程序,A程序和B程序。
这两份程序存放在不同的存储区,在创建这些application
程序时,需要分别调整linker
地址,让A程序和B程序映射到指定对应不同的地址区才能正常运行。芯片在上电启动后进入bootloader
,经过信息安全检查、完整性检查、有效性检查等一些列判定条件之后,有选择地跳转到存放在不同地址的application
程序。而在更新程序的时候,也要分别更新不同区域的程序。
为了简化开发者和用户区分application
程序的A / B版本,有些专用于ECU的MCU,设计了硬件支持flash存储的AB面交换功能(boot swap
),对应于两块独立的但地址连续拼接的flash存储器(pflash0
和pflash1
),可以通过软件配置,指定哪块flash存储区被映射到0x0000_0000
开始的位置。如此,将用于更新的固件application
工程,其linker
可以不做调整,始终为一份工程。在bootloader
更新固件的过程中,将实际运行地址空间的程序,先写到备份flash存储区(例如flash的后半段)中,在更新成功完毕后,再执行boot swap
命令,将备份flash存储区映射到实际运行的地址空间(例如,flash地址区间的前半段)。复位芯片后,就会从备份转正的flash启动,执行新的application
了。如此,两个独立的存储区可互为备份。
Pricinple & Machenisim
以YTM32B1MD1
微控制器为例,介绍boot swap
的机制和用法。
YTM32B1MD1
微控制片上集成了2片容量为256KB
的flash
,称为pflash0
和pflash1
,总计512KB
。默认情况下,pflash0
被映射在0x0000_0000
开始的地址空间,pflash1
拼接在pflash0
之后。当执行了boot swap
命令后,复位,pflash1
的物理存储被映射到0x0000_0000
开始的地址空间,pflash0
拼接在pflash1
之后。
执行boot swap
命令的具体操作,就是向EFM
模块的CMD
寄存器中,写入boot swap
的命令码0x30
。如图x所示。
而在,EFM
模块的STS
寄存器中,可以通过查看BOOT_INFO
标志位,判定当前0x0000_0000
开始的区域映射到哪块pflash