百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

基于CAN总线的Bootloader设计与实现

csdh11 2025-01-13 12:03 2 浏览

摘 要: 使用BDM工具下载或升级应用程序,不仅麻烦而且稳定性也不高。采用在线更新的方法,设计并实现了一种基于CAN总线的Bootloader。介绍车载网络通信与诊断服务的实现、Bootloader的设计以及其在车载控制单元的实现,并在此基础上,提出最小Bootloader的概念,可以有效提高程序的灵活性。实验结果证明,Bootloader能正确引导加载程序的运行,准确方便地实现应用程序的下载和更新,在软件开发和测试过程中能够极大地提高工作效率,而且Bootloader的稳定性也很高。还能将网络层和UDS诊断服务部分方便地移植到其他芯片上,为后序的软件开发与测试提供了方便。

0 引言

为了避免在更新程序的过程中拆除ECU,通过串行总线、SD卡或USB口以及相应的通信协议,将应用程序更新到单片机中[1]。在更新过程中,系统不免受到外界干扰和软件故障等影响,因此可靠性成为Bootloader开发工作中首要考虑的因素。同时,Bootloader也存在软件升级的问题,现行的方案并不完善。为此,本文提出最小Bootloader以保证程序的灵活性,为了应对程序更新出错的意外状况,提出Stay-In-Boot的概念,增强程序的稳定性。

1 Bootloader部分

1.1 Bootloader原理

Bootloader的主要工作是初始化硬件设备、分配内存映射等,构建良好的软硬件程序,并决定升级应用程序还是继续运行原有的应用程序[2]。如果升级应用程序,则擦除原有程序数据并通过CAN网络把更新的程序下载到Flash中,再拷贝到RAM中运行;如果继续运行原有的应用程序,则把Flash中的应用程序数据拷贝到RAM里,程序跳转到地址0x4000(仅针对S12G192而言)处运行。

1.2 S12G192单片机的内存空间

S12系列单片机支持两种寻址方式:局部地址寻址和全局地址寻址。只有在对Flash进行操作时才会有全局地址的概念,对RAM和EEPROM进行操作时使用局部地址就可以了。

Bootloader应该放在受保护的Flash中,但不是所有Flash都可以设置保护,所以一般放置在0xc000~0xfeff区间内。

2 ISO15765协议[3]

按协议内容和体系结构实现来进行划分,ISO15765协议共分为4层,分别是应用层、网络层、数据链路层和物理层。应用层诊断协议设计应遵循ISO14229-1或ISO15765-3,应用层规定了具体诊断服务的服务标识符(SID)及后面所携带的参数格式与内容。应用层数据经过网络层实现数据的传输、打包、解包,数据传输时以单帧和多帧的方式按ISO15765-2进行传输。数据经数据链路层时应按ISO 11898-1转化为有效的CAN数据帧,最后经物理层实现与另一节点的通信。被诊断电子控制单元(Electronic Control Unit,ECU)收到请求报文后,再按协议体系结构进行逐层解析。

3 基于ISO15765的Bootloader设计与实现

单片机中的Bootloader程序必须设计得尽量小,因为ECU中有限的Flash容量是由应用程序和Bootloader程序共同占用的。本文将Bootloader分为8大部分,如图1所示。下面详细介绍框图内各个组件的设计与实现。

3.1 CAN Driver的设计与实现

CAN驱动完成CAN的底层配置,包括CAN初始化,CAN的发送和接收函数。CAN初始化又分为关看门狗、屏蔽所有中断、初始化PLL和时钟等[4]。

3.2 ISO15765协议的实现

ISO15765协议的实现主要包括udsDiag.c、udsDiag.h、udsNWL.c和udsNWL.h 4个文件的配制。udsDiag.c和udsDiag.h用于提供诊断服务[5],udsNWL.c和udsNWL.h用于提供网络传输服务。udsNWL.c中最重要的是从网络层发送和接收数据的两个函数。udsDiag.c对每个服务进行响应。

3.3 Flash驱动的实现

在Flash写入或擦除数据之前,必须验证操作的合法性[6],在S12G192中通过配置FPROT寄存器来保护Flash不受非法的擦写。在下载应用程序时把Flash Driver下载到ECU的RAM中,应用程序下载完成后再把RAM中的数据清除,ECU进入正常操作模式。这样不仅可以保护Bootloader,还能节省Flash内存空间,因为在大多数微控制器平台中Flash存储的代码不能对Flash擦除或编程[7],至少是对与代码在同一页的Flash不能这样操作。

3.4 安全模式的实现

安全模式提供安全访问和下载验证,本文通过实现ISO15765[3]中的安全访问服务(服务号为0x27)来提供下载验证[8],具体流程是上位机向ECU发送requestSeed来申请一个Seed;得到ECU返回Seed后,上位机将Seed进行处理得出结果Key发送给ECU,如果Key正确,则得到访问ECU的授权。

3.5 最小Bootloader

考虑到Bootloader后续升级和同一系列芯片移植的需求,通过BDM或P&E烧写进芯片的Bootloader仅完成传送和接收数据的这一基本需求,Flash擦写、部分诊断服务和加锁等程序数据通过网络层传送到单片机写进指定的内存空间,这一举措不仅方便Bootloader实现增量更新,还能提高Bootloader的可移植性。

3.6 Bootloader主程序

3.6.1 初始化流程

单片机复位后,在调用主程序之前,进入Start12.c源文件。执行Init(void)函数,完成的操作有清空RAM空间,把初始化数据从ROM拷贝到RAM等[9]。

3.6.2 上电启动流程

ECU上电或者复位后,程序从0xfffe处开始运行[10],先进行一些基本初始化操作,再根据有无外部编程请求来决定进入Bootloader还是应用程序。但是如果升级过程中出现意外导致升级失败,则再次上电时可能无法进入Bootloader。为了避免此类情况的发生,提出Stay-In-Boot的概念,也就是在上电复位后即使存在应用程序,也强制单片机进入Bootloader。设置一个wait timer,在wait timer没有超时的情况下,如果收到一个Stay-In-Boot CAN Message,则ECU停留在Bootloader中;如果wait timer过期了,而且应用程序有效,则进入应用程序。这样可以有效避免更新程序时出现意外导致无法重新刷新的情况,保证了程序的稳定性。

3.6.3 主循环流程

ECU进入Bootloader后,设置全局变量waitTime,每次进入收发中断将waitTime减1,在主程序的for循环中不断检测waitTime的值,如果为零,则跳转到应用程序启动地址,否则继续检测CAN网络上有无数据可接收。为了保证CAN网络上的数据能够完整接收,本设计将waitTime设置得很大,设置为5 000。

3.7 测试及结果分析

用BDM编程工具[11]将实现的Bootloader烧录到S12G192[12]单片机中,随后移除BDM,将外部开关设为启动加载模式,并上电。通过上位机发送编写完成的“*.s19”文件,通过CAN网络把数据流发送到单片机中,并运行。多次烧录均没有出现数据丢失的情况,能完整地解码上位机发送的数据流,而且烧录后也能成功下载应用程序,应用程序能正常工作,也能持续响应PC端上位机的诊断请求。

Bootloader的性能指标主要在稳定性,另外本文也提出灵活性给开发工作带来的好处。在板子已烧写了最小Bootloader的前提下,通过上位机传送Flash驱动程序和应用程序的s19到单片机(如图2所示),通过CANoe检测到应用程序发送的报文[13](如图3所示),证明最小Bootloader能正确高效地运行,在需要扩展Flash时Bootloader将不需要改变,更改上位机发送的Flash配置文件即可。

另外,本文采用的是传输S-record文件,这有改进之处,通过实验证明,直接传输hex文件比S-record快近一倍,因为Bootloader不再进行文件的解析,解析工作交给PC端上位机。这一改进可有效提高量产效率。

4 结论

本文设计并实现了基于ISO15765协议的Bootloader,提出使用最小Bootloader来优化程序,增强程序的灵活性;开发过程中增加Stay-In-Boot状态,防止刷新出错时出现死循环,提高了程序的稳定性。经测试证明Bootloader能正确引导程序运行,下载数据完整、无误,没有出现数据丢失、错误等现象,在高负载下也能准确、高效地实现ECU端程序的在线下载和更新。

参考文献

[1] 王亚刚.嵌入式Bootloader机制的分析与移植[J].计算机工程,2010,36(06):267-269.

[2] Cheng Anyu, Yao Yan, Duan Zhihui, et al. ECU loader design of in-vehicle CAN network based on ISO15765[C].International Conference on Information Science and Technology, 2011:1215-1217.

[3] International Organization for Standardization. ISO 15765-2004 road vehicles-diagnostic on controller area network(CAN)[S]. 2004.

[4] 张艳,鲍可进.整车控制器Bootloader的设计与实现[J].计算机工程,2011,37(12):233-235.

[5] 李锐,王晶莹,姚燕,等.基于ISO15765的车载CAN网络诊断设计[J].计算机工程,2012,38(4):35-36.

[6] 李权,鄢萍,贺晓辉.高可靠性的嵌入式软件现场更新方法[J].计算机应用,2010,30(08):2221-2231.

[7] 李婉,李宏.单片机IAP升级方法在血液中分析仪中的应用[J].微型机与应用,2014,33(21):16-18.

[8] 王冬良.基于CAN总线的转向角传感器采集电路设计[J].微型机与应用,2014,33(22):77-79.

[9] 张家田,王金成,严正娟,等.基于CAN总线的井下视频信号采集系统设计[J].电子应用技术,2013,39(12):15-21.

[10] 何海波.基于XC2287M的工程机械ECU设计[J].电子应用技术,2014,40(12):27-29.

[11] 罗峰,孙泽昌.汽车CAN总线系统原理、设计与应用[M].北京:电子工业出版社,2011.

[12] Freescale.MC9S12G family reference manual and data sheet[Z]. 2013.

[13] International Organization for Standardization. ISO 14229-2006 road vehicles——unified diagnostics services(UDS) specification and requirements(v2)[S]. 2006.

相关推荐

关于mac 苹果系统早期版本 装win10系统麦克风 摄像头不可用的问题

不建议用bootcamp装系统,有很多限制;尤其对于2013款macbookair,bootcamp是5.0版本,只能装微软官方的win7系统,不好的点是原版win7不带usb3.0驱动,...

U盘制作Win10启动盘

在前面的一个文章《解决Win7安装鼠标和键盘无法使用的问题...

15种常用的在线工具网站清单「值得收藏」

作者:Snailclimb转发链接:https://segmentfault.com/a/1190000022896257前言大家好,我是Echa,一个三观比主角还正的技术人。...

一文看懂Ajax,学习前端开发的同学不可错过

我是专注于软件开发和IT教育的孙鑫老师,出版过多本计算机图书,包括《JavaWeb开发详解》、《VC++深入详解》、《Struts2深入详解》、《Servlet/JSP深入详解》、《XML、XML...

SpringBoot使用ElasticSearch做文档对象的持久化存储?

ElasticSearch是一个基于Lucene的开源搜索引擎,广泛应用于日志分析、全文搜索、复杂查询等领域,在有些场景中使用ElasticSearch进行文档对象的持久化存储是一个很不错的选择...

HTML5 的一些小的整理吧

凌晨3:31家里打来电话奶奶走了,可是并不能回去。用一些整理的笔记来纪念吧虽然奶奶看不懂,如果手头有黑白的那张照片我一定会用canvas画一张悼词。说正题吧,主要的就是一些HTML5AP...

大数据Hadoop之——Azkaban API详解

一、AzkabanAPI概述通常,企业里一般不用使用webUI去设置或者执行任务,只是单纯的在页面上查看任务或者排查问题,更多的是通过AzkabanAPI去提交执行任务计划。Azkaban提供了...

php手把手教你做网站(三十)上传图片生成缩略图

三种方法:按比例缩小、图片裁切、预览图片裁切不管使用哪一个都是建立在图片已经上传的基础上;预览裁切上传,如果预览的图片就是原始大小,可以预览裁切以后上传(这里是个假象,下边会说明);...

国外免费公共云存储产品有哪些(上)?

公共云存储产品在今天正在变得越发火爆,人们与云端的关联无处不在。很多供应商为了让客户注册他们的产品,往往会提供免费的云存储来争取用户。今天我们来看看国外都有哪些可用的主流免费云储存网盘应用。国外免费公...

JSON&Ajax介绍和实例

1.JSON介绍JSON指的是JavaScript对象表示法(JavaScriptObjectNotation),JSON的本质仍然是JavaScript对象...

文件上传,排版是伤

当你还是一只猫的时候,记着你的目标要成为一只虎。当你成为一只虎的时候,别忘了你曾经是一只猫。心态要高,姿态要低。不要看轻别人,更不要高估自己。上传专题:文件上传操作图片预览功能...

Nodejs文件上传、监听上传进度

文件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用Nodejs配合前端完成这个功能。前端我们使用FormData来作为载体发送数据。效果前端部分HTML部分和Js部分&...

推荐4个很棒的Java项目,超级适合小白练手,赶紧收藏!

好程序员今天给大家推荐4个很棒的Java练手项目,超适合小白哦~需要源码的,后台dd吧~一、...

SPRINGBOOT 实现大文件上传下载、分片、断点续传教程

SPRINGBOOT实现大文件上传下载、分片、断点续传教程,SPRINGBOOT大文件分片上传/多线程上传,SPRINGMVCWEBUPLOADER分片上传,超大文件上传下载以及秒传、提速和限速...

从致远OA-ajax.do任意文件上传漏洞复现到EXP编写

前言最近网上爆出致远OAajax.do登录绕过和任意文件上传漏洞,影响部分旧版致远OA版本(致远OAV8.0,致远OAV7.1、V7.1SP1,致远OAV7.0、V7.0SP1、V7.0SP2...