实现单片机远程升级的最安全方法

M4单片机软件远程升级
1、核心思想:

  1.  在程序下载之前,必须向终端(下位机)下发问询命令,先确认需要下载哪个文件。确认下载哪个文件以后,读取文件数据。以4字节为一个DWORD单元长度,计算总单元长度。文件第一个字节为单元长度的最低位,第四字节为最高位,计算所有文件字节数据的异或作为CRC文件总的校验码(CRC校验码为一个8位数据,BYTE)。以每次(帧)发256字节(64 DWORD单元长度)为一帧,计算总的下发帧数,最后可能不足一帧部分也算一帧。把总帧数,总单元长度(DWORD),总CRC校验,先下发到终端;终端确认以后,再下发文件数据。
    

2).每帧发送文件数据长度,以256字节为一帧(也就是64 DWORD单元数据)(除最后一帧可能不足256字节长以外),每帧应该包含数据长度,帧号,帧数据等。
3).帧发送完成,终端做每帧CRC校验确认,如果确认OK,再发下一帧;如果确认FAIL,则重发该帧。每帧有三次重发需告警。
4).如果中间网络中断,或三次发送失败。应设置定时器,在间隔一定时间以后再作断点续传处理。
5).文件数据传输完毕,终端发出总CRC校验确认信号;如果CRC校验失败;服务器应重新回到第1步开始重传。重传三次失败应该报警处理。如果终端CRC校验成功,服务器需继续发出软件切换命令,以实现终端新下载软件的切换工作。
6).新切换软件运行以后,会重新登陆服务器。
2、下位机软件升级协议内容:
1)上位机下发给下位机的启动升级命令0x20
格式:3C 3C 0E 05 01 FF FE 20 00 00 CRC CRC 0D 0A
其中 20后面的00 00为升级序号
若20后面的00 01为升级序号,表示V4.0或以上版本,支持0x22命 令添加00分隔符。

		下位机应答命令 :
	   3C 3C 0F FF FE 05 01 20 00 00 XX CRC CRC 0D 0A
其中 20后面的00 00为升级序号;XX=01,代表需要下载V1.BIN文件;XX >1(02),表示要求下载V2.BIN文件。
2)上位机下发给下位机升级总体信息命令0x21
	格式:3C 3C 11 05 01 FF FE 21 XH XM XL YH YL ZZ CRC CRC 0D 0A
		其中:XH,XM和XL分别代表总数据长度(3Byte)。高位在前,低位在后。
			  总字节长度=XH*65536+XM*256+XL。
		  	  YH和YL分别代表总帧数(2Byte)。高位在前,低位在后。	
			  总帧数=总字节数/256;如果有余数,则总帧数=总字节数/256 +1;
	              ZZ代表总CRC校验码(1Byte)。总CRC校验为所有字节的异或。 	        下位机应答命令 :
	   3C 3C 0E FF FE 05 01 21 00 00 CRC CRC 0D 0A

3)上位机下发给下位机升级数据命令0x22
格式:3C 3C 11 05 01 FF FE 22 XH XL YH YL 00 ZZ1~ZZn CRC CRC 0D 0A
其中:XH和XL分别代表Frame(2Byte)号,高位在前,低位在后。
Frame:当前正在发送的帧号。起始第一帧为0帧,发送成功一帧以后,
帧号自动加一。
YH和YL分别代表DataLength (2Byte),高位在前,低位在后。
升级数据页长度,一般为256字节,最后一页长度可变。
ZZ1~ZZn代表Data (256Byte)。一帧升级数据,由升级文件提供。

为避免YL刚好为0x0D,ZZ1刚好为0x0A的情况出现,最新版本(V4.0或以上版本)YL和ZZ1之间加了00分隔符,一个字节。
下载0x20命令时,有特别说明。遇到如下问题
注:此帧数据较长,若命令长度大于256;命令开始两个3C后
面的一个字节长度仅代表256的余数。
下位机应答命令 :
3C 3C 0F FF FE 05 01 22 SS XH XL CRC CRC 0D 0A
其中:SS代表Status(1Byte), Status返回下位机升级状态:
01:表示继续升级,02:表示升级成功,确认校验OK,需要上位机发切换信号,03:发送完毕,校验出错,需要上位机重新下载。04:本帧所发数据校验出错,需重发本帧信号。05:请求上位机下发指定帧号的数据。
XH和XL分别代表Frame(2Byte)号,高位在前,低位在后。下位机最新
已成功接收的帧号
4)上位机下发给下位机升级完成切换命令0x23
格式:3C 3C 11 05 01 FF FE 23 00 00 CRC CRC 0D 0A
其中 23后面的00 00为升级序号
5)转义处理
帧尾0x0d、0x0a是特殊的固定值数据,命令(0x22)下载数据里面的内容ZZ1~ZZn可能刚好包括帧结束标志0x0d、0x0a,因此需要通过转义字符来处理该特殊数据。转义字符”@”(0x40),用于去除0x0D这个数据。
通讯帧在最后的数据封装时,当其字段中的数据为0x0D或者0x40时,需要
对数据进行异或处理变成2个字节;通讯帧在最后的数据解包还原时,当其字
段中的数据为 0x40,需要取其后面一个字节与其异或后,还原成一个字节。
例如:
1.0x0D^0x40,处理完后变成0x4D,那么新发出的数据从1个字节0x0D变成
了2个字节0x40 0x4D;
2.0×40^0x40,处理完后变成0x00,那么新发出的数据从1个字节0x40变成了2个字节0x40 0x00。
通讯帧数据解包时:当其他字段中的数据遇到0x40时,需要把0x40和紧跟之后的另外一个字节数据进行异或处理。例如0x40^0x4D,处理完后变成0x0D; 0x40^0x00,处理完后变成0x40。
6)为防止CRC校验码刚好为0d 0a;故,命令中CRC 校验码可以直接用0值替代。

3、上位机界面要求:
1)界面需指定两个升级文件的目录路径和文件名。
2)下载时,按下载按键开始下载。
3)下载过程中,有进度条显示进度。
4)有文本窗口显示下载过程信息为好。

1、下位机文件生成说明:
1)下载文件为两个BIN文件,分别由下位机KEIL编译器生成。两个文件的总内容是相同的,只是代码地址空间不同。
2)其中V1.BIN代码地址空间为0x080080000x0807FFFF;V2.BIN代码地址空间为0x080800000x080FFFFF。
3)地址空间和上位机软件无关。下位机软件编译时,需要选择宏定义。V1.bin和V2.bin是通过编译以后生成的文件,修改文件命令得来。
4)上位机对指定文件名,需作正确判断,错误的文件命令,不给予下载。

物联沃分享整理
物联沃-IOTWORD物联网 » 实现单片机远程升级的最安全方法

发表评论