陈彤,黄立梅
(陕西法士特汽车传动工程研究院,陕西 西安 710119)
汽车电子
一种用于汽车电控单元CAN Bootloader的设计与实现
陈彤,黄立梅
(陕西法士特汽车传动工程研究院,陕西 西安 710119)
∶传统汽车电控单元对程序的烧写一般采用BDM调试接口实现,该方法不仅影响电控单元应用程序的开发效率,而且会给汽车电控单元后期的升级维护带来不便。使用嵌入式启动引导程序(即Bootloader),能够较好的解决上述问题。本文设计并实现了一种应用于汽车电控单元的基于CAN通信的 Bootloader。通过实际应用和测试,结果表明该Bootloader能够正确引导程序运行,准确、方便地为控制器下载应用程序。
∶汽车电控单元;Bootloader;CAN总线;Labview
10.16638/j.cnki.1671-7988.2016.09.055
CLC NO.: U463.61Document Code: AArticle ID: 1671-7988 (2016)09-156-05
在汽车电控单元的开发过程中需要频繁地进行程序烧写工作,传统的烧写方式一般是利用芯片专用下载器通过BDM调试接口下载程序,该方式的下载速度较慢,而且在汽车电控单元的后期维护中,如果需要升级应用程序,就需要从整车上将电控单元拆卸下来,为电控单元的维护和调试带来极大的不便。对于已经投入使用的汽车电控单元来说,急需一种方便快捷的程序升级方法,从而提高维护人员的工作效率。Bootloader作为应用程序运行之前的一段程序,主要完成应用程序的启动引导和更新,而CAN总线通信在汽车电子领域的广泛应用,使得Bootloader可以直接通过CAN总线进行程序升级。本文设计并实现了一种基于CAN总线的Bootloader,通过自定义的数据传输协议与上位机进行通信并完成程序下载。
Bootloader是微处理器芯片上电后最先运行的一段代码,它会首先对硬件设备进行初始化,包括看门狗、时钟、串口、CAN接口等,同时会为相关的寄存器赋值,设置内核启动参数。初始化完成后,则进入循环等待上位机命令,并根据命令实现相应功能。
由于嵌入式系统的资源非常有限,特别是存储空间,因此,用于汽车电控单元的Bootloader不需要集成太多其他的功能,而是实现两个最基本的功能:启动引导功能和程序下载功能。对于CAN Bootloader来说,当系统上电完成一系列初始化工作后,Bootloader进入CAN通信循环等待接收命令,当接收到启动命令时,它直接将电控单元FLASH中的应用程序代码加载到系统内存RAM中,并跳转到应用程序入口开始运行;当Bootloader接收到下载命令时,它会通过CAN总线从上位机下载应用程序代码并烧写到FLASH中存储起来。如果在CAN通信循环中等待命令超时,则直接进入启动引导模式运行应用程序。不同的处理器芯片,其实现Bootloader的方式不同,但基本思路一致。
本文使用英飞凌系列芯片作为汽车电控单元的MCU,属于典型的汽车级微控制器,满足Bootloader通过CAN总线更新程序的要求。
3.1Bootloader程序下载方案
通过CAN总线实现程序下载,是CAN Bootloader相对于汽车电控单元传统程序下载方式的主要优势,本文所使用英飞凌系列芯片对FLASH存储区的操作一般以页为单位,基于这一特性,并结合CAN总线通信要求,确定了CAN Bootloader的程序下载方案如下:
1)汽车电控单元上电启动Bootloader并进入CAN通信循环等待上位机命令,若在等待延时期间收到来自上位机的程序下载命令,则开始与上位机进行握手操作,握手成功后,向上位机发送下载确认请求并开始等待上位机的数据帧。
2)上位机接收到下载确认请求后,开始解析应用程序代码,并以128字节为单位将目标代码分页,每解析完一页数据,上位机进入CAN发送循环,将页首地址及页数据循环发送至下位机。
3)下位机只有接收到一页完整的数据并完成数据校验后,才会将所接收数据以页的形式烧写进FLASH存储区,并向上位机发送下载确认请求提示其继续发送下一页数据。
4)上位机将应用程序代码解析完毕,并收到下位机的确认请求后,向下位机发送出下载结束命令,通知其复位重启。
3.2自定义CAN通信协议及数据校验
本文在CAN通信过程中,全部使用扩展ID。为方便测试,自定义了上位机与下位机的通信ID,具体定义如表1所示。
表1 CAN通信ID定义
数据传输过程中的校验则通过累加运算实现,上位机解析代码是,将每页解析出的128字节的数据进行累加,并取运算结果的低四字节作为数据校验码发送给下位机,下位机在接收数据的过程中对接收到的数据按字节进行累加,并将计算结果的低四字节与接收到的数据校验码进行比较,从而判断程序下载过程中的数据传输是否可靠。
4.1Bootloader存储区空间划分
由于嵌入式芯片工作模式的限制,上电后,芯片一般都会在FLASH存储区首地址处寻找程序代码并执行。因此,我们不得不将应用程序按照约定放在芯片FLASH的首位地址处,如果要在Flash中安排了两个应用程序,则无法启用第二个程序。
Bootloader启动引导功能的目的就是为了在其完成自身本职工作后,将硬件的管理权释放,并且将MCU的各种资源移交给应用程序,并为应用程序的运行提供必要的支持。
因此,使用Bootloader的嵌入式系统,会在FLASH的起始段为Bootloader专门开辟一个较小的存储空间,Bootloader代码作为芯片上电后需要最先运行的程序,其中断向量表首地址会与FLASH存储区首地址一致,而应用程序作为被引导的代码,需要配置在剩余空间内。本文所使用英飞凌系列芯片的FLASH存储空间分配如表2所示。
表2 存储空间分配表
4.2Bootloader存储区读写、擦除功能实现
对存储区的读取、写入、擦除功能,是实现Bootloader程序下载功能的基础。本文所使用英飞凌系列芯片的内核中有一个特殊单元IMB,由该单元管理着MCU对Flash存储区的擦除和读写工作。IMB在MCU中预先定义好了一些列的控制命令,如表3所示。
表3 IMB控制命令表
Bootloader程序想要实现对FLASH存储区的读写、擦除等操作,必须严格按照IMB预先定义的控制命令和命令序列来进行。每条控制命令反映到代码上,就是对特性地址的寄存器赋予特定的值,例如Reset to Read命令的实现就是对F0寄存器赋值AA。
4.3下位机Bootloader流程
下位机CAN Bootloader程序的整体流程图如图1所示。
图1 下位机Bootloader整体流程图
下位机Bootloader对CAN消息的收发全部都在CAN中断中完成,当程序运行至CAN消息接收循环后,一旦从总线上收到CAN消息,就立即触发CAN中断并进入中断服务程序。中断服务程序判断接收ID是否为0x18FF1111,并判断内容是否为程序下载命令,若是,则开始与上位机握手并准备下载应用程序。
握手成功后,中断服务程序会判断接收ID是否为0x18FF5555,并对接收到的帧进行数据校验。当一页的数据帧全部接收完成后,则擦除FLASH中相应的页空间并写入一页数据。通过CAN总线将全部目标文件下载到芯片FLASH后,Bootloader会让芯片上电复位,以加载运行新的应用程序。
5.1设计要求
上位机通信界面主要用于配合下位机Bootloader读取并下载升级程序代码,对于本文所使用英飞凌系列芯片来说,就是HEX文件。通过英飞凌的集成开发环境对应用程序进行编译链接后,就能够生成下载所需的HEX文件。由于Labview在图形化界面编程方面较为简便,且在CAN通信上有相应的库函数作支持,所以本文使用Labview软件设计Bootloader的上位机通信界面。
上位机通信界面具体要求如下:
1)可以根据实际需要设置波特率、发送帧类型、发送ID号等。
2)可以打开并初始化所选的CAN通道;能够通过文件路径打开应用程序HEX代码文件,并将HEX文件解析并转换为Bootloader可识别的数据格式,循环发送给下位机。
3)接收和发送的CAN数据帧及相关信息能够显示在通信界面上,下位机与上位机之间的通信状态也能够以指示灯的形式体现出来。
5.2HEX文件解析模块设计
HEX文件可以通过集成开发环境直接生成,它以行为单位,每一行具有固定的格式,如表4所示。
表4 HEX格式定义
数据记录类型的具体定义如表5所示。
表5 HEX文件数据记录类型定义
因此,HEX文件解析模块需要以行为单位对文件进行读取,并将读取到的字符串转换为16进制数据,根据不同的数据记录类型进行相应的处理,最终将每页数据及其页首地址解析出来,具体流程如图2所示。
图2 HEX文件解析流程图
其中,对于实际数据类型的数据记录行的处理较为繁琐,主要是因为生成的HEX文件其每行的地址偏移量并不一定与128字节的页地址匹配,页首地址有可能出现在两行地址偏移量之间,因此当判断出某行数据记录中包含页首地址是,需要根据相邻两行数据记录的地址偏移量计算出页首地址,并对该行数据进行分割,将其添加到不同的页数组中。
5.3CAN通信收发模块设计
利用Labview库函数,可以较便捷地实现上位机通信界面与下位机间的CAN通信。当上位机通信界面根据所设置的通道参数与下位机建立CAN通信连接后,软件会进入两个并列的循环:CAN接收循环和CAN发送循环,两个循环并发运行,从而实现上位机与下位机之间的实时通信。CAN接收循环流程图如图3所示。
图3 上位机CAN接收循环流程图
CAN接收循环在收到下位机的下载确认信息后会通过局部变量的方式通知CAN发送循环开始发送下一页数据。CAN发送循环流程图如图4所示。
CAN发送循环一开始会直接向下位机发送程序下载命令,在和下位机成功握手后,进入真正的数据发送循环,以页为单位不断向下位机发送数据帧,直到目标HEX文件全部解析并被下位机下载完成。
图4 上位机CAN发送循环流程图
5.4运行界面
通过Labview软件开发出来的上位机通信界面如图5所示。
图5 上位机运行界面
设置好CAN通道号、波特率、ID类型、发送ID号等参数,并在文件路径下选择目标HEX文件,点击get on bus让上位机与下位机建立通信连接,通过CAN总线不断向下位机发送程序下载命令,并等待来自下位机的消息,同时可以在显示框中观察到上位机接收到的CAN数据。如果上位机与下位机握手成功,则逐页发送解析好的数据,发完后自动停止,也可以手动通过get on bus强制通信中断。如果通信过程中出现错误,则会在错误对话框中显示出错误信息。
通过上位机通信界面程序可以对下位机内的Bootloader进行功能测试,具体测试方法如下:
1)准备安装有上位机通信界面的电脑一台,已刷写号Bootloader的汽车电控单元一块,两者通过CAN总线建立通信,并在上位机监测CAN通信内容。
2)下位机电控单元上电的同时,上位机启动通信界面并登上CAN总线向下位机发送握手请求。
3)上位机与下位机建立连接后,将预先编写好的能够发出特定报文的简单例程添加的通信界面上。
4)开始向下位机下载例程,下载成功后,下位机重新上电并等待延时,启动引导例程运行。
5)在上位机监测CAN总线报文,判断下载到下位机的例程是否正确。
6)重启下位机电控单元,并下载一个与之前不同的例程。
7)例程下载完成后,下位机重新上电,在上位机监测CAN总线报文,判断下载到下位机的例程是否已被更换。
8)若上述工作全部成功,则证明Bootloader功能正常。
将本文所设计的CAN Bootloader编译链接生成HEX文件并下载至汽车电控单元中,打开上位机通信界面选择应用程序HEX文件进行测试。经测试,目标文件能够顺利地下载到下位机FLASH中,重新上电后也能够通过Bootloader自动加载运行。
一个设计良好的Bootloader能够加快汽车电控单元应用程序的开发,更能够为后期的维护和升级工作提供便捷。本文设计并实现了一种用于汽车电控单元的CAN Bootloader,根据自定义的通信协议,通过CAN总线实现应用程序从上位机到汽车电控单元的下载。经过测试,该Bootloader能够正确、可靠地帮助芯片下载应用程序,稳定地擦写FLASH存储区,快速、准确地实现对汽车电控单元的软件更新。
[1] 王亚刚.嵌入式Bootloader机制的分析和移植[J].计算机工程,2010,36(6):267-269.
[2] 游侃民.嵌入式系统网络化BOOTLOADER的设计与实现[D].广州:华南理工大学,2010.
[3] 罗峰,孙泽昌.汽车CAN总线原理.设计与应用 [M].北京:电子工业出版社.2010: 242-265.
[3] 邹东升,佘龙华. 一种基于CAN总线的程序调试技术研究 [J].计算机技术与应用, 2008,26(5):116-117.
[4] 罗胜耘,路安江. 串行Flash启动Bootloader的设计与实现 [J].化工自动化及仪表, 2010,37(8):90-93.
The Design and Implementation of a CAN Bootloader in Automotive ECU
Chen Tong, Huang Limei
(Shaanxi Fast Gear Co., Ltd, Shaanxi Xi'an 710119)
The traditional automotive ECU usually uses BDM debug interface for programming, This method influences the efficiency of developing the ECU, and also makes it difficult for update and maintenance. Using the bootloader for ECU will solve these problems. This paper, presents the design and implementation of a bootloader for automotive ECU, which based on CAN communication. This bootloader is proved that it can boot correctly and program the ECU quickly, through the test and practical application.
ECU; Bootloader; CAN; Labview
∶U463.61
∶A
∶1671-7988 (2016)09-156-05
陈彤(1988-),男,工程师,就职于陕西法士特汽车传动工程研究院,从事汽车电器。