基于WiFi的车载终端远程软件升级方法
2014-09-06贺翔陈崇森
贺翔,陈崇森
(广州海格通信集团股份有限公司,广州 510000)
基于WiFi的车载终端远程软件升级方法
贺翔,陈崇森
(广州海格通信集团股份有限公司,广州 510000)
为克服车载嵌入式设备难以集中回收进行软件升级的缺点,提出了一种基于WiFi通信的远程软件升级方法。该方法对微控制器FLASH存储空间进行有效分配,设计IAP功能,利用WiFi通信接口采用TFTP协议下载新软件到FLASH,实现嵌入式软件在线升级。给出了升级方法的详细设计和程序流程,升级速度快,受环境影响小。该方法可应用于移动分布式嵌入式设备中。
嵌入式设备;在线升级;自举; IAP; STM32;WiFi
引 言
随着对系统功能、性能要求的不断提高,或为了消除缺陷,用户常常需要对嵌入式终端设备软件进行升级。目前嵌入式终端软件升级方法有专用工具烧写、在系统编程(ISP)和在应用编程(IAP)等[1]。前两种方式需要专门的人员到达现场、甚至拆卸设备才能进行软件升级。IAP方式可由开发人员根据实际应用进行灵活设计,例如使用串口升级、USB升级等[2-3]。
图1 系统结构图
由于车载终端具有移动性、分布广泛、无法集中召回等特点,传统软件升级方案显得束手无策。远程软件升级方案能够为系统维护提供极大的方便,目前主流使用基于GPRS的IAP方式,但通常需要支付给运营商一定的费用。
根据某单位车辆管理系统的实际情况,本文设计出一种基于WiFi的远程软件升级方法。具有简单、便捷、可靠、成本低等优点。
1 系统原理
系统结构如图1所示。该单位有若干分部,每个分部独立管辖所属的车辆,每个车辆装载一套终端,用于记录车辆行驶信息。当车辆外出执行任务及返回经过车场门口时,与车场门口的数据采集设备通过WiFi进行数据交互。各分部数据采集设备连接至互联网与总部进行数据交互[4]。
终端设备MCU采用STM32F107芯片,该芯片是意法半导体公司基于ARM Cortex-M3的32位嵌入式处理器,主频达72 MHz、90 DMIPS。它具有256 KB闪存程序存储器、20 KB的数据存储器及64 KB RAM[5]。外围接口丰富,价格仅与8位单片机相当,性价比极高。
WiFi模块采用RedPine公司的RS9110-N-11-02模块,该模块通过SPI接口与MCU通信。RS9110-N-11-02模块为IEEE 802.11b/g/n WLAN设备,集成MAC、基带处理器、幅值可调RF收发器、频率参考和天线等。硬件模块嵌入了网络协议栈、WLAN协议和配置功能,构成一个完整的802.11n WLAN解决方案。
系统软件升级工作过程如下:
① 通过以太网把编译好的新软件传输到各分部数据采集设备上;
② 车辆外出或返回时途经车场门口数据采集设备WiFi网络覆盖区域;
③ 车辆终端设备通过WiFi网络连接到数据采集设备,如需要则进行新软件下载;
④ 车辆终端执行新软件。
图3 软件升级流程
2 软件升级方法及流程
图2 FLASH存储空间划分
STM32F107内部FLASH存储器地址以0x08000000开始,共256K。为了在线升级,将该FLASH存储器如图2所示划分为BOOT区、应用程序区、临时区、参数存储区[7]。
其中BOOT区用于存放系统自举程序,应用程序区用于存放用户应用软件,临时区用于临时存储正在下载的软件,参数存储区用于存储程序升级时所使用的标志及其他系统参数。
软件升级标志定义如下:正常模式、升级模式及拷贝模式。正常模式标志着无需进行软件升级,直接跳转到应用程序区执行;升级模式标志着终端需要下载新的应用程序;拷贝模式用于在软件下载完毕后拷贝到应用程序区,将该部分功能独立出来是为了在软件下载完毕后拷贝到应用程序区时出现突然断电等故障时进行故障恢复。
终端处于WiFi信号范围时,接入WiFi网络与数据采集设备进行信息交互。如图3所示,软件升级流程如下:
① 接收到版本号查询指令,回复本终端软件版本号给数据采集设备;
② 若版本号为最新,流程结束,否则会接收到数据采集设备发来的软件升级指令;
③ 修改参数存储区存储的软件升级标志为升级模式,复位MCU;
④ MCU从BOOT区启动;
⑤ 读取软件升级标志,如是“正常模式”,判断应用程序区是否有应用程序,若有则跳转到应用程序区执行,若无则置软件升级标志为“升级模式”,复位MCU,跳转到步骤④;
⑥ 若软件升级标志是“拷贝模式”,拷贝临时区软件到应用程序区,修改软件升级标志为正常模式,复位MCU,跳转到步骤④;
⑦ 若软件升级标志是“升级模式”,则扫描并接入WiFi网络;
⑧ 使用TFTP协议下载新软件到临时区;
⑨ 校验新软件是否正确,若不正确则跳转到步骤⑧,若正确则执行下一步;
⑩ 修改软件升级标志为“拷贝模式”,复位MCU,跳转到步骤④。
3 软件实现
升级软件主要由版本号比较、软件复位、软件下载及校验、拷贝软件到应用程序区、软件跳转到应用程序区几部分组成。
(1) 版本号比较
每个版本的软件需要有不同的版本号,按照一定规则递增,如数据采集设备上有2.0版本软件比本终端1.0版本高,则据此进行软件升级。
(2)软件复位
根据本设计,软件需要复位进入BOOT区进行一系列操作。通过使STM32内部中断应用和复位控制寄存器中的SYSRESETREQ位置1,即可实现软件复位。
(3)软件下载及校验
采用TFTP协议下载应用软件到MCU临时区。TFTP用于发送较小的文件时实现简单,可靠性高。其下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512字节。发送双方采用超时重传机制。数据传输模式可选为octet模式(二进制模式)。
TFTP支持6种类型的数据包,分别是:
① Read request (RRQ);
② Write request (WRQ);
③ Data (DATA);
④ Acknowledgment (ACK);
⑤ Error (ERROR);
⑥ OACK。
目前常用的是前5种。由于系统只需实现终端从数据采集设备上下载软件文件,无需实现完整的TFTP协议,仅实现上述第1、3、4、5类数据包功能即可。主要定义以下4个接口函数:
① RRQ发送接口函数定义:
void tftpReadQuerry(void);
该函数用于终端发送读文件请求,数据采集设备收到该包将发送文件数据包给终端;
② 数据包接收接口函数定义:
void tftp_recvpacket(void);
该函数用于接收数据采集设备发送到的包,根据包类型分别对ERROR包、DATA包进行处理。如果是ERROR包则需要重新传输文件,本次传输失败。如果是DATA包,则校验后根据包号存储到FLASH指定位置,然后调用发送ACK函数回复ACK。掉包、错包等的错误处理也在该函数执行;
③ ACK发送接口函数定义:
void tftpSendAck(unsigned charBlockNo[2]);
该函数用于根据接收到的包的编号回复ACK。
④ ERROR包接口函数定义:
void tftpSendErr(unsigned char BlockNo[2]);
该函数用于返回传输错误信息。
文件传输实现流程如下:
① 数据采集设备在端口为69的UDP上等待终端发出读文件请求包;
② 终端通过UDP发送符合TFTP请求格式的RRQ包给数据采集设备;
③ 数据采集设备收到终端的这个请求包后,将直接发送DATA包给终端,这个DATA包中含数据采集设备选择的TID作为UDP的源端口和终端的TID作为UDP目标端口,起始包号为1,往后包号逐次加1。
④ 终端接收来自数据采集设备的DATA包并回复ACK。直到请求完成。
传输过程中的掉包或包错误会导致重传,重传不超过三次,否则认为传输失败。传输过程中的错误,会触发发送ERROR包。ERROR包的错误代码值供程序员分析使用。
(4) 拷贝软件到应用程序区
软件正确的下载到临时区后,需要拷贝到应用程序区。该部分关键部分在于STM32内嵌FLASH的擦除与读写。
STM32F107内嵌FLASH是通过分页机制来实现对寻址空间的扩展和FLASH页面的使用和管理的。所以对FLASH的擦除操作需要按页进行擦除。即擦除FLASH不能擦除某一字节或一次擦除小于一页(2 048字节)。
FLASH擦除的具体步骤:
① 解锁FLASH编程控制寄存器;
② 定位要擦除的扇区;
③ 写扇区擦除命令;
④ 等待命令执行完成;
⑤ 锁定FLASH编程控制寄存器。
对FLASH执行写操作步骤如下:
① 解锁FLASH编程控制寄存器;
② 向指定的地址写若干字数据;
③ 等待上一条命令执行完成;
④ 如果未写完数据,则递增源地址和目标地址,重复步骤②和③;
⑤ 锁定FLASH编程控制寄存器。
(5)软件跳转应用程序区
应用程序准备好后,程序需要从BOOT区跳转到应用程序区首地址处执行应用程序。这里分为两步:
① 修改中断向量表位置。由于STM32F107采用ARM Cortex-M3内核,该内核的系统控制空间中写中断向量表的寄存器地址NVIC_VectTab_Addr为0xE000ED08,在该地址写入应用程序起始地址即可,本程序应用程序起始地址APP_START_ADDRESS为0x08005000。设计如下:
ldrr0, =0x08005000
ldrr1, =0xe000ed08
strr0, [r1]
② 跳转到应用程序首地址处执行应用程序。该步骤完成堆栈指针和程序指针(PC)的修改。在上述汇编代码之后,通过以下方式实现:
; 从应用程序向量表中载入堆栈指针
ldrr1, [r0]
mov sp, r1
;从应用程序向量表中初始化程序指针(PC),并跳转到应用程序
;入口
ldrr0, [r0, #4]
bxr0
为保证软件升级错误不导致系统崩溃,将终端程序隔离为引导程序(BOOT区程序)及应用程序两部分,如单次软件升级失败仍可进行再次升级。两部分程序分别在Keil中编译,并把BOOT区程序烧写在FLASH首地址0x08005000处,以便终端启动直接进入BOOT区。用于应用程序编译时需设定烧写地址为应用程序区首地址,并生成bin文件以便直接下载到FLASH中即可运行。
结 语
该方法实现了采用WiFi通信方式,通过TFTP协议将编译后的软件文件下载到终端设备,完成软件升级的功能。在嵌入式系统领域,程序升级可以方便地对程序缺陷进行弥补和修改,或对程序功能进行扩充,运用该方法可极大提高产品的生存周期,节省对项目的维护成本和提高了开发效率。
[1] 孟志强,朱良焱,石瑜. 基于IAP和USB技术的嵌入式程序升级方法[J]. 湖南大学学报, 2009, 36(6): 41-44.
[2] 赵会宾,田庆春. 利用LPC2214 的IAP 功能实现程序远程更新[J]. 无线电工程, 2006, 36(7): 53- 55.
[3] 施文灶,王平,黄晞,等. 基于USB的便携式设备固件升级程序的设计[J]. 电子设计工程, 2009, 17(11): 4-6.
[4] 高时兵,马宏平,陈建福. C8051F130的远程在线升级程序设计[J]. 单片机与嵌入式系统应用, 2008(9): 27-30.
[5] STMicroelectronics Inc. STM32F107XX DataSheet, 2009.
[6] RedPine Inc. RS9110-N-11-22 DataSheet 2.0, 2012.
[7] 叶子健,王健. 一种新的程序在线升级的实现[J]. 电子器件, 2011, 34(1): 108-111.
贺翔(助理工程师),主要从事嵌入式系统方案的设计与开发;陈崇森(中级工程师),主要从事嵌入式硬件及驱动程序开发。
Remote Software Upgrade Method Based on WiFi for Vehicle Terminal
He Xiang,Chen Chongsen
(Guangzhou Haige Communications Group Incorporated Company, Guangzhou 510000, China)
To overcome the difficulty of gathering all automotive embedded devices to upgrade software, this paper proposes a remote software upgrade method based on WiFi Communication. The method allocates the microcontroller FLASH memory space effectively, and designs IAP function by using WiFi communication interface to download new software to FLASH memory. This article gives a detailed design and program flow method. This method can be applied to distributed embedded mobile devices.
embedded device; online upgrade; Bootstrap program; IAP; STM32;WiFi
TP311
A
珍
2013-12-14)