STM32的IAP(In Application Programming,应用中编程)是一种允许在MCU正在运行的应用程序中更新其闪存存储器中的固件的功能。IAP技术允许在不使用外部编程器或烧录器的情况下,通过内部或外部通信接口(如USART、USB、CAN、以太网等)接收新的固件数据,并将其写入到MCU的闪存中。
IAP实现步骤概览:
分区规划:
•在STM32的闪存中划分为至少两个区域:Bootloader区和Application区。Bootloader程序位于ROM的低端地址,而Application程序位于更高的地址。
- Bootloader设计:
•Bootloader程序是实现IAP的关键部分,它在系统启动时首先被执行,具备通过通信接口接收新固件数据的能力。
•Bootloader通常包含通信协议的解析、数据校验、擦除和编程闪存等功能。
- 数据接收:
•通过选定的通信接口接收新固件数据,数据通常经过压缩、加密并带有校验和以确保数据完整性。
- 闪存擦除与编程:
•Bootloader在收到新固件后,先擦除Application区的闪存块,然后按照闪存页(通常是几百字节)的方式逐页接收新固件数据并写入到相应的闪存地址。
- 跳转执行新固件:
•在新固件写入完成后,Bootloader通过更改向量表的位置或通过软件机制跳转到新固件的起始地址执行新程序。
- 安全措施:
•为了防止意外或恶意的固件更新,通常还会加入安全措施,如密码验证、签名验证等,确保只有合法和未被篡改的新固件才能被写入。
实现细节:
•在STM32中,可以通过STM32CubeMX工具对闪存进行分区,并配置BOOT引脚来决定设备启动时是运行应用还是进入Bootloader模式。
•编写Bootloader时,需使用STM32 HAL库或直接操作闪存寄存器进行擦除和编程操作,同时实现通信接口的接收和发送功能。
•应用程序更新过程中,通常需要保留原有的Bootloader不受影响,以免在更新失败时无法恢复。
图片
示例流程:
上位机通过通信接口发送更新请求和新的固件数据包。
2. STM32的Bootloader接收到请求后,确认更新指令,并开始接收数据。3. 数据接收完成后,Bootloader验证数据的有效性和完整性。
-
验证通过后,Bootloader擦除目标闪存区域,并将新固件数据写入闪存。
-
写入完成后,Bootloader设置MCU重新启动,使其跳转到新固件的起始地址执行。
STM32通过IAP技术就能在运行过程中实现固件的更新,这对于远程升级、现场维护以及提高产品生命周期内的功能扩展和安全性至关重要。
几乎所有的STM32系列单片机都具有实现IAP(In Application Programming)功能的潜力,因为IAP本质上是通过软件实现的一种功能,而非依赖于硬件本身的特定特性。只要单片机有足够的闪存空间来存放 bootloader 和应用程序,并且支持通过某种通信接口(如USART、USB、SPI、I²C等)接收数据,理论上都可以实现IAP功能。
大部分STM32单片机的闪存都是基于Flash Memory组织的,而且大多数型号的STM32单片机都有至少两个或以上的闪存扇区,可以划分一个扇区用来存放bootloader,剩余扇区存放用户应用程序。在bootloader中实现数据接收和Flash编程的代码后,即可实现IAP功能。
具体型号的选择可以根据项目的实际需求,如所需的内存大小、外设功能、通信接口以及性能等多方面因素来确定。例如,STM32F103、STM32F4、STM32F7、STM32H7、STM32L4以及STM32G4等多个系列的单片机均广泛应用于IAP应用中。在实际应用中,开发人员只需要确保所选单片机能支持所需的通信接口和足够的存储空间来存放bootloader和应用程序即可。