引言
本升级系统中,节点通过CAN总线[14],运用In Application Programming(IAP)[57]技术进行升级维护,这种技术实现较简便,且嵌入式设备一般都提供IAP的Flash编程接口,所以本系统使用IAP接口。目前运用IAP技术实现在线升级方案版本繁多复杂,参考文献[8]采用CCP协议提出适用于汽车Electronic Control Unit(ECU)的升级系统方案,但实现过程复杂且协议开销大,参考文献[9]由奇瑞公司提出一种通过口令验证等工作的升级方法,该方式增加了系统负担和操作复杂度。本文提出一种将诊断协议ISO15765[10]运用到CAN总线定义的底层协议ISO11898[11]之上,来实现嵌入式应用软件在线升级方案,系统网络应用进程交互方式采用Client/ Server(C/S)模式[12],客户运用ISO15765协议提供的诊断服务功能,结合IAP技术通过CAN_bus将升级软件烧写到服务器端存储器中换掉原应用程序。该方案操作便捷,可靠性和稳定性好,对别的应用在无线网络(如GSM、GPRS等)中的嵌入式应用软件远程升级[13]有借鉴意义。
1 IAP技术原理
STM32F103VET6属于STM32F103xx[1416]系列芯片,是1款基于ARM Cortex TM_M3 32位的RISC内核的微控制器[1718]
通过IAP[1920]技术Flash存储器结构上被映射为两个存储块,即用于存储IAP功能程序代码的BootLoader存储块[21]和用于存储IAP功能外全部代码的常态存储块。默认状态时PC指针只能移动于常态存储区内并读取指令当且仅当MCU处于运行模式时,此刻的PC指针不断读取需要执行的程序指令,在升级操作执行前需要完成两个程序块的编写[19],即通过IAP功能烧入执行在线升级功能的代码块,和通过JTAG或ISP接口烧入并利用如CAN,USB、USART等通信接口实现程序和数据接收来实现对升级功能软件升级的代码块, Flash中需同时烧录这两块代码。当编写完这两部分代码后,若客户提出升级程序的需要[21], 此时在程序指令指导下PC指针将跳转至BootLoader程序区,当该部分程序完成数据通信和CRC校验等升级操作后PC指针再次回到常态存储区执行原位置处的应用程序。
2 在线升级系统方案设计
2.1 系统设计
方案采用Client/Server(C/S)模式[12],客户端为PC机,服务器端为集成有微控制器STM32F103VET6、光耦合器、CAN总线控制器和CAN收发器等功能模块的嵌入式系统,由于客户端无法直接与CAN总线网络进行通信,故增加CAN总线接口卡将PC机通过CAN总线连接服务器[22]。此处选择USBCAN总线适配器[23]。
本系统中客户端用作操作界面[24],当客户需要对目标服务器进行应用软件升级时便向目标服务器发送升级命令,客户要与目标服务器间进行通信需解析目标文件。最后根据ISO15765通信协议组织命令报文并将报文发送至目标服务器,目标服务器识别升级命令后调用BootLoader程序完成如注册中断服务程序[22]和接收数据并执行Flash编程等操作完成应用程序升级。
2.2 通信协议
通信协议分层结构对应嵌入式系统TCP/IP协议模型[12],ISO15765通信协议分层结构如图1所示,本协议模型中应用层为本文软件开发工作的重点,主要负责客户与目标服务器间应用层业务流开发。应用层运用ISO15765协议[10]诊断服务功能实现目标服务器识别、工作模式切换、数据下载和传送、Flash编程等功能,这些操作由ISO15765诊断协议的诊断服务指令完成。ISO157652[2426]协议用于网络层,负责对诊断数据包封装与解封装、分包和组包、多帧整理等操作。长报文的多包数据传输过程中的流控制和顺序控制、同步控制和错误恢复等功能以及命令格式在ISO157652协议中也给出了定义。此外ISO15765诊断功能与底层CAN数据帧和网络层报文间的具体映射情况[24]该协议也给出了详细定义,底层协议需要规定一些物理特性,因 CAN网络[14,11]可达1 Mbps的快速通信速率和非破坏性网络仲裁机制以及通信方式可靠灵活,已被广泛应用于车载网络,故底层协议采用基于国际标准的ISO118981 协议。
图1 ISO15765通信协议分层结构
按诊断系统对诊断服务的公共需求建立并定义了ISO15765[10,27]国 际标准协议,其诊断服务功能完全涵盖ISO14230诊断协议[2829],该协议运用成熟,灵活可靠,开销代价小,完善的诊断协议标准使得ISO15765协议坚持了道路机动车网络的发展走势。目前ISO15765协议[10,27]已经广泛运用于欧美等多个国家汽车生产厂商普遍运用ISO15765诊断协仪到嵌入式诊断系统中,对将来的FlexRay、Most、无线网络等也可以很好运用此协议标准。ISO15765协议以OSI模型为基准从结构上将协议分7层,这可允许将ISO15765协议各层功能分开运用到其他底层协议之上[10,2728],此处将ISO15765协议诊断服务功很好运用到CAN总线通信网络中,底层运用CAN总线定义的基于ISO11898的数据链路层和物理层协议,应用层运用ISO15765协议[10,2728]特有完备的诊断服务功能实现数据上载和下载、数据传送、诊断服务管理、输入和输出控制、远程启动ECU例程等诊断服务功能。
2.3 存储器映像和Flash分区存储
STM32F103VET6[1518]片内集成512 KB Flash和64 KB SRAM,用于存放用户程序的Main Block存储块和Information Block信息块组成Flash程序存储器,Main Block地址范围从0x0800 0000~0x0807 FFFF,容量为64K×64位,共256页每页2K,Information Block容量为258×64位,地址0x1FFF F000~0x1FFF F7FF共2 KB的System memory和地址0x1FFF F800~0x1FFF F80F共16字节的Option Bytes组成,STM32F103VET6存储器映像略——编者注。
本文根据BootLoader程序大小将512 KB的Flash分两个区,即地址0x0800 0000~0x0800 1FFF共1 KB 存储空间的BootLoader程序和地址0x0800 2000~0x0808 0000共 504 KB的空间的应用程序,Flash分区存储如图2所示。
图2 Flash分区存储
2.4 在线升级运行状态和流程设计
根据方案设计将服务器运行状态主要分成硬件初始化、运行用户程序和在线升级3个基本运行状态[22],图3为升级状态转移图。
图3 状态转移图
图4 升级流程
① 硬件初始化[18,22]:初始化变量和存储器以及所有外设,设置堆栈和中断,转换ISR向量表等,只有当状态转换或优化性能时,转换ISR向量表可选择将向量表从代码段拷贝到SRAM中指定地方。启动应用程序和允许中断由复位服务子程序来完成它们软件复位、建立中断向量表和处理中断函数等职能,当服务器获得升级命令时则会关闭所有中断服务进程以避免Flash在编程时受访问[22],减少进程占用。服务器若发生异常情况如数据溢出中断时则转入相应中断处理进程,因服务器在默认模式下不能释放接收缓冲区以及执行BootLoader程序等升级操作故将工作模式换至扩展诊断模式。
② 判断服务器当前状态是否满足在线升级前提条件,如当客户有升级请求时PC指针跳转至应用程序起始地址0x0800 2000处执行,否则等待升级。
③ 服务器进入编程模式后执行升级过程[22],即擦除Flash、下载并接收升级程序、写入Flash等实现Flash编程的操作。
2.5 诊断服务
诊断服务的6种服务原语由应用层提供[30],应用层服务原语如图5所示。其中请求原语(Req)表示请求某个诊断服务,接口函数为xxx_Req();请求确认原语(Req_con)表示请求报文是否传送到ECU端,接口函数为SendReqCon();确认原语(Con)表示接收响应数据,接口函数为SendConfirm();指示原语(ind)表示接收请求数据,接口函数为SendInd();响应原语(resp)表示发送响应报文,接口函数为xxx_Resp();响应确认原语(resp_con)表示响应报文是否发送到诊断仪端,接口函数为SendRespCon()。
服务器与客户通过诊断命令信息交互[26],由诊断命令实现。
图5 应用层服务原语
3 IAP技术实现过程
3.1 启动配置过程
STM32F103VET6芯片属于STM32F10xxx系列芯片[1417],启动模式可选择3种不同方式,通过选择BOOT[1∶0]的引脚来制定,在SYSCLK 的第4个上升沿时BOOT引脚的值会被锁存,这个动作在目标系统复位后执行。此时操作人员如果要选择系统复位后的启动模式可以通过设置BOOT1和BOOT0引脚的情况,由于当系统从待机模式退出时BOOT引脚的值将被重新锁存,CPU应沿着启动存储器的0x0000 0004 指示的地址开始执行代码且启动已经延迟了一段时间。此时刻前CPU在地址0x0000 0000处得到堆栈顶的地址,当系统处于待机模式时BOOT 引脚需要设置为系统需要的启动配置模式。
3.2 IAP技术详细过程
本文根据IAP技术原理设计用于存放启动程序(Startup.S)[24]、传输协议、CAN驱动程序、引导程序等数据的引导加载程序——BootLoader程序来实现lAP技术[19],用户需通选择一个通信接口,如RS232、USB、CAN总线等接口。此处选择CAN总线接口来接收客户端程序,默认状态时PC指针处于存储有协议栈和操作系统控制算法等数据的应用代码区[8]。当系统上电或复位后若有升级命令,首先PC指针会跳到BootLoader 区启动BootLoader程序,此时测试其对应引脚电平,若为低电平则初始化IAP程序入口指针地址。其次执行BootLoader程序块,利用其中的的IAP程序,通过串口(或JTAG调试接口)下载完备的应用程序并将其写入Flash指定区域[8],以及完成CRC校验等应用程序升级操作,待升级操作结束后系统重启。