重型拖拉机控制器的引导加载程序与上位机设计

2021-01-07 07:24谭文阳李军伟朱青松
内燃机与动力装置 2020年6期
关键词:上位报文拖拉机

谭文阳,李军伟,朱青松

山东理工大学 交通与车辆工程学院,山东 淄博 255049

0 引言

作为重型拖拉机控制的核心,重型拖拉机控制器控制策略直接决定重型拖拉机的性能和能量利用率,因此控制策略的升级维护技术成为当前重型拖拉机控制器发展的关键。由于传统的OSJTAG仿真工具对软件进行更新需要拆开控制器壳体,对控制器程序进行直接操作,存在更新过程繁琐和程序泄露等问题。基于控制器局域网络(controller area network, CAN)的引导加载程序技术对应用程序进行更新升级,可以避免拆卸控制器壳体等损坏硬件的操作,通过重型拖拉机自身的CAN网络即可实现程序的更新,因此可以避免对程序的直接操作,提高安全性。

相对文献[1]中的基于MPC5634M单片机的引导加载程序设计,本文中充分利用MPC5744P的Flash支持同时读写(read-while-write,RWW)的特点,在下载程序时无需将引导加载程序移入随机存取存储器(random access memory,RAM),避免因下载程序时掉电而丢失引导加载程序的问题,同时省去对电可擦可编程只读存储器(electrically erasable programmable read only memory,EEPROM)进行模拟等繁琐设计,直接对Flash进行操作,能够解决文献[1]掉电丢失引导加载程序的问题。

1 重型拖拉机引导加载程序与上位机功能分析

在嵌入式系统内核运行之前,将引导加载程序存放在MPC5744P单片机的LOW Flash块中,完成对MPC5744P单片机软硬件的初始化,实现MPC5744P单片机用户程序的启动与固件的更新[2-3]。MPC5744P单片机设计机制可分为2种模式,启动加载模式与下载模式。由于MPC5744P单片机启动加载模式需要将引导加载程序加载到RAM中运行,为节约RAM资源,本文中对引导加载程序的设计机制采用下载模式。上位机刷写工具通过CAN总线向MPC5744P单片机发送更新应用程序的控制命令,并实时反馈MPC5744P单片机的更新状态。MPC5744P单片机依据上位机通过CAN总线发送的命令,将应用程序存储入MPC5744P单片机的256 KiByte Flash中。程序刷写的基本原理如图1所示。

图1 上位机与BootLoader通信原理图

2 重型拖拉机控制器端引导加载程序的开发

2.1 FlexCAN通信模块的设计

通过对FlexCAN模块进行初始化配置与通信协议的制定,实现重型拖拉机控制器的引导加载程序与上位机的通信[4-5]。本文中MPC5744P控制器的CAN模块使用的是8 MHz的时钟,500 kbit/s的波特率。使用CAN0通道的消息缓存区0(message buffer 0,MB[0])作为发送数据缓存区给上位机发送代码,设置其发送MB的身份标识符(identity document,ID)为0x520。使用CAN0通道的MB[4]MB[8]MB[31]作为接收数据缓存区接收上位机的命令与S19文件,分别设置其MB只接收ID为0x521、0x550、0x555的报文。FlexCAN的初始化配置如图2所示。

图2 CAN模块初始化配置

2.2 Flash的内存划分及驱动设计

MPC5744P的2.5 MiB的Flash内存划分为4个16 KiByte的LOW Flash,2个32 KiByte的MID Flash,6个64 KiByte的HIGN Flash以及8个256 KiByte的Flash,作用分别是:存储引导加载程序、存储应用程序的启动地址、存储应用程序。

Flash驱动主要用于擦除与写入程序。MPC5744P在擦除Flash内存数据时,只支持以Flash块为最小单位擦除;而在写入数据时,一次最多只能写入4页(1024 bits)Flash内存数据,超出的数据会被截取。本文中的引导加载程序存储于LOW Flash中。对Flash的擦除与写入分别通过程序实现。

以MPC5744P的一个Flash块擦除操作为例,具体流程如图3所示。对Flash进行擦除操作需要通过C55FMC模块下的LOCK寄存器解锁对应的Flash;SEL寄存器选择要进行擦除的Flash;MCR寄存器的ERS位由0变为1启动一个擦除序列,由1变为0结束一个擦除序列;寄存器MCR的EHV位使能高压操作进行Flash内存的擦除;等待MCR的DONE位置1,则高压擦除完成。

对MPC5744P的Flash写入过程如图4所示。对Flash进行写入操作同样通过LOCK寄存器解锁对应的Flash,MCR寄存器的PGM位由0变为1,启动一个写入序列,由1变为0结束一个写入序列,然后为对应地址写入数据。在此需注意MPC5744P的Flash只支持4 byte或8 byte对齐写入,并且只能使用一种方式,本文中采用4 byte对齐方式写入数据;MCR寄存器的EHV位与DONE位与擦除时作用一致。

图3 Flash模块的擦除配置 图4 Flash模块的写入配置

2.3 中断向量表的重映射

由于MPC5744P在单芯片启动时,会从低到高搜索8个带有启动标志位的Flash块(Boot location 0~7),每个Boot location的第一个地址RCHW若存储了BOOT_ID(0x5A),则此块即为启动分区,同时作为启动分区的RCHW偏移4个地址存储的数据即为程序代码的起始地址。中断向量表依据此原理进行重定位。通常工程建立时存储BOOT_ID的RCHW默认为0x00FA0000,本文中的BootLoader通过修改链接文件flash.ld的RCHW为0x00F98000来改变中断向量表所处的Flash,同时确定整个程序代码的运行起始地址。程序复位后运行流程如图5所示。

图5 程序复位后运行流程

通过SECTIONS函数对Flash进行具体划分中断向量表位置,部分代码如下:

SECTIONS{

.intc_vector_table: ALIGN(4096)

{

KEEP(*(.intc_vector_table))

} > m_text

}

通过以下命令实现启动时重定位中断向量表:

int32_t__attribute__((section(".cpu0_reset_vector")))RCHW2= (uint32_t)ENTRY_POINT。

通过上述程序实现应用程序与引导加载程序的中断向量表在内存中地址的设置。

2.4 S19文件的解析

S19文件的正确解析是程序下载成功的关键,S19文件的格式如表1所示。

表1 S19文件格式

表1中所述记录类型S0表示文件名等文件信息,存储数据无需写入Flash内存;记录类型S1、S2、S3表示存储数据地址分别为2 byte、3 byte、4 byte;记录类型S4、S5、S6用来标注S19文件中S1、S2、S3记录类型的数量,非文件必需,无实际作用;记录类型S7、S8、S9为S19文件结束的标志[6-7]。

MPC5744P是32位微控制器,所以采用的记录类型为S3。S19文件的解析与验证(即程序的完整性校验)过程如图6所示。

2.5 引导加载程序复位后的运行过程

运行MPC5744P的一般程序时,首先从默认地址0x00FA0000中检测到BOOT_ID标志位,然后跳转到主函数开始运行。运行本文中设计的引导加载程序时,首先从地址0x00F98000中检测到BOOT_ID标志位,然后跳转到引导加载程序开始运行。整个程序的具体运行过程见图7。

图6 S19文件解析与验证

图7 BootLoader运行流程

3 重型拖拉机控制器上位机的设计

上位机的主要作用是通过某公司USBCAN自带的二次开发函数实现与引导加载程序之间的交互,从而实现程序的更新升级[8-9],因此对上位机的设计分为上位机界面设计和与控制器通信协议制定。

3.1 上位机界面设计与CAN接口库文件

利用具有直观可视化界面的Python外部工具PyQt5对上位机界面进行设计,随后自动生成代码,将生成的界面代码与CAN卡的库函数在Python中链接来实现上位机界面的功能[10-11]。本文中用到的库函数见表2。

表2 CAN卡的库函数

除表2用到的接口库函数外,同时用到接口库函数的结构体CAN_OBJ与INIT_CONFIG。CAN_OBJ结构体表示帧的数据结构,被用来存储发送与接收函数的帧信息;INIT_CONFIG结构体对CAN进行初始化配置。

3.2 上位机通信协议

为提高引导加载程序的安全性,防止被随意更改,制定自定义通信协议,通过上位机与MPC5744P单片机的通信,实现上位机控制单片机运行应用程序或进行引导加载程序功能的选择以及擦除Flash数据并向Flash写入数据等功能[12-13]。上位机的报文ID分别为0x521、0x550、0x555,控制器发送报文的ID为0x520。本文中所用的帧类型均为标准格式的数据帧,引导加载程序协议如表3所示。

ID为0x555的报文控制控制器是否进入更新应用程序模式,ID为0x550报文控制是否对控制器Flash进行擦除与写入操作,ID为0x521的报文向控制器发送S19文件里应用程序的数据,ID为0x520的报文控制控制器应答上位机是否已完成相应操作[14-15]。

表3 BootLoader协议

上位机通过ID为0x555的的报文向控制器发送更新程序的数据命令2,控制器接收到上位机发送的更新程序命令后,通过ID为0x520的报文向上位机返回数据2,表示控制器已进入引导加载程序准备更新程序。控制器进入引导加载程序之后,上位机通过ID为0x550的报文向控制器发送数据0xAA,控制器接收到此命令后,对Flash块进行擦除,等待擦除完成后,控制器通过ID为0x520的报文向上位机发送数据3,表示对Flash块的擦除操作完成。擦除操作完成后,上位机通过ID为0x550的报文向控制器发送数据0xBB,控制器接收到此命令后,进入等待上位机发送需写入的S19文件数据状态。最后上位机通过ID为0x521的报文向控制器发送要写入Flash的数据,控制器接收到此数据后,开始向Flash写入,当对Flash写入数据完成后,控制器通过ID为0x520的报文向上位机发送数据4,表示对Flash写入操作完成。

4 重型拖拉机控制器上位机与引导加载程序的测试

为验证设计的引导加载程序与上位机的在线升级功能,同时为更直观观测设计结果,通过下载小灯程序进行验证。

上位机界面主要分为CAN卡的发送配置、运行状态显示、程序下载3部分。发送配置界面通过“波特率”按钮设置CAN通信的波特率,通过打开“CAN卡”按钮对CAN卡进行调用与初始化配置,通过“复位CAN卡”按钮对CAN卡进行复位,通过“关闭CAN卡”按钮断开CAN卡与上位机的连接。运行状态界面显示CAN通信过程中程序运行的具体状态,上位机CAN卡初始化界面如图8所示。程序下载界面分为下载功能界面与CAN接收/发送数据界面。下载功能界面中,“进入app”按钮表示复位后MPC5744P单片机进入应用程序,“准备更新”按钮表示复位后MPC5744P单片机进入引导加载程序,“擦除数据”按钮表示对MPC5744P单片机Flash中的数据进行擦除,“开始更新”按钮表示进入程序刷写,“加载程序”按钮表示将S19文件上传到上位机,“CAN接收/发送数据”界面显示具体的S19文件,程序更新完成界面如图9所示。

图8 上位机CAN卡初始化 图9 程序更新完成界面

图10 MPC5744P开发板实测图

MPC5744P开发板实测图如图10所示。上位机通过USBCAN卡与MPC5744P单片机的通信对小灯程序下载后,图中所示小灯皆亮,表示程序下载成功。

5 结语

针对重型拖拉机控制器的引导加载程序以及对应的上位机进行了设计开发。对涉及引导加载程序的FlexCAN通信模块、Flash闪存模块、S19文件解析、中断向量表重映射进行了配置,同时对上位机界面与上位机的CAN通信进行设计,通过小灯程序对设计开发的引导加载程序和上位机软件进行测试验证。测试结果表明,所设计的引导加载程序与上位机能够满足对重型拖拉机控制器程序的更新与升级。

猜你喜欢
上位报文拖拉机
基于J1939 协议多包报文的时序研究及应用
拖拉机内燃电传动系统
飞上天的“拖拉机”
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
特斯拉 风云之老阿姨上位
红色拖拉机
牛哄哄的拖拉机
“三扶”齐上位 决战必打赢
基于ZigBee和VC上位机的教室智能监测管理系统