一、背景
在做基于STM32等芯片产品开发时,经常面临需要开发升级功能,升级方法从大类来分,分成ISP和IAP,这两者的区别在此不再多说,现着重描述IAP功能。
IAP功能常规来说需要分别制作BOOT和APP两份代码。
BOOT功能大概包含有:
1:接收升级包
2:校验APP功能代码,跳转至APP
所以在APP代码开始处经常需要添加 中断向量偏移操作,如下:
SCB->VTOR = FLASH_APP_START_ADDR;
下面是将要介绍的完全不同思路的IAP升级方法。
二、芯片硬件环境
首先芯片需要满足特殊的Flash架构特性,手册描述如下,在此以STM32U575为例
其中Dual Bank 的地址分配
现已Flash 1M为例,每个bank 512K
Flash memory area | Flash memory corresponding bank | Start address | End address | |
SWAP_ BANK=0 | SWAP_ BANK=1 | |||
User main memory | Bank 1 | Bank 2 | 0x0800 0000 | 0x0807 FFFF |
Bank 2 | Bank 1 | 0x0808 0000 | 0x080F FFFF |
通过手册 FLASH option register (FLASH_OPTR)中Bit20置位,Bit21 默认为1,然后软复位,可将 Bank1 和 Bank2 交换运行。
通过读取 Bit 20 的值,可判断是 Bank1 还是 Bank2。
三、使用参考
一份代码包含接收升级包的功能,不区分BOOT和APP,集成在一起。
当 Bit20 = 0(默认设置),代码从Bank1开始运行,开始接收升级包,就将升级包从Bank2的首地址依次存放直到完全接收完毕。
接收完毕且校验通过之后,将 Bit20 置位为1,执行软复位。那么软复位之后,就会从Bank2地址的程序开始运行。
优势:
- 不需要人为中断向量偏移
- 只需编译一份代码
- 不需要考虑地址偏移带来的顾虑,
劣势:
1、Bank1和Bank2的空间大小是平均分配整个Flash,那么应用程序的大小不能超过Flash的一半
2、如果某个应用程序需要有单独的一些特殊信息存放,那么Bank1和Bank2均处保存一份,最好在每个Bank的最后一个page