摘要:为了实现嵌入式系统程序的在线升级,提出一种基于IAP在线编程的程序更新方法。
以STM32L431控制器为例,该方法对控制器的片内FLASH进行区域划分,分别存放引导程序、执行程序及待更新程序。
系统通过运行引导程序将待更新程序更新到执行程序的FLASH区域,程序更新成功后跳转至新的执行程序运行。
该设计成功实现了FLASH程序的在线更新并进行了实验验证,其操作简单、速度快、正确率高。
引言
当今社会,嵌入式系统已经广泛应用于各行各业,人们对嵌入式产品的要求也越来越高。
由于嵌入式系统软件需要经常更新才能更加适应环境变化,满足日常功能所需,所以在线更新升级程序的技术就显得很重要。
传统的程序升级方法需要将调试工具通过线缆连接到电路板上的JTAG接口,对微处理器进行程序下载更新,这种方法需要重新拆卸组装设备,影响系统的可操作性。
IAP技术简介
传统的单片机在线编程方式有ICP、ISP和IAP三种。
ICP编程需要将单片机芯片外接在线仿真器才可进行编程。
ISP与IAP技术都只需要单片机内置Bootloader进行程序引导实现编程。
ISP编程通信方式较为简单,其系统内部自带Bootloader程序,只需在系统运行前由Bootloader通过通信端口进行程序更新和原有数据擦除。
IAP的Bootloader由用户设计,且是在系统运行过程中操作,主要通过对FLASH写入Bootloader程序之后运行系统,使用户程序在 Bootloader的引导下对 FLASH 烧写和擦除数据。
本设计将FLASH趋于分为两个主要部分:Boot-loader和FLASH_APP。
为了避免程序失败使当前运行程序停止,将FLASH_APP细化为FLASH_APP_A和FLASH_APP_B,用来存放执行程序和待更新程序。
当系统通电后,先执行Bootloader代码,该程序主要具备两个功能:
- 引导用户程序FLASH_APP的远程更新。
- 向用户程序FLASH_APP跳转。
若有程序更新指令下达,则将FLASH_APP_B区中的代码转移到FLASH_APP_A区进行更新,然后跳转至更新成功的FLASH_APP_A中执行用户程序;若没有更新指令或更新失败,则继续执行FLASH_APP_A区中的程序。
硬件设计
主要包括主控芯片、时钟电路、复位电路、电源电路、JTAG接口电路。
系统上电后,上位机借助JTAG调试器将Bootloader程序烧写至嵌入式系统,烧写成功后,上位机软件通过USB串口将生成的BIN文件写入,并下发程序更新等各种指令。
Bootloader只需烧写一次,后续程序更新将相关 BIN 文件通过串口引导至指定 FLASH 区域即可。
FLASH区域划分
FLASH 程序空间被分为3段空间用来实现程序更新,分 别 为 Bootloader 空 间、FLASH_ APP_ A 空 间 和FLASH_APP_B 空间。
Bootloader软件设计
嵌入式在线升级系统包含上位机控制系统和嵌入式设备终端两部分。
上位机主要是将编译完成的烧写文件打包处理,发送至嵌入式设备。
嵌入式设备接收时先寄存代码帧的帧个数和帧计数,然后判断数据帧的帧头和校验和。
若校验和正确,将该帧的源码写入FLASH_APP_B对应空间,将帧计数反馈给上位机计算更新进度。
例如,程序源码为20KB,每1KB为1帧,若当前反馈第12帧,则计算后的更新进度为60%,源码下发的帧间隔为300ms,当更新进度100%后显示更新完成。
更新成功后,将FLASH_APP_B程序完整地拷贝到FLASH_APP_A空间,同时将程序版本写入FLASH对应的空间,加锁FLASH,跳转至对应FLASH_APP空间的函数入口。
程序更新完成后,嵌入式设备给上位机发送反馈帧命令,并将写入FLASH的数据校验码返回给上位机,上位机收到校验码并校验无误后,结束与嵌入式设备的通信。
嵌入式系统在线升级的关键部分在于Bootloader引导程序的设计。
在本次提出的IAP在线编程中,将引导程序功能分为3个状态进行分析,分别为空闲态、跳转态以及升级态。
“空闲态”为系统上电时,Bootloader软件处于等待状态,当接收到上位机指令后,进入下一状态。
“升级态”时主要完成FLASH执行程序区域的擦除和烧写操作,重新读取执行程序区的数据并进行检验,将结果反馈给上位机。
状态转换只有空闲态转升级态、空闲态转跳转态、升级态转跳转态3种。
程序软件配置
打开Bootloader工程文件,在Keil中设置IROM1Start:0x08000000;Size:0x8800。
打开FLASH_APP工程文件,设 置 “IROM1Start:0x08009800;Size:0x1C000”。
同时,修改void SystemInit(void)函数,设置对应区域的中断向量表,程序如下: