摘要:本方案实现了一种以ST公司的STM32F103ZET为平台的嵌入式系统软件远程升级方案,此方案以IAP技术为主要基础,通过移动数据网络对MCU(指代STM32,下同)程序存储区进行实时更新,并支持断点续传,有效地保证了嵌入式终端能够快捷、安全、稳定地进行固件远程升级。作为方案的技术支撑,本文还对STM32程序存储区的结构、BOOTLOADER的设计及从BOOTLOADER到用户程序的跳转过程等内容进行了详述。
连勋图片关键词:密云美食嵌入式;STM32;远程升级;断点续传
1.
引言
嵌入式终端因其灵活便利、性价比高、嵌入性强的特点,被广泛地应用在各个场所和行业,发挥着重要的作用。如今随着物联网的兴起和迅速普及,作为其中不可或缺的一环,市场对嵌入式终端的要求也随之变得更加灵活和全面。嵌入式终端实际应用过程中,无论是用户需求的变化,或是系统软件的修缮,均需要对终端固件进行升级。而传统的升级方法,则是由
工作人员到终端应用现场进行开箱或拆机,将终端通过UART、J-Link、USB等方式连接电脑后进行固件烧写。但由于嵌入式终端安装环境存在复杂多样的特点,这种升级方法不但人力成本和物力成本高,效率低下,并且在某些应用环境下(如高空、有毒、辐射等)进行人工升级还会对工作人员的人身安全产生威胁。
通过移动数据网络(以下称为GPRS)对嵌入式终端固件进行远程无线升级,则不存在上述问题。GPRS具有无需布线、实时在线、流量计费、成本低廉的特点,采用GPRS进行通信的的嵌入式终端,不仅能够缩减安装工作量,还大幅度降低了终端的维护成本,只要终端安装地点在GPRS的覆盖范围内,即具备远程升级固件的客观条件。本文将以ST公司的STM32F1xx系列为平台,介绍以IAP技术为主要基础的嵌入式终端无线升级方案的实现。本方案还针对偏远区域无线网络稳定性差、误码率高的问题,设计了严密的数据校验和可靠的断点续传机制,从而保证固件数据包能够完整无误地被终端接收,进而安全地进行IAP升级,保障终端的正常运行。此方案现已在蔗糖税控系统中得到验证和应用。
1.
系统框架
系统框架如下图所示。
嵌入式终端中,GPRS模块通过RS232总线与STM32的USART口连接,负责将接收到的移动网络数据传送给MCU,或是将MCU要发送的数据通过移动网络发至后台服务器;SD卡通过SPI总线与MCU连接,用于在终端接收固件时临时存放固件数据,以及保存固件更新进度、版本号等关键信息。
本地环境包括用于开发、编译终端固件的上位机,以及用于与终端进行数据交互的后台服务器。当需要更新终端固件时,由工作人员将终端固件从上位机上传至服务器并启动更新程序,接下来则由服务器通过透明传输模式,采用自定义通信协议与终端进行数据交流,直至固件更新完毕。
图1 系统框架图
1.
终端软件设计
1.
IAP技术
IAP是In Application Programming的首字母缩写,意指用户程序在运行过程中对程序存储区(以下称为flash)指定区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信接口对产品中的固件程序进行更新升级。
本方案所用主控芯片STM32F103ZET的内置flash物理地址范围为0x08000000至0x0807FFFF,容量为512KByte。为了实现IAP功能,现将flash从逻辑上划分为bootloader和app两个区域,划分结构如下图所示:
霍比特人和指环王什么关系页序 | 地址 | 大小(字节) | 区域名 | 区域大小(字节) |
0 | 0x08000000 - 0x080007FF | 2K | Bootloader | 64K |
1 | 0x08000800 - 0x08000FFF | 2K | ||
2 | 0x08001000 - 0x080017FF | 2K | ||
… | … | … | ||
31 | 0x0800F800 - 0x0800FFFF | 2K | ||
32 | 0x08010000 - 0x801007FF | 2K | App (Apllication) | 448K |
什么软件看电视最好33 | 0x08010800 - 0x80100FFF | 2K | ||
34 | 0x08011000 - 0x801107FF | 2K日本动画片排行榜 | ||
… | … | … | ||
255 | 0x0807F800 - 0x0807FFFF | 2K | ||
图2 STM32F103ZET flash区域划分示意图
从图2可以看到,引导程序(Bootloader)区域的起始地址为0x08000000,容量分别64KBbyte;固件(App)的起始地址为0x08010000,容量为448Kbyte。两者的容量可视实际情况进行划分,甚至可以划分多个固件区域,但起始地址必须是0x08000000 + 4n(n为大于0的整数)。
引导程序,在终端出厂前即通过J-Link烧录到指定区域(即引导程序区)。引导程序不负责终端的功能实现,而是对外设进行初始化,以及检查是否需要更新固件。若有需要更新的固件,则将新的固件数据写入固件区域,并在写入完毕后引导MCU跳转至固件;若没有需要更新的固件,则直接引导MCU执行固件程序。
固件作为是终端软件的主体部分,负责终端功能的实现,也负责通过GPRS与后台服务器进行交互,以接收、校验和保存新固件的数据。出厂固件可以在终端出厂前通过J-Link预先烧写,也可以将其保存在外置存储器,在终端启动后由引导程序自动进行烧写。
1.
1.
引导程序设计
如 3.1所述,STM32内部flash的起始地址为0x08000000,即引导程序的起始地址。终端上电复位后,MCU从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序后,跳转到引导程序的main函数中,开始执行外设初始化。
在外设初始化完毕后,程序读取SD卡中的指定地址的标志位,若标志位提示SD卡中存在需要更新的固件,则从SD卡中读取固件数据保存到临时buffer中(本文以SDHCv2为例,每次读取1个block,即512字节),然后将buffer中的每2个连续字节拼接为1个半字,按顺序写入划定的固件区域。每写完一个block的数据后,还需要分别将此block数据从flash中读出并进行一次CRC32计算和对比,以确保写入的数据准确无误。如此循环直至SD卡中保存的所有固件数据处理完毕。 图3 引导程序跳转及固件运行基本流程
发布评论