HAL库----IAP在线升级

我们在开发与生产过程中烧录程序主要是用J-link、ST-link等设备通过串口进行烧录。一款设备在出厂后由于各种原因不方便被用户拆壳,但程序有时需要升级该怎么?这个时候就需要用到我们今天讨论的话题——IAP在线升级功能了。
一. 首先是IAP功能实现的原理,简单来说IAP其实就是对FLash的操作,我们只要懂得对FLash的读、写、跳转与重映射中断向量表就可以满足编写IAP功能程序需要了。完整的IPA功能需要两部分代码:Bootloader+APP(为了方便书写下面的BootLoader我就全部用BOOT代替了)。其中APP程序就是我们用来实现设备各种功能的程序,而BOOT的作用就是在Flash中对APP程序的读、写与跳转功能了。
二. 接下来我们来讨论一下实现IAP功能的逻辑与程序的编写。
1.首先我们要确定BOOT与APP程序存储在Flash的什么位置,以STM32L4为例。首先我们要留出足够的空间存放BOOT的程序与各种标志,并且设备上电后要先进入BOOT中进行"跳转到APP/更新APP"的判断,所以一般BOOT要在中断向量表默认的起始地址0x08000000,APP地址为0x08001000(假设BOOT代码大小为3K,留出1K大小的FLash空间存储各种标志)。
2.检测更新标志。在BOOT主循环中需要检测是否有更新APP标志SET_FLAG_DATA,如果检测到标志就更新APP;如果没有检测到更新APP标志SET_FLAG_DATA,则直接进行第6步跳转APP程序。HAL库----IAP在线升级
3.擦除Flash。擦除APP程序在Flash中存储的位置(注意:只有擦除后才能写入,所以一般是擦除APP存储的位置到Flash结束的位置),并且配置页擦除中Flash页的大小FLASH_PAGE_SIZE,不同型号的开发板每页的发小不一样,本文中所用开发板Flash页的大小为128字节。HAL库----IAP在线升级
4.写Flash。需要把APP的程序写入到Flash中(本文写在地址0x08010000—0x08020000之间)如何获取APP程序本文就不加以赘述,下面看代码。
HAL库----IAP在线升级5.如果Flash写入成功就擦除更新APP标志SET_FLAG_DATA,如果写入失败就从第2步开始在做一遍。下面是擦除更新标志的程序:
HAL库----IAP在线升级

6.接下来就可以跳转APP程序了,具体程序如下:
HAL库----IAP在线升级

7.这一步开始操作需要在APP程序的工程中进行,首先是设备自身的功能这里就直接跳过。在这里我们首先要设置接到上位机命令后在FLASH_UPDE_ADDR(更新标志所在地址)位置写入更新APP标志SET_FLAG_DATA,并重启设备或是跳转到BOOT所在地址:0x08000000。
注意:APP的中断向量表要重映射到APP程序所在的起始地址,本文为0x08010000
HAL库----IAP在线升级

8.最后分别把BOOT程序和APP程序分别烧录到设备的0x08000000与0x08010000地址就完成了。
注:另外有的朋友用标准库实现IAP功能,如果开发板是Cortex M0内核的话可能会发现不能像Cortex-m3/m4内核的单片机那样通过设置SCB->VTOR 寄存器的值来实现中断向量表的重映射。
HAL库----IAP在线升级

解决方法可以参考这个链接:https://www.cnblogs.com/outs/p/4948134.html