基于dsPIC30F系列单片机嵌入式软件在线升级设计与实现
2020-02-03刘金华王军杨达王东
刘金华 王军 杨达 王东
(北京动力机械研究所 北京市 100074)
基于dsPIC30F5011 单片机开发的ECU 控制软件,由于需求不断变更,用仿真器JTAG 接口烧录软件方式,需将电子控制器拆下返回外协生产厂家开盖操作,过程复杂,周期长,协调难度大,管理费用高。因此基于控制器现有的CAN 通讯接口,开展在线升级设计很有必要。本文以某控制器硬件平台为基础,开展了基于dsPIC30F系列单片机嵌入式软件在线升级设计,给出了调试通过的软件相关设计方法。
1 系统描述
1.1 简述
本系统设计目标是:在目标机脱开仿真器上电运行时,可实现系统自动执行,并可通过上位机(PC机)对目标机代码(嵌入式软件)进行升级更新。
本系统目标机软件(嵌入式软件)采用C 语言和汇编语言混合编程方法、上位机软件采用C 语言编写,目标机软件和上位机软件具有可移植和可维护性等优点。本文给出了基于dsPIC30F5011 单片机的硬件平台,使用通过调试的目标机源代码在存储器中空间地址分配及软件设计方法。
1.2 系统组成
系统主要由目标机系统和上位机系统组成。系统连接框图见图1。
目标机系统硬件主要由单片机(dsPIC30F5011)、IDE 仿真器(MPLAB ICD2)、连接电缆组成。目标机系统软件包括:Windows XP 操作系统、MPLAB IDE(v8.01c)开发平台、监控软件、用户应用软件。
上位机系统主要由PC 机、 USB-CAN(CANalyst-II 分析仪)、VisualC++6.0 软件开发平台组成。
1.3 在线升级过程描述
主机PC 端在线升级软件运行后,打开CANalyst-II 分析仪并初始化选用的通道,按照既定的通讯协议,向目标端发送对码指令,握手成功后,打开输入的用户应用程序可执行代码文件,读取该文件可执行代码,进行逐条解析,解析完成后,按照既定的通讯协议向目标端发送,目标端监控程序将解析出的内容,按相应的存储类别分别写入各自的地址中,待接收到上位机发送的复位命令后,将程序指针指向用户应用程序起始地址开始运行用户应用程序。从而完成本次用户应用程序的更新,控制器断电后重新上电,在不运行上位机在线升级软件的情况下,10s 后即执行用户应用程序。在线升级过程参见图2。
2 系统设计
2.1 拟定PC端在线升级程序与监控程序之间的通讯协议
利用现有控制器与上位机之间的通讯接口,即CAN 总线接口,
使用扩展帧格式的数据帧,制定以下数据帧应用原则:
11 位基本ID 的D28 ~D25 位用来表示发送设备的ID;
11 位基本ID 的D24 ~D21 位用来表示接收设备的ID;
图1:系统连接框图
图2:在线升级过程
图3:PC 端在线升级程序流程
11 位基本ID 的D20 ~D18 位用来表示该帧数据的状态,包括单帧数据包、数据组的第一帧和中间帧、数据组的最后一帧;
18 位扩展ID 的D17 ~D12 位用来表示帧数据的指令名称,分为FLASH 编写指令、EEPROM 编写指令和CM 编写指令;
18 位扩展ID 的D11 ~D0 位用来表示多帧数据的帧计数;
表1:仲裁段的应用定义
64 位数据段仅表示数据内容。
仲裁段的应用定义见表1。
为确保每帧数据传输可靠准确,在上述帧格式中,对于数据组帧,设计全部数据的CRC32 校验和,在尾帧中送出,结合CAN 总线的底层CRC 校验和进行双重校验,以便及时发现错误。
2.2 主机PC端在线升级程序设计
PC 端在线升级程序设计,使用Visual C++6.0 开发,通过动态链接库形式操作CANalyst-II 分析仪的相关函数,完成与目标机之间的通讯设计,完成目标HEX 码文件的解析。
软件的设计流程参见图3。
2.2.1 CANalyst-II 分析仪的相关函数
使用开发用库文件:ControlCAN.lib,ControlCAN.DLL、VC 平台函数声明文件:ControlCAN.h。
(1)打开设备函数。
DWORD __stdcall VCI_OpenDevice(DWORD DevType,DWORD DevIndex,DWORD Reserved);
(2)关闭设备函数。
DWORD__stdcall VCI_Close Device(DWORD DevType,DWORD DevIndex);
(3)初始化指定的CAN 通道函数。
DWORD __stdcall VCI_InitCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex,PVCI_INIT_CONFIG pInitConfig);
(4)启动CAN 卡的某一个CAN 通道函数。
DWORD __stdcall VCI_StartCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
(5)发送函数。
DWORD __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,DWORD Length);
(6)接收函数。
DWORD __stdcall VCI_Receive(DWORD DevType,DWORD DevIndex,DWORD CANIndex,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime);
2.2.2 HEX 文件格式
上位机在线升级程序处理Microchip 开发工具所用的标准HEX格式文件。支持的格式为Intel HEX 32 格式(INHX32),参见附录A。
2.2.3 目标HEX 码文件解析数据结构
存储类定义如下:
图4:dsPIC30F5011 程序存储器地址分配
图5:监控软件程序流程图
图6:上位机在线升级程序运行过程及结果
图7:用户应用程序运行后周期性发送数据的情况
2.3 目标端监控程序设计
目标端监控程序位于程序存储器的特定区域中,其起始地址为0x100,软件启动后,即读取目标程序起始地址(本系统目标程序起始地址规定为0x1000),读取其中监控程序延时值。如果监控程序未能在该延时值指定的期限内实现与上位机的对码,将自动暂停并将执行权转交给0x1002 中的目标程序。如监控程序与上位机对码成功,将使用通过CAN 总线从上位机接收到的数据来编程EEPROM 和程序存储器。dsPIC30F5011 程序存储器的地址分布参见图4,具体流程参见图5。
2.4 目标端监控程序及用户应用程序中断向量表
中断向量表(IVT)如图4所示。IVT 位于程序存储器中,起始单元地址是0x000004。IVT 包含62 个向量,这些向量由8 个不可屏蔽陷阱向量和最多54 个中断源组成。备用中断向量表(AIVT)位于IVT 之后。ALTIVT 控制位(INTCON2<15>)提供对AIVT的访问。如果 ALTIVT 位置1,所有中断和异常处理将使用备用向量而不是默认的向量。备用向量与默认向量的结构相同。本系统中监控软件使用IVT,而用户应用软件使用AIVT。
2.5 目标端用户程序要求
(1)不能将用户应用程序放入为目标端监控程序保留的存储空间;
(2)用户应用程序所需空间不得超过目标器件(dsPIC30F5011单片机)的存储空间;
(3)必须为监控程序制定执行用户应用程序的延时时间;
3 运行结果
上位机在线升级程序运行过程及结果参见图6所示。升级结束后用户应用程序周期性发送的数据,使用CANalyst-II 分析仪提供的CANPRO 软件接收并显示数据,参见图7所示。
附录A
HEX 文件的基本格式为:
:BBAAAATTHHHH...HHHHCC
每条数据记录以一个9 字符的前缀开始,且通常以一个2 字符的校验和结束,无论何种格式,所有记录都以“:”开始。各组成部分的说明如下:
(1)BB 是一个两位数字的十六进制字节数,用来表示行中显示的数据字节数量。此数除以2 即获得每行的数据字数。
(2)AAAA 是一个四位数字的十六进制地址,用来表示数据记录的起始地址,高字节在前,低字节在后。由于此格式仅支持8 位,地址被乘以2,所以,要得到实际的器件地址,需将此地址除以2。
(3)TT 是一个两位数字的记录类型。对于数据记录,它为00;对于文件结束(End-of-File,EOF)记录,为01;对于扩展的地址记录(仅INHX32),为04,扩展地址的计算为扩展地址左移16 位+偏移地址。
(4)HHHH 是一个四位数字的十六进制数据字,低字节在前,高字节在后。TT 后跟BB/2 个数据字。
(5)CC 是一个两位数字的十六进制校验和,它为本行记录中在其之前的所有字节之和的二进制补码。