e-works数字化企业网  »  文章频道  »  基础信息化  »  终端和服务器

车载终端远程升级系统的设计与实现

2014/4/8    来源:万方数据    作者:吴静  叶桦  孙晓洁      
关键字:车载终端  远程升级  FTP文件传输  
目前大多数车载终端还不具备远程升级的功能,升级维护比较困难。针对这样的问题,提出了一种远程升级解决方案,设计并实现了远程升级系统。远程升级采用被动模式,由监控中心给车载终端发送远程升级指令,车载终端主动连接远程FTP服务器。下裁最新版本的程序,然后利用单片机在线编程技术将新程序烧写到车载终端内部Flash用户功能代码区,从而实现远程升级。该升级系统可以自动根据网络的状态调整数据下栽的速度,以保证网络传输数据的正确性。经测试,该远程升级系统具有极高的可靠性和安全性。

    车载终端的功能应当随着用户的需求而变化,因此车载终端的升级维护也显得越来越重要。然而,目前大部分车载终端还不具有远程升级的功能,必须在现场通过预留的通信口下载更新程序才能升级,升级维护相对比较困难而且也增加了成本。针对这样的情况,本文提出了一种具有可行性的远程升级解决方案。监控中心只需要发送一条远程升级指令给车载终端,车载终端就能自动的更新自身的固件程序,简单方便而且安全可靠,还可以让所有的车辆同时升级。

  1.远程升级的基本原理

    1.1 lAP简介

    lAP(In Application Programming)是用户自己的程序在运行过程中对内部Flash的部分代码区域重新烧写。要实现lAP功能需要在设计固件程序时编写两个项目代码,第一个项目代码为BootLoader程序,第二项目代码为UserApp程序,即用户功能程序。BootLoader程序不执行正常的功能操作,只执行对第二部分代码的更新;UserApp程序才是真正的功能代码,这两部分项目代码都同时烧录在内部Flash中。

  1.2 远程升级的基本原理

  远程升级有两种模式,主动模式和被动模式。主动模式是指车载终端自动检测是否有新版本的程序需要更新,被动模式是指监控中心给车载终端下发升级指令后车载终端才执行远程升级操作。本课题中,使用的是被动模式。车载终端收到监控中心发送的远程升级指令后,连接远程FTP服务器,建立连接后下载要更新的程序代码,同时将其写入车载终端的外部flash中,更新程序代码下载完毕后,对其进行校验,校验通过后,自动重启终端进入BootLoader模式,利用lAP技术重新烧写User-App程序代码区域。烧写完毕后,跳转到新的UserAPP程序执行,然后给监控中心发送远程升级成功指令。可以用图1形象地表示远程升级的过程。

 图1 远程升级的过程

图1 远程升级的过程

  2.远程升级系统的设计与实现

    2.1 车载终端的硬件结构

    车载终端硬件结构如图2,这里只介绍与远程升级相关的模块,核心处理器使用ST公司的STM32系列MCU,该系列MCU支持IAP编程技术,外围无线通信GPRS模块使用SIMCOM公司SIM900A,SIM900A的最新软件版本可以支持FTP协议,外部大容量存储器。

 图2 车载终端硬件结构简图

图2 车载终端硬件结构简图

  2.2 Flash空间划分

    2.2.1 内部Flash空间划分

    STM32的内部Flash地址起始于0x08000000,一般情况下,程序文件从此地址开始写入。STM32是基于ARM CortexM3内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后首先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的main函数,如图标号②所示;而main函数一般都是一个死循环。在main函数执行过程中,如果收到中断请求,此时STM32强制将PC指针指回中断向量表处,如图标号示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回main函数执行,如图标号⑤所示。整个过程如图3所示。

 图3 STM32程序运行流程图

图3 STM32程序运行流程图

  BootLoader程序也有自己独立的中断向量表、中断处理例程和主循环程序,在Flash中加入BootLoade程序后各个程序的地址分配如图4,其中M为UserApp程序中断向量表的偏移量,(0x08000000+M)为UserApp程序的起始地址。

 图4 BootLoade程序UserApp程序地址分配图

图4 BootLoade程序UserApp程序地址分配图

  2.2.2 外部Flash空间划分

  外部Flash空间大小为1MB,一共分成16个扇区,每个扇区64KB,远程升级使用其中的4个扇区,这4个扇区又划分为两部分,前两个扇区作为更新代码区,后两个扇区作为备份代码区。每一次代码更新成功后都会将更新代码区的程序拷贝到备份代码区,也就是说备份代码区始终保留的是终端最近一次更新成功的代码。

  2.3 FTP远程文件下载

  监控中心给终端下发远程升级指令的同时会将FTP服务器的IP、端口号、用户名、密码、更新程序的文件名称和路径发送到终端,终端根据这些参数通过AT指令配置GPRS模块,然后连接到FTP服务器,连接成功后请求下载更新程序文件。由于更新程序文件大小一般为几十KB,最大不会超过100K。而FTP一次请求不超过1460B,因此需不断地发送请求,直到没有数据可返回为止。所有的更新程序都会暂存在外部Flash的更新代码区。图5表示了这样一个过程。

 图5 FTP远程文件下载流程图

图5 FTP远程文件下载流程图

  另外,远程升级系统可以自适应网络,根据网络的状态调整数据下载的速度。终端和FTP服务器建立连接后,相当于建立一条数据链路,监控中心给终端反馈该链路的数据容量,终端依此调整请求数据下载的速度,以平衡网络负荷,提高数据下载的可靠性。

  2.4 lAP编程的实现

  STM32有一个Flash编程和擦除控制器(FPEC),FPEC模块是一个寄存器组用以处理Flash的编程和擦除操作。每次复位后,FPEC模块是被上锁的,需要向FPEC模块控制寄存器写入一组键值序列keyl和key2才可以解锁,解锁后可以操作其他寄存器。为了防止对用户代码区的非法访问,通常Flash的页(每页的大小为2KB)是加以保护的,试图在受保护的页面进行编程都会在FPEC模块中返回一个保护错误标志。

  lAP编程的对象主要是UserApp代码区域,在编程前必须先根据UserApp代码区域的起始地址和代码大小计算出要编程的区域在flash中的开始和结束页号,然后判断这些页号是否在受保护的区域内,在去除保护后将这些页统一擦除然后再进行编程。由于要更新的程序存储在外部Flash中,因此在运行lAP程序时,需要在内存开辟缓存,将外部Flash的代码读到缓存中,然后再烧写到Flash UserApp代码区。STM32是以半字(2个字节)的方式对Flash进行编程的,每写入半字后都要从Flash相同的地址再读出这半字,如果读出来的值跟写入的值相同,则继续写入下个半字,否则重写这半个字,这种情况基本不会出现,但是为了万无一失,在编写程序时还是加了这种判断。在烧写完整个UserApp程序后,需要将编程过的页重新设为写保护,然后再将FPEC模块上锁。lAP编程的整个过程可以用图6来表示。

  图6 lAP编程的过程

图6 lAP编程的过程
 

责任编辑:王慧敏
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
兴趣阅读
相关资料
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐