IAP 程序升级原理解析
参考见:IAP升级 资料收集-CSDN博客
一、IAP是什么?
IAP(In Application Programming,在应用编程)是一种技术,它允许在设备运行过程中通过软件对固件进行更新。这种更新方式不需要使用特殊的硬件编程器或者移除芯片,因此也被称为在线编程或空中下载技术(OTA, Over-The-Air)。IAP升级对于物联网设备、嵌入式系统等非常重要,因为它允许在产品部署后进行功能更新或修复错误。
二、为什么使用IAP?
如果芯片内没有程序的话,无法直接进行烧录。因此,在使用J-Link或其他编程器进行烧录代码时,通常情况下芯片中至少有一部分程序作为引导加载程序(Bootloader)。不过,需要注意的是,不是所有的芯片出厂时都带有内置的Bootloader。对于某些芯片,如STM32系列,它们可能包含了一个简单的Bootloader,但更多的是需要用户自己编写一个Bootloader来实现特定的固件升级功能。
当我们购置一块STM32芯片时,它可能不自带Bootloader。在实际的工业生产中,为了实现远程固件升级,我们需要自行编写一个Bootloader来升级应用程序代码(App Code)。Bootloader的主要任务是接收和验证固件更新数据,并将其写入到闪存中适当的位置。
Bootloader是一个小型程序,负责管理固件的更新过程。它通常包括检测更新、接收更新数据、验证数据完整性以及将新固件写入闪存等任务。App Code (User Application)是设备的主要功能实现部分,即用户编写的用于实现特定功能的代码。
在闪存flash的分区上,一般建议将闪存的前64KB用来存放Bootloader程序,这部分空间不会被应用程序覆盖,以确保Bootloader始终可用。剩余的空间则用于存放应用程序代码(App Code)和其他数据。
如下面的flashboot.jlink文件设置:
USB
si SWD
speed 4000
device R7FA6M4AD
r
erase 0x00 0xffff # 0xffff = 65535
loadfile Boot_V1.bin 0x0
r
go
quit
在实际应用中,Bootloader可能需要实现以下功能:
- 通过某种通信接口(如串口、USB、网络等)接收固件更新数据。
- 验证接收到的数据(如使用CRC校验、数字签名等)。
- 将验证过的固件数据写入到闪存的适当位置。
- 更新完成后,重启系统并跳转到新的应用程序代码开始执行。
二、IAP升级的工作原理
IAP升级的基本思想是在设备中预先安装一个小型的程序,称为Bootloader。这个Bootloader负责管理固件的更新过程。典型的IAP升级过程包括以下几个步骤:
-
分区管理:
- 通常,固件所在的闪存(Flash Memory)会被划分为多个区域。其中一个区域用于存储Bootloader,其他区域则用于存储应用程序代码(App Code)和其他数据。
-
Bootloader的功能:
- 检测更新: Bootloader检查是否有可用的更新文件。
- 数据接收: 通过某种通信接口(如串口、USB、以太网等)接收更新文件。
- 验证: 对接收到的数据进行验证,确保数据完整无误。
- 更新: 将新的固件写入到指定的闪存区域。
- 跳转: 更新完成后,Bootloader会跳转到新的固件地址执行更新后的代码。
-
应用程序代码:
- 应用程序代码是设备的主要功能实现部分。
- 当Bootloader完成更新后,它会跳转到应用程序代码继续执行。
-
异常向量表重定位:
- 由于应用程序的起始地址可能会改变,因此在跳转到新的应用程序之前,可能需要重新定位异常向量表以确保中断和异常能够被正确处理。
三、实现IAP升级的关键技术
- 通信协议: 选择合适的通信协议(如SPI、I2C、UART、TCP/IP等)来传输更新数据。
- 安全措施: 保证数据传输的安全性,例如使用CRC校验、数字签名等技术来验证数据的完整性和真实性。
- 闪存管理: 包括扇区擦除、数据写入等操作。
四、示例
以STM32单片机为例,实现IAP升级通常涉及以下步骤:
-
Bootloader开发:
- 编写用于接收和验证更新数据的代码。
- 实现闪存管理和异常向量表重定位等功能。
-
应用程序开发:
- 开发主应用程序代码。
-
通信接口配置:
- 设置用于数据传输的通信接口。
-
固件更新流程:
- 设计固件更新的整体流程,包括检测更新、接收数据、验证和更新。