杨竞喆,王志福,刘 杰
(1.北京理工大学电动车辆国家工程实验室,北京 100081;2.北京蓝天海科清洁能源技术有限公司,北京 102206)
整车控制器 (Vehicle Control Unit,VCU)作为混合动力电动车的大脑,其控制策略直接影响车辆的性能与能量利用率,随着控制策略的修改升级,相应的整车控制器就要进行更新程序的下载升级.一般情况下,开发人员需要将安装到车上的整车控制器从壳体中拆卸下来,再通过背景调试模式(Background Debug Mode,BDM)工具对整车控制器进行程序下载与升级.这样做就会十分繁琐,大大降低了软件升级的效率.于是提出应用近期比较普遍采用的程序下载升级方法,即:基于CAN的整车控制器Boot Loader,通过MSCAN模块进行数据通信;而程序的更新则通过对Flash的擦写操作实现.
Boot Loader是微控制器上电后最先运行的固化在其中的一段程序.主要功能为完成软、硬件所需要的初始化工作,待软、硬件状态调整完毕后,便从ROM、Flash等非易失存储器或网络上加载操作系统映像文件 (或应用程序映像),最终引导操作系统或应用程序运行[1].
Boot Loader一般包括两种模式:启动加载模式和下载模式.简单来说,启动加载模式就是直接将存储在固态存储设备中的应用程序加载到RAM中执行.下载模式则是Boot Loader通过串口或网络连接等手段从主机中下载应用程序,先将程序存在RAM中,再将其刷写在Flash等固态存储设备中[2].大多数开发者更关心 Boot Loader的下载模式,所以本研究课题主要讨论其下载模式的设计与实现[3].
将笔记本电脑作为上位机,基于MC9S12XEP100微控制器的整车控制器作为下位机.MC9S12XEP100微控制器运算速度较快,其总线频率可以达到50 MHz,且具备5路MSCAN通道,片内集成1 MB的Flash非易失存储器,属于典型的汽车级微控制器.其Flash支持在线编程,满足应用程序通过CAN总线下载、更新的要求.Boot Loader代码程序通过飞思卡尔的BDM仿真器下载到微控制器中.PC端与微控制器之间使用周立功单片机科技有限公司的CAN卡来进行CAN总线通信.
2.1.1 MSCAN模块配置
MSCAN模块被用作数据通信,是Boot Loader的两大核心模块之一.进行MSCAN编程,首先要对其进行初始化配置,才能进行正常的通信.具体配置要求如下:
1)设置MSCAN寄存器CANCTL1=0x81,使用外部8 MHz晶振.
2)设置MSCAN寄存器CANIDMR0~CANIDMR7=0xff,使滤波器为接收任意ID的帧.
3)设置 MSCAN寄存器 CANBTR0=0x01,CANBTR1=0x14,使波特率为500 kb/s.
4)因为CAN通信采用查询方式接收,所以设置MSCAN寄存器 CANRIER=0x00,CANTIER=0x00,禁止发送、接收中断.
2.1.2 Flash模块配置
Flash模块的编程是Boot Loader最重要的一个部分.本研究课题所选择的飞思卡尔MC9S12XEP100微控制器的Flash存储空间为1 MB.Boot Loader对Flash编程主要涉及到Flash初始化以及Flash擦除与写操作.所以需要对相关寄存器进行配置.具体配置要求如下:
1)Flash初始化主要为对Flash预分频寄存器进行设置,使操作频率在800~1050 kHz之间,这样Flash擦、写等操作才能正常运行.Flash使用8 MHz的外部晶振,因此设置 Flash寄存器FCLKDIV=0x07,使操作频率满足要求.
2)飞思卡尔S12X系列微控制器的写入操作是以4个字 (8个字节)为基础的,所以接收到的一条S19记录中的数据需要是8的整数倍,如何将正常S19文件转换为每条记录 (包含32字节数据),将在后面介绍.
3)Flash进行擦出或写入命令前,要检查Flash状态寄存器FSTAT中的命令缓冲区的标志位CBEIF是否为1;判断上一次Flash处理命令是否执行完毕,不为1则等待[4].且S12X系列微控制器与S12系列相比,其Flash擦、写操作不再是配置寄存器 FCMD,而是对寄存器 FCCOB和FCCOBIX设置相应的命令及参数.
由于Boot Loader会嵌入到Flash的固定存储空间中,为了避免应用程序的Flash存储地址与其重叠,需将应用工程中的*.prm文件中的ROM_C000由0xC000到0xFEFF,改为由0xC000到0xEFDF.
完成应用工程及上述配置,对工程进行编译便可在工程的bin文件夹下得到所需的S19文件.
为了将生成的S19文件的每条记录转换成32字节的数据,只需要使用飞思卡尔公司提供的SRec Cvt-GUI.exe软件即可.如图1所示,进行设备、存储器等相关选择后便可转换为S19文件[5].
图1 S19文件转换
因为Boot Loader是固化在微控制器中的代码程序,先要在project.prm文件中定义一段Flash存储空间,用来存放Boot Loader.存放地址为在Flash的FF页中的如下区段中:
ROM_F000=READ_ONLY 0xF000 TO 0xFCFF.
于是系统的复位向量0xFFFE处的内容为0xF000,本CAN Boot Loader全部程序将会存在此地址中.因为飞思卡尔的16位微控制器,上电后先从地址0xFFFE处取第一条指令,所以上电后将会先运行本 Boot Loader.系统复位后,将先在Start S12X.s文件中判断PP0引脚的电平高低,若为高电平,则直接跳转到0xEFFE执行应用程序;若为低电平,则进入下载模式,PP0管脚电路图见图2.开关关闭时,PP0默认低电平,即进入下载模式,先初始化堆栈,根据project.prm文件定义,设置栈顶地址为0x3600;随后进入标准初始化程序,将程序中声明的所有全局变量赋上初始值;最后通过jmp函数跳转到main函数处执行.
图2 PP0管脚外围电路
在main函数中,先对Flash和MSCAN模块进行初始化,接着向上位机发送数据发送请求,便进入一个for的死循环,循环中不停地监听是否有CAN帧数据发送过来.当接收到协议规定ID的CAN帧后,先把接收到的CAN帧反馈给上位机;再将数据存在RAM缓冲区中;当判断接收完一条S记录后,便按接收到的记录中解析的地址将数据存到相应的Flash地址中,并等待下一条记录的接收;解析过程中若发现地址为0x7FFFE0的记录,说明其后为应用程序复位向量,将其写入地址0xEFFE中;全部接收完毕后将PP0管脚开关打开,复位微控制器便可执行应用程序.CAN Boot Loader的简要流程如图3所示.
图3 Boot Loader流程图
CAN Boot Loader接收来自主机 (笔记本电脑)的S19文件,除了通信所需的硬件外,还需设计一个PC端的通信界面来根据协议向下位机发送S19文件.由于周立功公司提供了基于Labview软件的相关范例;且Labview软件为图形化语言编程,程序编写更加简便,所以便应用Labview软件进行PC端通信界面的开发.
2.4.1 主、从机协议
在CAN通信过程中,全部使用扩展、数据帧,并将ID 0x00000000~0x00000002作为 Boot Loader的命令及数据传输帧,具体内容如表1所示.
表1 Boot Loader主、从机协议
2.4.2 设计要求
PC端通信界面的具体要求如下:
1)可以根据具体需要设置波特率、滤波方式、ID屏蔽情况、ID号以及发送帧的类型.
2)可以打开设备并初始化选中的CAN通道,其后便可接收到CAN卡发送过来的数据;能通过路径打开所要发送的文件,并将文件中的ASCII码转换成16进制数,再间隔50 ms将数据一帧一帧发送,发送完自动停止发送.
3)接收和发送的数据及相关信息可以显示在表格中,并能随时关闭设备.
2.4.3 关键功能模块的设计
1)数据接收.CAN报文的接收通过循环中的套用条件结构实现,CAN被初始化后,进入条件结构,在条件结构中应用Labview软件自带的调用库函数节点VI;每当设备接收到报文后就可以通过此VI调用库函数将数据读取显示出来.
2)数据读取、发送、自动停止发送.整个发送结构放在循环中,按下“transmit”按键后触发相应值改变事件结构,进行数据读取和发送.因为要发送的数据被放在上位机中保存的S19文件中,所以先通过Labview软件中的路径VI打开文件并读取字符串.由于先要将所需发送的数据转换成16进制数,再存入发送缓存区,才能进行发送,所以数据的读取和发送分别安排在顺序结构的第一帧和第二帧中进行.数据读取过程是,先通过局部变量调用读取的字符串,接着利用for循环结构,每次读取数据,并判断字节数 (8字节的数据为一帧)、然后发送到发送缓存区.数据读取完一帧后,进入发送数据的程序,通过调用库函数将刚存好的数据发送出去.由于该程序段可以判断出所需发送帧的数量,所以数据发送完毕后,数据读取及发送程序就会自动停止.
3)收、发数据信息的显示.当程序收、发数据时会触发条件结构,并产生收、发数据的用户事件.在此事件中,数据将会被拆解并显示在建立的表格中.
2.4.4 最终界面及PC端发送流程
通过Labview软件开发的最终PC端界面如图4所示.
图4 PC端通信界面
当PC端接收到Boot Loader发送来的发送数据请求后,通过路径选择相应S19文件,并设定ID后便可点击“transmit”键进行数据发送,文件发送完毕后会自动停止发送.此时可通过发送、接收帧数据显示初步确定有无丢包发生,也可将表格中的发送数据与反馈数据对比确定数据是否正确.PC端通信流程如图5所示.
图5 PC端通信流程
为了提高方便性和可靠性,设计并实现了一个基于MC9S12XEP100微控制器的 CAN Boot Loader,其外设开关可进行下载模式与运行应用程序模式的选择.依照定义的CAN总线通讯协议,此Boot Loader接收固定ID的CAN帧、即时进行反馈,完成S19文件下载并将其刷写到Flash中.实验结果显示,该控制器能可靠地工作,并具有易于检查接收文件的准确性、方便下载、更新应用程序的优点.
[1]王亚刚.嵌入式Boot loader机制的分析与移植 [J].计算机工程,2010,36(6):267-269.
[2]罗 峰,孙泽昌.汽车CAN总线系统原理、设计与应用[M].北京:电子工业出版社,2010:242-265.
[3]张 艳,鲍可进.整车控制器Boot Loader的设计与实现 [J].计算机工程,2011,37(12):233-235.
[4]王宜怀,曹金华.嵌入式系统设计实战——基于飞思卡尔S12X微控制器[M].北京:北京航空航天大学出版社,2011:289-313.
[5]Lukas Zadrapa,Ladislav Makovic.Serial Boot Loader for S12(X)Micro controllers Based on 180 nm Technology[EB/OL].(2011-02)[2013-07-10].http://111.13.109.55:81/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/cache.freescale.com/files/microcontrollers/doc/app_note/AN4258.pdf?fsrch=1&sr=1.