摘要:本方案实现了一种以ST公司的STM32F103ZET为平台的嵌入式系统软件远程升级方案,此方案以IAP技术为主要基础,通过移动数据网络对MCU(指代STM32,下同)程序存储区进行实时更新,并支持断点续传,有效地保证了嵌入式终端能够快捷、安全、稳定地进行固件远程升级。作为方案的技术支撑,本文还对STM32程序存储区的结构、BOOTLOADER的设计及从BOOTLOADER到用户程序的跳转过程等内容进行了详述。
关键词:嵌入式;STM32;远程升级;断点续传
1引言
嵌入式终端因其灵活便利、性价比高、嵌入性强的特点,被广泛地应用在各个场所和行业,发挥着重要的作用。如今随着物联网的兴起和迅速普及,作为其中不可或缺的一环,市场对嵌入式终端的要求也随之变得更加灵活和全面。嵌入式终端实际应用过程中,无论是用户需求的变化,或是系统软件的修缮,均需要对终端固件进行升级。而传统的升级方法,则是由工作人员到终端应用现场进行开箱或拆机,将终端通过UART、J-Link、USB等方式连接电脑后进行固件烧写。但由于嵌入式终端安装环境存在复杂多样的特点,这种升级方法不但人力成本和物力成本高,效率低下,并且在某些应用环境下(如高空、有毒、辐射等)进行人工升级还会对工作人员的人身安全产生威胁。
通过移动数据网络(以下称为GPRS)对嵌入式终端固件进行远程无线升级,则不存在上述问题。GPRS具有无需布线、实时在线、流量计费、成本低廉的特点,采用GPRS进行通信的的嵌入式终端,不仅能够缩减安装工作量,还大幅度降低了终端的维护成本,只要终端安装地点在GPRS基站的覆盖范围内,即具备远程升级固件的客观条件。本文将以ST公司的STM32F1xx系列为平台,介绍以IAP技术为主要基础的嵌入式终端无线升级方案的实现。本方案还针对偏远区域无线网络稳定性差、误码率高的问题,设计了严密的数据校验和可靠的断点续传机制,从而保证固件数据包能够完整无误地被终端接收,进而安全地进行IAP升级,保障终端的正常运行。此方案现已在蔗糖税控系统中得到验证和应用。
2系统框架
系统框架如下图所示。
嵌入式终端中,GPRS模块通过RS232总线与STM32的USART口连接,负责将接收到的移动网络数据传送给MCU,或是将MCU要发送的数据通过移动网络发至后台服务器;SD卡通过SPI总线与MCU连接,用于在终端接收固件时临时存放固件数据,以及保存固件更新进度、版本号等关键信息。
本地环境包括用于开发、编译终端固件的上位机,以及用于与终端进行数据交互的后台服务器。当需要更新终端固件时,由工作人员将终端固件从上位机上传至服务器并启动更新程序,接下来则由服务器通过透明传输模式,采用自定义通信协议与终端进行数据交流,直至固件更新完毕。
.png)
图1 系统框架图
3终端软件设计
3.1IAP技术
IAP是In Application Programming的首字母缩写,意指用户程序在运行过程中对程序存储区(以下称为flash)指定区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信接口对产品中的固件程序进行更新升级。
本方案所用主控芯片STM32F103ZET的内置flash物理地址范围为0x08000000至0x0807FFFF,容量为512KByte。为了实现IAP功能,现将flash从逻辑上划分为bootloader和app两个区域,划分结构如下图所示:
.png)
从图2可以看到,引导程序(Bootloader)区域的起始地址为0x08000000,容量分别64KBbyte;固件(App)的起始地址为0x08010000,容量为448Kbyte。两者的容量可视实际情况进行划分,甚至可以划分多个固件区域,但起始地址必须是0x08000000 + 4n(n为大于0的整数)。
引导程序,在终端出厂前即通过J-Link烧录到指定区域(即引导程序区)。引导程序不负责终端的功能实现,而是对外设进行初始化,以及检查是否需要更新固件。若有需要更新的固件,则将新的固件数据写入固件区域,并在写入完毕后引导MCU跳转至固件;若没有需要更新的固件,则直接引导MCU执行固件程序。
固件作为是终端软件的主体部分,负责终端功能的实现,也负责通过GPRS与后台服务器进行交互,以接收、校验和保存新固件的数据。出厂固件可以在终端出厂前通过J-Link预先烧写,也可以将其保存在外置存储器,在终端启动后由引导程序自动进行烧写。
1233.13.2引导程序设计
如3.1所述,STM32内部flash的起始地址为0x08000000,即引导程序的起始地址。终端上电复位后,MCU从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序后,跳转到引导程序的main函数中,开始执行外设初始化。
在外设初始化完毕后,程序读取SD卡中的指定地址的标志位,若标志位提示SD卡中存在需要更新的固件,则从SD卡中读取固件数据保存到临时buffer中(本文以SDHCv2为例,每次读取1个block,即512字节),然后将buffer中的每2个连续字节拼接为1个半字,按顺序写入划定的固件区域。每写完一个block的数据后,还需要分别将此block数据从flash中读出并进行一次CRC32计算和对比,以确保写入的数据准确无误。如此循环直至SD卡中保存的所有固件数据处理完毕。
.png)
图3 引导程序跳转及固件运行基本流程
固件数据写入完成后,跳转代码会将程序从引导区跳转到固件区。此跳转动作是通过修改强制修改PC寄存器(程序计数器)的值来实现的。
3.3远程升级模块设计
固件的实现基于多任务实时操作系统,使得嵌入式设备的主要功能模块与固件升级模块的运行互不影响。固件中远程升级模块的主要内容包括:接收固件数据、校验固件数据及保存固件数据,其工作流程如图4所示。
升级模块中实现断点续传的关键,在于服务器将固件分割为若干个数据包进行发送(在本例中每个数据包为512字节大小),且为每个数据包指定了序号,终端在接收、校验、保存每一个固件数据包后,将该数据包的序号保存到SD卡中,即使传输被长时间中断,终端也能够在接收到固件升级启动命令后,准确地告知服务器上次传输时断开的序号,服务器即可直接从上次传输时断开的位置开始继续发送剩下的数据包。
.png)
图4 在线升级模块工作流程
4服务器客户端设计
嵌入式设备的新固件上传至服务器后,由客户端对其进行大小统计、总包CRC32计算、分包及分包CRC32计算。当有设备需要升级时,用户在客户端上指定其ID号后,启动升级流程。客户端升级工作流程如图5所示。
5结束语
本设计采用自定义协议、CRC校验、应答机制等技术,通过移动数据网络,实现了对嵌入式终端系统固件远程升级的功能,为各类无人值守的自动化分布式采集/监控系统的节点升级及维护提供了可靠的解决方案。目前此方案已经成功地应用在广西糖厂税控系统中,该系统共安装嵌入式终端240多台,分布安装于广西全区内各糖厂中,位置分散且距离远,利用此方案对终端进行远程升级,极大减少了系统维护工作中人力物力成本的消耗。
参考文献
[1] Joseph Yiu. Cortex-M3权威指南, 2009
[2] STMicroelectronics. STM32F10XX参考手册, 2009
.png)
[3] STMicroelectronics. STM32闪存编程手册, 2009
[4] 宋柏彬. 基于嵌入式的GPRS无线通信系统研究[D]. 图5 服务器客户端工作流程
武汉理工大学, 2006
[5] 王涛. 物联网异构型节点自组网通信协议研究[D]. 电子科技大学, 2017.