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.