文献标识码: A
DOI:10.16157/j.issn.0258-7998.2016.01.010
中文引用格式: 李会,王宜怀,王磊. 基于CAN的数据无损代码更新方法设计与应用[J].电子技术应用,2016,42(1):40-43.
英文引用格式: Li Hui,Wang Yihuai,Wang Lei. The design and application of CAN-based code updation with data lossless[J].Application of Electronic Technique,2016,42(1):40-43.
0 引言
针对汽车电子在复杂工作环境下更新固件过程繁琐、稳定性不高、数据易丢失、实时性欠佳等情况[1],以电磁环境较复杂的无刷直流电机控制器为例,深入剖析Bootloader机制[2-4],使用自定义的BLC通信协议,基于面向汽车电子的CAN总线通信方式[5],结合用户程序运行区与备份区交替使用的方式,设计了数据无损的代码更新方法,实现了数据稳定传输、快速下载更新等功能。同时还对Bootloader代码区进行保护,并采用MCU加密与后门密钥验证机制防止外界对用户应用程序区的意外修改,从而增强系统的稳定性和可靠性。
1 系统介绍
1.1 CAN节点硬件构成
CAN模块用来进行数据通信,是CAN Bootloader系统的核心模块之一。KEA128微控制器[6]有一路CAN通道与CAN收发器MC33901[7]相连,其中,MC33901是面向汽车电子应用的高速CAN收发器,可提供物理接口。CAN节点硬件组成如图1所示。
KEA128芯片的MSCAN模块的时钟源为总线时钟,大小为24 MHz,波特率为1 000 Kb/s。并采用32位接收过滤器过滤目标ID,PC端软件可以根据此目标ID通过USB-CAN卡将数据正确地发送给目标CAN节点——无刷直流电机控制器KEA128芯片。本文设置控制器的ID为0x64。
为防止数据在导线终端被反射导致数据丢失,每个CAN总线需要两个终端电阻,分别在主干线的两个端点,一般为120 Ω,由于USB-CAN卡中已内置120 Ω电阻,此处不需要外接。
1.2 系统构成
为了向KEA128微控制器直接编程,本文提出了一种基于汽车CAN总线的数据无损的用户程序备份加密与数据无损的BLC通信协议设计方法,实现了对无刷直流电机控制器快捷、稳定的代码更新功能。本文搭建的系统包括无刷直流电机控制器内置的Bootloader、用户应用程序以及PC机端上位机软件。在硬件连接上,采用广成科技研发的USB-CAN卡实现PC机端与控制器KEA128之间的CAN通信。图2为各个硬件之间的数据传输示意图。
PC机端上位机软件采用C#语言编程实现,通过对用户程序的机器码文件逐行遍历并进行解析,去除无效数据(例如前缀等),将有效数据组成符合CAN总线协议的数据帧发送给无刷直流电机控制器内置的Bootloader,Bootloader将数据帧解析并放在指定的用户代码区,等待PC指针跳转执行。PC机与控制器之间通过数据无损的BLC通信协议进行数据传输。
本设计方法在链接文件中对Bootloader和用户应用程序的内存进行划分,共划分出了2个用户应用程序区,两者根据实际情况分别作为代码运行区和备份区而存在,实现了数据无损的用户程序备份机制。
此外,为了防止Bootloader代码区和用户程序区被意外修改,本设计方法设置了保护Flash配置域,将整个Bootloader代码区进行保护,同时还采用MCU加密机制将用户程序区加密,只允许用户通过Bootloader进行后台密钥验证的方式进行固件更新。
2 上位机端通信软件设计
2.1 上位机端与控制芯片端通信帧格式定义
上位机通信软件可逐行遍历.HEX格式的MCU机器码文件。对于每一条HEX记录,通信软件解析出有效数据并进行组帧,帧格式符合CAN总线协议的标准数据帧。
由于CAN协议标准数据帧的数据段最大长度为8 B,所以一条HEX记录可能需要几个数据帧才能发送完毕。对于超过8 B的数据,在仲裁段添加1 B的协议信息,以表示该条记录的帧数和待发送帧的序号,其高4位表示帧数,低4位表示帧的序号。具体通信帧格式如表1所示。帧类型值为0x00~0x07,分别代表发送的帧为命令帧、应答帧、地址帧、代码帧、校验帧、更新帧和结束帧。只有代码帧中的帧数和帧序号有效,其他帧的帧数和帧序号的内容无效且均为0xFF。
2.2 数据帧链表队列生成方法
为降低代码更新的复杂性,并提高Bootloader对HEX文件有效数据重组的可靠性,上位机软件设计并实现一种能够生成更新代码管理链表队列,用于存储待发送的数据帧。上位机软件首先完成解析HEX文件,并将数据进行组帧,快速建立一个数据帧管理链表队列,如图3所示。
上位机软件通过CAN总线向无刷直流电机控制器发送数据帧,直到一条记录发送完毕。在控制芯片端将接收的数据帧进行解析,解析出待存的数据和存放Flash的地址。在一条记录接收完毕后,将此记录写入用户Flash相应的地址中,从而简化Bootloader的逻辑。
3 无刷直流电机控制器Bootloader设计
3.1 链接文件中的内存设计
无刷直流电机控制器采用的KEA128微控制器的RAM大小为16 KB,Flash大小为128 KB,在intflash.ld文件中对Bootloader和用户应用程序的存储空间进行划分。
图4为KEA128无刷直流电机控制器内存划分示意图。最左边为KEA128微控制器的存储映射表,其中Flash区又划分为Bootloader代码区、1号用户代码区和2号用户代码区。Bootloader代码区包括中断向量表和Bootloader代码。同样的,1号用户代码区和2号用户代码区包括中断向量表和用户代码。本文利用内存中划分的2个用户代码区设计了一套良好的用户代码备份机制。该机制轮流采用两个用户代码区分别用来备份当前运行的用户代码和准备更新的用户代码。配置信息段用于标识当前运行的用户程序处于哪个用户代码区。假设当前运行的用户程序处于1号用户代码区,当用户准备更新代码时,Bootloader自动读取配置信息段,并将待更新的用户代码放在2号用户代码区。此时1号用户代码区作为备份存在,2号用户代码区作为运行区存在。当下一次更新代码时,2号用户代码区将自动作为备份存在,1号用户代码区数据被擦除并存储待更新的用户代码。该机制减少了Bootloader对Flash区的操作,缩短了代码更新时间,同时也保证当更新失败,系统还可以尽快恢复到之前的功能。
3.2 中断向量表重映射
中断向量表是存放中断服务程序入口地址或跳转到中断服务程序入口地址的一段存储区域。由于程序执行的第一条指令地址是以中断向量的形式给出,因此重映射中断向量表是设计Bootloader的第一步。图4对控制器的内存进行了划分,默认情况下,Bootloader的中断向量表处于0x0000_0000~0x0000_000C地址。KEA128微控制器上电启动后,将运行Bootloader代码并检测是否需要进行代码更新操作。若检测到代码更新命令,Bootloader将接收新的应用程序代码写入相应的用户代码区,禁止中断;然后初始化用户程序区堆栈指针,将中断向量表重新定位到用户应用程序区中的中断向量表所在位置,并将此地址值赋给中断向量表起始地址寄存器SCB->VTOR;最后PC指针跳转到相应用户代码区的入口地址处。整个执行流程如图5所示。
3.3 Bootloader代码区保护与MCU加密机制设计
为了防止用户应用程序对Bootloader代码区的意外修改,通过保护Flash配置域将整个Bootloader代码区进行保护。在Bootloader代码区中,Flash配置域地址位于0x00000400~0x00000410。Flash保护分为低地址域和高地址域,而Bootloader代码区中的Flash配置域位于低地址保护域内。配置FPLS[1:0]=11,就可以将整个16 KB大小的Bootloader代码区保护起来。
同时,为了保护无刷直流电机控制器能够正常运行,应禁止用户通过写入器对MCU进行二次写入,只允许用户通过控制器内置Bootloader来更新程序。通过设置KEA128后门秘钥(BackdoorKey)对KEA128整个芯片进行加密。而Bootloader会内置密钥,可以完成对用户代码区的下载及更新。
Bootloader借助内置的后门密钥与存储在Flash配置域的8 B后门密钥的内容进行比较并匹配,从而获得对KEA128的访问权限并临时解锁芯片。
4 数据无损的BLC通信协议
BLC通信协议是为了保证上位机下发的.HEX文件的有效数据可被无刷电机控制器无损地接收和可靠处理。主要通过握手机制来实现,具体的通讯链路机制如图6所示。
首先,上位机软件取得HEX有效数据后,循环向控制器发送命令帧请求开始发送数据,直到控制器向上位机反馈“同意接收”的应答帧时才停止下发请求命令帧;上位机在收到应答帧后,通过CAN总线将数据帧发送给下位机,在发送完HEX数据后,上位机将发送结束帧通知控制器HEX数据已发送完毕,无刷电机控制器将回发应答帧通知上位机数据“接收成功”,到此上位机可以停止HEX数据的传输。之后控制器通过执行Flash写操作将接收到的HEX数据写到相应用户代码区的指定地址,完成写入后再次向上位机发送应答帧命令表示已“完成HEX数据的写入”,上位机收到后将下发结束帧请求结束此次传输过程,最后控制器将回发应答帧“关闭此次通信过程”。
此外,本文还在BLC协议中设计了超时重传机制,BLC协议的发送方在0.5 s内没有收到确认就要重传已发送的数据。在整个传输过程中,凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便超时重传时使用。如果发送方一连重传3次仍无响应,发送方就认为接收方出了故障,关闭整个连接。
5 测试结果分析
对本文设计的数据无损的代码更新方法进行了时间开销的测试实验。在控制器端指定引脚PTI2为高电平,当Bootloader开始时将其拉低,结束时再次将其改为高电平,用示波器观察PTI2引脚低电平持续的时间即为所需要的时间。以16 KB的HEX文件为例。在一天不同的时间段测试的数据如表2所示。每个数据均为当前时间测试的10次数据的平均值。
同时,也对系统的可靠性进行了测试,部分测试结果如表3所示。
综上所述,所设计的数据无损代码更新方法运行稳定,时间开销短、通信可靠且能够有效改善代码更新过程中下载失败的问题。
6 结论
本文设计的数据无损代码更新方法提供了高可靠性的代码更新机制,极大地方便了研发人员对设备的测试及产品升级。目前,此系统已成功应用于苏州华祥信息科技有限公司的无刷直流电机控制系统中,经实际生产测试表明,本系统稳定可靠,可成功实现20 Hz以下数据无损的代码更新。同时,本设计方法也为图2中其他CAN节点的代码更新提供了一种新的思路。
参考文献
[1] 蒋建春,王正树.基于软件触发的在应用编程在线升级技术的设计与实现[J].计算机应用,2012,32(3):121-123.
[2] 王亚刚.嵌入式Bootloader机制的分析与移植[J].计算机工程,2010,36(6):267-269.
[3] 陈曦,郑贵林.基于自编程功能的MCU Bootloader设计[J].电子设计工程,2010(18):65-68.
[4] 刘矗,罗峰.基于飞思卡尔微控制器的CAN Bootloader的实现与应用[J].苏州大学学报:工学版,2010,30(2):57-61.
[5] 司宝丰,孟鹏花.基于CAN总线的Bootloader设计[J].仪表技术,2010(3):30-33.
[6] Freescale.KEA128 Sub-Family Reference Manual Rev 2[DB/OL].2014.http://www.freescale.com.
[7] Freescale.MC33901:High Speed CAN Transceiver Rev 1[DB/OL].2013.http://www.freescale.com.