雒拓,程威,陈博凯,杜浪东
基于dsPIC30F的BootLoader设计
雒拓,程威,陈博凯,杜浪东
(陕西重型汽车有限公司,陕西 西安 710200)
控制单元采用专用调试接口更新程序时,过程繁琐且一般需要拆开壳体从而破坏产品的可靠性。文章介绍了一种基于dsPIC30F的BootLoader设计方法,可通过车辆预留的OBD接口,利用CAN总线实现控制单元软件的更新。该设计方法主要包含启动管理、通信管理和底层驱动管理等模块。通过试验验证,该BootLoader能够实现控制单元程序的更新,且具有占用存储空间小、下载速度快和工作可靠的特点。
CAN总线;BootLoader;dsPIC30F
随着汽车电子技术的飞速发展,车载控制器已经在商用车上广泛应用,而在控制器调试时,经常需在车辆的使用现场对控制器程序进行升级和维护。采用基于CAN总线的BootLoader技术是实现程序更新的有效的解决方案,它避免了拆除硬件设备时造成的破坏,仅通过车辆预留的OBD接口,利用车辆自身的CAN总线网络即可实现对车辆控制单元的程序更新,并支持对多个控制单元进行程序更新。本文所设计的BootLoader基于dsPIC30F5011芯片,采用模块化结构设计,根据器件手册适当调整即可适用于dsPIC30F系列其它规格的芯片。
BootLoader是独立于用户程序的功能代码,通过CAN总线与上位机进行通讯,实现控制单元程序的下载和运行控制。主要包含启动管理模块、通信协议处理模块和硬件驱动模块[1],系统组成图如图1所示。
进入BootLoader一般有三种方式:1、复位后设置一段延迟时间,需在延迟时间内确认;2、通过读取某个引脚的电平进行判断;3、通过设置启动标志进行判断。方法1的延时存在不确定性,不易控制。方法2需要引出单独的引脚,并手动控制高低电平,不便于操作。方法3可通过CAN总线和上位机配合即可完成,在控制单元程序运行中可随时进入BootLoader。本文采用第三种方式。
图1 BootLoader结构图
控制器上电后首先进入启动管理模块,可通过修改链接器描述文件使控制器上电后跳转至启动管理模块的处理函数。该模块通过“应用程序有效标志”(AppValid)和“BootLoader请求标志”(BootReq)引导程序进入用户程序或是BootLoader程序。其中,AppValid存储于flash中,而BootReq存储于RAM中,变量的定义如下所示。
int __attribute__((address(0x880))) BootReq;
char __attribute__((space(prog),aligned(64))) BootInfo[64] = {0};
考虑到Flash的擦写限制,定义了BootInfo[]变量,AppValid相当于BootInfo[0]。当Appvalid=0时,应用程序无效,此时始终进入BootLoader;当Appvalid=1时,应用程序有效,此时若BootReq=1,表示接收到上位机的BootLoader请求,则进入BootLoader程序,否则进入用户程序。为了能够在应用程序运行时随时进入BootLoader,可设置当收到上位机的BootLoader请求信号后,将BootReq置为1然后通过软件复位,复位后RAM中的数据保持不变。控制器上电复位时,无需等待,直接进入应用程序。程序引导流程图如图2所示。
图2 启动管理流程
通信协议处理模块通过预定义的服务实现上、下位机之间的数据通信,包括BootLoader请求等服务[2],具体见表1。
表1 通信协议处理模块
下载程序时,上位机首先定时发送BootLoader请求指令,下位机收到BootLoader请求后进入BootLoader,当下位机进入BootLoader后,上位机根据hex文件的地址信息向下位机发送擦除指令,擦除待编程的Flash和EEPROM区域;然后,上位机通过数据包传输服务将待下载的数据传送给下位机,上位机每次发送的字节数可根据上、下位机的内存、hex文件大小、编程的字节数等确定;最后,上位机利用编程指令对下位机进行编程,并在编程结束后对编程区域进行数据校验,并依此循环下载,直至所有数据下载完成。上下位机的通信流程图如图3所示。
1.3.1存储地址分配
dsPIC30F5011单片机的存储空间分配如下图所示,包含22K指令字的Flash存储空间和1KB的EEPROM存储空间[3]。一般将用户程序存储于紧随中断向量表的存储空间,而将BootLoader放在程序存储器区域的最高地址区域,存储空间分配见图4。
图4 存储空间分配
1.3.2 CAN驱动模块
dsPIC30F5011 的CAN模块拥有3个发送缓冲区、2个接收缓冲区,每个接收缓冲区有硬件过滤器。为了降低CPU负载,在进入BootLoader后使用硬件过滤器过滤掉与BootLoader功能无关的CAN报文。同时,为了防止缓冲区溢出而导致的丢帧,在接收中断中将报文放于软件缓冲区,在处理报文时从软件缓冲区依次取出。缓冲区被设计成循环队列,通过队列长度、当前位置索引、尾部索引等变量控制队列。缓冲机制如图5所示。
图5 CAN缓冲机制
1.3.3 NVM驱动模块
NVM即非易失性存储器,下位机包含的NVM包括Flash和EEPROM,可通过TBLRD(读表)、TBLWT(写表)和NVM控制寄存器实现运行时自编程。驱动模块提供统一的接口函数 NVM_ Read、NVM_ Write和NVM_ Erase。考虑不同类型存储单元的可编程数据大小不同,在接口函数中根据编程地址判断编程区域,调用不同的接口函数实现不同类型存储区域的编程。
以Flash编程为例,驱动模块提供Flash_CoreRead、Flash_CoreErase和Flash_CoreWrite函数,由于读写操作应遵循严格的时序要求,因此使用汇编语言编写,部分代码如下所示。
_Flash_CoreRead:
sub w3,#0,[w15]
bra z,2f
mov w1,_TBLPAG
1:
tblrdl [w0],[w2++]
tblrdh [w0++],[w2++]
dec w3,w3
bra nz,1b
2:
return
_Flash_CoreErase:
mov w1,_TBLPAG
tblwtl w1,[w0]
…,此处代码为标准序列,可参考器件的数据手册
return
_Flash_CoreWrite:
mov w1,_TBLPAG
mov #32,w3
tblwtl [w2++],[w0]
tblwth [w2++],[w0++]
dec w3,w3
bra nz,1b
…,此处代码为标准序列,可参考器件的数据手册
return
上位机程序使用MFC开发,主要包含文件加载模块、数据解析模块、通信模块和CAN驱动模块。文件加载模块用于解析hex文件,将字符信息转换为二进制代码信息;数据解析模块按hex文件的格式解析程序信息,并将程序按地址存储于缓冲区中;通信模块用于实现上位机和下位机的之间的预定服务, CAN驱动模块实现CAN报文的收发。上位机刷写界面如图6所示。
图6 上位机软件
本文介绍了dsPIC30F芯片基于CAN总线的BootLoader设计方法,该方法采用模块化设计,具有较好的移植性,理论上可适用于dsPIC30F系列的各型号产品。该BootLoader功能全面,既包含了启动管理、底层驱动、通信服务等基本的功能模块,实现了稳定、可靠的程序下载功能;同时,又通过自定义的通信服务,简化了上、下位机的信息交互,适用于单片机资源紧张和要求快速移植的场合。本文设计的BootLoader占用空间小,代码量约5KB,且已经在某型号重型车辆的车身控制器中使用,通过实验验证,证明该BootLoader能够可靠,正确的下载更新控制单元程序。
[1] 王志强.基于MC9S12XEP100的BootLoader设计与实现,汽车实用技术,2018,(17).
[2] 张成雨,杨朝阳,单志文.基于CAN总线的车载应用Bootloader设计,湖北汽车工业学院学报,2017,(12).
[3] dsPIC30F5011/5013数据手册.文档号:DS70116G_CN.
Design of BootLoader base on dsPIC30F
Luo Tuo, Cheng Wei, Chen Bokai, Du Langdong
( Shaanxi Heavy Automobile Co., Ltd., Shaanxi Xi’an 710200 )
Updating software in electronic controller by dedicated debug port is complicated,and always need to disassemble electronic controller which lower the stability.This paper introduce a design of BootLoader base on dsPIC30F,which uses the OBD connector to update software in electronic controller by CAN bus.The BootLoader mainly includes boot module design,communication module design and driver module design. Experimental results show that the BootLoader can update software successfully,occupys little flash rom,downloads quickly and works stably.
CAN BUS; BootLoader; dsPIC30F
10.16638/j.cnki.1671-7988.2019.10.027
U462
A
1671-7988(2019)10-76-03
U462
A
1671-7988(2019)10-76-03
雒拓 (1983),男,就职于陕西重型汽车有限公司 汽车工程研究院,从事汽车电子电器研究工作。