RF/无线
随着对系统功能、性能要求的不断提高,或为了消除缺陷,用户常常需要对嵌入式终端设备软件进行升级。目前嵌入式终端软件升级方法有专用工具烧写、在系统编程(ISP)和在应用编程(IAP)等。前两种方式需要专门的人员到达现场、甚至拆卸设备才能进行软件升级。IAP方式可由开发人员根据实际应用进行灵活设计,例如使用串口升级、USB升级等。
由于车载终端具有移动性、分布广泛、无法集中召回等特点,传统软件升级方案显得束手无策。远程软件升级方案能够为系统维护提供极大的方便,目前主流使用基于GPRS的IAP方式,但通常需要支付给运营商一定的费用。
根据某单位车辆管理系统的实际情况,本文设计出一种基于WiFi的远程软件升级方法。具有简单、便捷、可靠、成本低等优点。
系统结构如图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网络连接到数据采集设备,如需要则进行新软件下载;
④车辆终端执行新软件。
STM32F107内部FLASH存储器地址以0x08000000开始,共256K。为了在线升级,将该FLASH存储器如图2所示划分为BOOT区、应用程序区、临时区、参数存储区。
其中BOOT区用于存放系统自举程序,应用程序区用于存放用户应用软件,临时区用于临时存储正在下载的软件,参数存储区用于存储程序升级时所使用的标志及其他系统参数。
软件升级标志定义如下:正常模式、升级模式及拷贝模式。正常模式标志着无需进行软件升级,直接跳转到应用程序区执行;升级模式标志着终端需要下载新的应用程序;拷贝模式用于在软件下载完毕后拷贝到应用程序区,将该部分功能独立出来是为了在软件下载完毕后拷贝到应用程序区时出现突然断电等故障时进行故障恢复。
终端处于WiFi信号范围时,接入WiFi网络与数据采集设备进行信息交互。如图3所示,软件升级流程如下:
①接收到版本号查询指令,回复本终端软件版本号给数据采集设备;
②若版本号为最新,流程结束,否则会接收到数据采集设备发来的软件升级指令;
③修改参数存储区存储的软件升级标志为升级模式,复位MCU;
④MCU从BOOT区启动;
⑤读取软件升级标志,如是“正常模式”,判断应用程序区是否有应用程序,若有则跳转到应用程序区执行,若无则置软件升级标志为“升级模式”,复位MCU,跳转到步骤④;
⑥若软件升级标志是“拷贝模式”,拷贝临时区软件到应用程序区,修改软件升级标志为正常模式,复位MCU,跳转到步骤④;
⑦若软件升级标志是“升级模式”,则扫描并接入WiFi网络;
⑧使用TFTP协议下载新软件到临时区;
⑨校验新软件是否正确,若不正确则跳转到步骤⑧,若正确则执行下一步;
⑩修改软件升级标志为“拷贝模式”,复位MCU,跳转到步骤④。
升级软件主要由版本号比较、软件复位、软件下载及校验、拷贝软件到应用程序区、软件跳转到应用程序区几部分组成。
(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);
⑤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 char BlockNo[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不能擦除某一字节或一次擦除小于一页(2048字节)。
FLASH擦除的具体步骤:
①解锁FLASH编程控制寄存器;
②定位要擦除的扇区;
③写扇区擦除命令;
④等待命令执行完成;
⑤锁定FLASH编程控制寄存器。
对FLASH执行写操作步骤如下:
①解锁FLASH编程控制寄存器;
②向指定的地址写若干字数据;
③等待上一条命令执行完成;
④如果未写完数据,则递增源地址和目标地址,重复步骤②和③;
⑤锁定FLASH编程控制寄存器。
(5)软件跳转应用程序区
应用程序准备好后,程序需要从BOOT区跳转到应用程序区首地址处执行应用程序。这里分为两步:
①修改中断向量表位置。由于STM32F107采用ARM Cortex—M3内核,该内核的系统控制空间中写中断向量表的寄存器地址NVIC_VectTaD_ Addr为0xE000ED08,在该地址写入应用程序起始地址即可,本程序应用程序起始地址APP_START_ADDRESS为0x08005000。设计如下:
ldr r0,=0x08005000
ldr r1,=0xe000ed08
Str r0, [r1]
②跳转到应用程序首地址处执行应用程序。该步骤完成堆栈指针和程序指针(PC)的修改。在上述汇编代码之后,通过以下方式实现:
;从应用程序向量表中载入堆栈指针
ldr r1, [r0]
mov sp,r1
;从应用程序向量表中初始化程序指针(PC),并跳转到应用程序
;入口
ldr r0, [r0,#4]
bx r0
为保证软件升级错误不导致系统崩溃,将终端程序隔离为引导程序(BOOT区程序)及应用程序两部分,如单次软件升级失败仍可进行再次升级。两部分程序分别在Keil中编译,并把BOOT区程序烧写在FLASH首地址0x08005000处,以便终端启动直接进入BOOT区。用于应用程序编译吋需设定烧写地址为应用程序区首地址,并生成bin文件以便直接下载到FLASH中即可运行。
该方法实现了采用WiFi通信方式,通过TFTP协议将编译后的软件文件下载到终端设备,完成软件升级的功能。在嵌入式系统领域,程序升级可以方便地对程序缺陷进行弥补和修改,或对程序功能进行扩充,运用该方法可极大提高产品的生存周期,节省对项目的维护成本和提高了开发效率。
基于该方法已成功设计出可远程在线升级程序的车辆管理系统。使用情况表明,该系统能稳定、可靠地工作,且为系统的维护节省了大量的工作量,对同类型的嵌入式设备软件在线升级设汁有很好的参考价值。
全部0条评论
快来发表一下你的评论吧 !