引言
随着对系统功能、性能要求的不断提高,或为了消除缺陷,用户常常需要对嵌入式终端设备软件进行升级。目前嵌入式终端软件升级方法有专用工具烧写、在系统编程(ISP)和在应用编程(IAP)等。前两种方式需要专门的人员到达现场、甚至拆卸设备才能进行软件升级。IAP方式可由开发人员根据实际应用进行灵活设计,例如使用串口升级、USB升级等。
由于车载终端具有移动性、分布广泛、无法集中召回等特点,传统软件升级方案显得束手无策。远程软件升级方案能够为系统维护提供极大的方便,目前主流使用基于GPRS的IAP方式,但通常需要支付给运营商一定的费用。
根据某单位车辆管理系统的实际情况,本文设计出一种基于WiFi的远程软件升级方法。具有简单、便捷、可靠、成本低等优点。
1 系统原理
系统结构如图1所示。该单位有若干分部,每个分部独立管辖所属的车辆,每个车辆装载一套终端,用于记录车辆行驶信息。当车辆外出执行任务及返回经过车场门口时,与车场门口的数据采集设备通过WiFi进行数据交互。各分部数据采集设备连接至互联网与总部进行数据交互。
终端设备MCU采用STM32F107芯片,该芯片是意法半导体公司基于ARM Cortex—M3的32位嵌入式处理器,主频达72 MHz、90DMIPS。它具有256 KB闪存程序存储器、20KB的数据存储器及64 KB RAM。外围接口丰富,价格仅与8位单片机相当,性价比极高。
WiFi模块采用RedPine公司的RS9110-N-11-02模块,该模块通过SPI接口与MCU通信。RS9110-N11-02模块为IEEE 802.11b/g/n WLAN设备,集成MAC、基带处理器、幅值可调RF收发器、频率参考和天线等。硬件模块嵌入了网络协议栈、WLAN协议和配置功能,构成一个完整的802.11n WLAN解决方案。
系统软件升级工作过程如下:
①通过以太网把编译好的新软件传输到各分部数据采集设备上;
②车辆外出或返回时途经车场门口数据采集设备WiFi网络覆盖区域;
③车辆终端设备通过WiFi网络连接到数据采集设备,如需要则进行新软件下载;
④车辆终端执行新软件。
2 软件升级方法及流程
STM32F107内部FLASH存储器地址以0x08000000开始,共256K。为了在线升级,将该FLASH存储器如图2所示划分为BOOT区、应用程序区、临时区、参数存储区。
其中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 rcquest(RRQ);
②Write rcquest(WRQ);
③Data(DATA);
④Acknowledgment(ACK);