发明内容
本申请提供一种单片机在线升级方法和系统,以解决由于升级程序文件错误而导致的MCU在线升级错误或失败的问题。
为了解决上述问题,本申请公开了一种单片机在线升级方法,包括:
读取外置存储设备中的升级程序文件和所述升级程序文件对应的标准校验码;
对所述升级程序文件进行校验,得到实际校验码;
比较所述实际校验码和所述标准校验码,当所述实际校验码与所述标准校验码一致时,写入待升级标志;
对所述升级程序文件进行CRC16计算,得到计算结果;
根据所述计算结果,写入所述升级程序文件。
较佳地,所述读取外置存储设备中的升级程序文件,包括:
读取外置存储设备中的程序文件,根据文件特征码,判断所述程序文件是否为升级程序文件,得到判断结果;
根据所述判断结果,获取得到所述升级程序文件。
较佳地,所述对所述升级程序文件进行CRC16计算,得到计算结果,包括:
逐次提取所述升级程序文件,其中,每次提取所述升级程序文件中的16字节数据;
对提取得到的所述16字节数据进行CRC16计算,生成所述16字节数据对应的CRC16第一校验码;
生成包含所述16字节数据和所述第一校验码的校验数据;
对所述校验数据中的16字节数据再次进行CRC16计算,生成第二校验码。
较佳地,所述根据计算结果,写入所述升级程序文件,包括:
比较所述第一校验码和所述第二校验码的一致性,当所述第一校验码和所述第二校验码一致时,写入所述校验数据中的所述16字节数据;
当所述第一校验码和所述第二校验码不一致时,升级过程失败,所述待升级标志更新为升级失败标志。
较佳地,所述根据所述计算结果,写入所述升级程序文件,包括:
当写入所有提取得到的所述16字节数据后,升级成功,所述待升级标志更新为升级成功标志。
相应的本申请实施例公开了一种单片机在线升级系统,包括:
文件读取模块,用于读取外置存储设备中的升级程序文件和所述升级程序文件对应的标准校验码;
校验码生成模块,用于对所述升级程序文件进行校验,得到实际校验码;
比较模块,用于比较所述实际校验码和所述标准校验码,在所述实际校验码与所述标准校验码一致时,写入待升级标志;
CRC16计算模块,用于对所述升级程序文件进行CRC16计算,得到计算结果;
文件写入模块,用于根据所述计算结果,写入所述升级程序文件。
较佳地,所述文件读取模块,包括:
判断子模块,用于读取外置存储设备中的程序文件,根据升级程序文件特征码,判断所述程序文件是否为升级程序文件,得到判断结果;
获取子模块,用于根据所述判断结果,获取得到所述升级程序文件。
较佳地,所述CRC16计算模块,包括:
提取子模块,用于逐次提取所述升级程序文件,其中,每次提取所述升级程序文件中的16字节数据;
第一校验码生成子模块,用于对提取得到的所述16字节数据进行CRC16计算,生成所述16字节数据对应的CRC16第一校验码;
校验数据生成子模块,用于生成包含所述16字节数据和所述第一校验码的校验数据;
第二校验码生成子模块,对所述校验数据中的16字节数据再次进行CRC16计算,生成第二校验码。
较佳地,所述文件写入模块,包括:
CRC16校验码比较子模块,用于比较所述第一校验码和所述第二校验码的一致性;
第一写入子模块,用于在所述第一校验码和所述第二校验码一致时,写入所述校验数据中的所述16字节数据;
第二写入子模块,用于在所述第一校验码和所述第二校验码不一致,升级过程失败时,将所述待升级标志更新为升级失败标志。
较佳地,所述文件写入模块,包括:
第三写入子模块,用于在写入所有提取得到的所述16字节数据后,升级成功时,将所述待升级标志更新为升级成功标志。
与现有技术相比,本申请包括以下优点:
本申请实施例所述的一种单片机在线升级方法,通过对读取得到的外置存储设备中的升级程序文件进行校验,判断升级程序文件是否正确,当升级程序文件正确时,再根据所述升级程序文件进行在线升级过程,避免了因升级程序文件错误而造成MCU在线升级过程错误或失败的问题。
具体实施方式
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。
本申请实施例所述的一种单片机在线升级方法,从外置存储设备中读取得到的升级程序文件,并对所述升级程序文件进行校验,确保升级程序文件的正确性,当所述升级程序文件通过校验后,再根据CRC16算法完成MCU在线升级过程,由于在升级之前对升级程序文件的正确性做了校验,因此,避免了因升级程序文件错误而带来的升级错误或升级失败的问题。
参照图1,示出了本申请实施例所述一种单片机在线升级方法的流程图。所述单片机在线升级方法,包括:
步骤102,读取外置存储设备中的升级程序文件和标准校验码;
单片机本身是没有在线升级功能的,,在本申请实施例中,可以选择采用基于flash存储技术的MCU芯片(flash是存储芯片的一种,通过特定的程序可以修改里面的数据),并通过外置存储设备来实现MCU的在线升级过程,其中,所述外置存储设备可以是:SD卡(Secure Digital Memory Card)、U盘或闪存等。升级程序文件可以保存在外置存储设备中,MCU通过读取存储在外置存储设备中的升级程序文件,然后写入所述升级程序文件,完成在线升级过程。其中,所述升级程序文件都有一个对应的标准校验码,所述标准校验码和所述升级程序文件都保存在外置存储设备中,通过标准校验码可以用来验证所述升级程序文件的正确性。
步骤104,对所述升级程序文件进行校验,得到实际校验码;
在实际应用中,可能会因为外置存储设备的损坏或外置存储设备错误而导致外置存储设备中存储的升级程序文件发生错误;外置存储设备中存储的升级程序文件也有可能被窜改,而不是原始状态的升级程序文件。在本申请实施例中,通过对提取得到的升级程序文件进行校验,得到实际校验码,来判断升级程序文件的正确性。
步骤106,比较所述实际校验码和所述标准校验码,当所述实际校验码与所述标准校验码一致时,写入待升级标志;
将得到的实际校验码与标准校验码进行比较,当两者一致时,说明升级程序文件是正确的,可以根据所述升级程序文件进行在线升级,在MCU中写入一个待升级标志;当两者不一致时;说明升级程序文件不正确,可能是外置存储设备错误导致升级程序文件错误,也可能是升级程序文件缺失或被窜改,所述升级程序文件不能继续使用。
步骤108,对所述升级程序文件进行CRC16计算,得到计算结果;
步骤110,根据所述计算结果,写入所述升级程序文件。
综上所述,本申请实施例提供的一种单片机在线升级方法,从外置存储设备中读取得到的升级程序文件和标准校验码,并对所述升级程序文件进行校验,得到实际校验码,通过比较所述标准校验码和所述实际校验码,确保升级程序文件的正确性,当确定所述升级程序文件正确后,再根据CRC16算法完成MCU在线升级过程,由于在升级之前对升级程序文件的正确性做了校验,因此,避免了因升级程序文件错误而带来的升级错误或升级失败的问题。
参照图2,示出了本申请另一实施例所述一种单片机在线升级方法的流程图。所述单片机在线升级方法,包括:
步骤202,读取外置存储设备中的升级程序文件和标准校验码;
在实际应用中,外置存储设备中可以存储很多文件,需要从这些文件中确定升级程序文件,步骤202,可以包括:
子步骤2022,读取外置存储设备中的程序文件,根据文件特征码,判断所述程序文件是否为升级程序文件,得到判断结果;
在本申请实施例中,所述升级程序文件可以是S19格式文件,S19格式文件可以是由名为Freecale CodeWarrior的编译器生成的后缀名为.S19的文件,S19格式文件每一行称为一个S记录,每个S记录由记录类型、记录长度、存储地址、代码/数据、校验和五个部分组成,每字节数据被编译成两个16进制字符。可以通过在S19格式文件前添加一个用于识别的特征码,当读取外置存储设备中的程序文件时,判断读取的程序文件是否带有所述特征码。
子步骤2024,根据所述判断结果,获取得到所述升级程序文件;
当读取的程序文件带有所述特征码时,则所述程序文件为升级程序文件,获取所述升级程序文件。
步骤204,对所述升级程序文件进行校验,得到实际校验码;
在本申请中,可以通过MD5校验法对所述升级程序文件进行校验。MD5即Message-Digest Algorithm5,信息-摘要算法5,MD5的可以对一段信息(message)生成信息摘要(message-digest),所述信息摘要对所述信息具有唯一性,可以作为数字签名用于验证文件的正确性。可以将正确的升级程序文件对应的MD5码存储在外置存储设备中作为标准MD5码,对读取得到的升级程序文件进行MD5校验,根据S19文件的字节串,每个字节是8个bit,计算实际的MD5码,MD5计算方法可以如下:
第一步,补位:MD5算法先对输入的数据进行补位,使得数据的长度(以byte为单位)对64求余的结果是56。即数据扩展至LEN=K*64+56个字节,K为整数。补位方法:补一个1,然后补0直至满足上述要求。相当于补一个0x80的字节,再补值为0的字节。这一步里总共补充的字节数为0~63个;
第二步,附加数据长度:用一个64位的整数表示数据的原始长度(以bit为单位),将这个数字的8个字节按低位的在前,高位在后的顺序附加在补位后的数据后面。这时,数据被填补后的总长度为:LEN=K*64+56+8=(K+1)*64Bytes;
第三步,初始化MD5参数:有四个32位整数变量(A,B,C,D)用来计算信息摘要,每一个变量被初始化成以下以十六进制数表示的数值,低位的字节在前面;
第四步,定义四个MD5基本的按位操作函数,其中X、Y、Z为32位整数:F(X,Y,Z)=(Xand Y)or(not(X)and Z)、G(X,Y,Z)=(X and Z)or(Y and not(Z))和H(X,Y,Z)=X xor Yxor Z、I(X,Y,Z)=Y xor(X or not(Z));
再定义四个分别用于四轮变换的函数,其中,假设Mj表示消息的第j个子分组(从0到15),<<<s表示循环左移s位,则四种操作为:
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s);
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s);
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s);
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s);
第五步,对输入数据作变换:处理数据,N是总的字节数,以64个字节为一组,每组作一次循环,每次循环进行四轮操作。要变换的64个字节用16个32位的整数数组M[0...15]表示。而数组T[1...64]表示一组常数,T[i]为4294967296*abs(sin(i))的32位整数部分,i的单位是弧度,i的取值从1到64;
第六步,输出结果。A,B,C,D连续存放,共16个字节,128位。按十六进制依次输出这个16个字节。
步骤206,比较所述实际校验码和所述标准校验码,当所述实际校验码与所述标准校验码一致时,写入待升级标志;
每个文件对应的MD5码都是不同的,如果标准MD5码与实际计算得到的MD5码一致,说明获取得到的升级程序文件是正确的,从而避免了因升级程序文件的错误而导致升级过程错误或失败的问题。
步骤208,对所述升级程序文件进行CRC16计算,得到计算结果;步骤208可以包括:
子步骤2082,逐次提取所述升级程序文件,其中,每次提取所述升级程序文件中的16字节数据;
子步骤2084,对提取得到的所述16字节数据进行CRC16计算,生成所述16字节数据对应的CRC16第一校验码;
其中,对所述16字节数据进行CRC16计算,计算方法可以如下:
1、预置1个16位的寄存器为十六进制FFFF(即全为1),所述寄存器为CRC寄存器;
2、把第一个8位二进制数据与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变;
3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、重复步骤3和4,直到右移8次,将整个8位数据全部进行处理;
6、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8、最后得到的CRC寄存器内容即为CRC16码。
子步骤2086,生成包含所述16字节数据和所述第一校验码的校验数据;
子步骤2088,对所述校验数据中的16字节数据再次进行CRC16计算,生成第二校验码。
在本申请实施例中,MPU可以用于读取外置存储设备中的升级程序文件,并对升级程序文件进行MD5校验和CRC16计算,所述第一校验码可以是MPU对升级程序文件进行CRC16计算的结果,MPU生成所述校验数据并发送给MCU,MCU此时需要多所述校验数据中的所述16字节数据再次进行CRC16计算,生成第二校验码,来确保发送接收过程中所述校验数据的正确性,当所述第一校验码和所述第二校验码一致时,所述16字节数据在发送和接收过程中没有出错,是正确的。
步骤210,根据所述计算结果,写入所述升级程序文件。所述步骤210可以包括:
子步骤2102,比较所述第一校验码和所述第二校验的一致性;
当比较结果为:所述第一校验码和所述第二校验不一致,进行子步骤2104,升级过程失败,所述待升级标志更新为升级失败标志;
当比较结果为:所述第一校验码和所述第二校验一致,则,进行:
子步骤2106,写入所述校验数据中的所述16字节数据;
子步骤2108,当写入所有提取得到的所述16字节数据后,升级成功,所述待升级标志更新为升级成功标志。
综上所述,本申请实施例所述一种单片机在线升级方法,通过MD5校验法对读取得到的升级程序文件进行校验,确保升级程序文件的正确性,再通过CRC16算法完成在线升级过程,当CRC16第一校验码与第二校验码一致时,保留升级程序文件数据,避免了因升级程序文件错误而导致的升级错误或升级失败的问题,实现了单片机的在线升级过程。
下面通过一个具体实施例来说明上述方法的实现流程,首先,MCU芯片可以选择采用基于FLASH存储技术的芯片,使之具备在线升级的可能性;其次,在MCU程序存储空间的规划上,可以分出一块独立的,受擦写保护的存储区域(boot区域),所述boot区域中可以保存擦写FLASH的程序模块,MPU与MCU通讯协议解析的模块,CRC16算法模块,以boot区域单元的程序为基础,实现更新MCU程序的功能,MCU的程序存储空间中另一部分存储应用程序,完成在线升级过程中涉及的其它功能。已SD卡中存储的S19升级程序文件为例,具体升级方法流程可以如下:
步骤1:插入SD卡,MPU根据程序文件特征码读取得到S19格式的升级程序文件和MD5标准校验码;
步骤2:MPU对所述S19格式文件进行MD5校验,生成实际MD5校验码,当实际MD5校验码与所述MD5标准校验码一致时,表示升级程序文件正确,MPU读取S19格式文件中的所有有效数据;
步骤3:MPU发送指令给MCU,使之跳转至boot区域执行程序,同时在boot区域FLASH中最后四个字节空间记录待升级标志,比如:0x55555555;
步骤4:MCU发起升级通讯请求,MPU开始发送S19格式文件数据至MCU,每次传送16字节数据,并对所述16字节数据生成CRC16第一校验码,并将所述第一校验码也传送至MCU,即将所述16字节的S19格式文件数据和所述第一校验码一并传送至MCU;
步骤5:MCU收到所述16字节的S19格式文件数据和所述第一校验码,然后对收到的16字节数据再次进行CRC16计算,生成第二校验码校验码,与收到的第一校验码进行比较,当所述第一校验码和所述第二校验码一致时,保留所述16字节数据,当所述第一校验码和所述第二校验码不一致时,MCU可以请求MPU重新发送数据,如果重试两次收发后,所述第一校验码和所述第二校验码仍然不一致,那么MCU更新boot区域FLASH中最后四个字节为升级失败标志,比如:0xaaaaaaaa;
步骤6,所有字节接收完成后,MCU将所有数据更新至应用程序空间后,在线升级成功,MCU清除待升级标志为升级成功标志,比如:0oaaaaaaaa。
综上所述,本申请实施例所述一种单片机在线升级方法,MPU通过采用MD5校验法对升级程序文件进行校验,然后对通过MD5校验的升级程序文件进行CRC16计算,得到CRC16第一校验码,再将升级程序文件数据和所述第一校验码发送给MCU;MCU再次对升级程序文件数据进行CRC16计算,得到第二校验码,通过比较所述第一校验码和所述第二校验码的一致性,来判断数据传输过程是否正确,当所述第一校验码和所述第二校验码一致时,写入升级程序文件数据;当所述第一校验码和所述第二校验码不一致时,MCU发送请求,MPU重新发送一次数据,当多次发送数据后,所述第一校验码和所述第二校验码不一致,则认为升级过程失败。进一步的,在开始升级时,在boot区域写入待升级标志,在升级过程结束后,将所述待升级标志更新为升级成功标志,或升级失败标志。通过本申请实施例提供的方法,可以确保整个升级过程中升级程序文件的正确性,从而完成单片机在线升级过程。
需要说明的是,对于前述的方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请所必需的
基于上述方法实施例的说明,本申请还提供了相应的单片机在线升级系统的实施例,来实现上述方法实施例所述的内容。
参照图3,示出了本申请实施例所述一种单片机在线升级系统的结构框图,所述单片机在线升级系统,包括:
文件读取模块302,用于读取外置存储设备中的升级程序文件和所述升级程序文件对应的标准校验码;
校验码生成模块304,用于对所述升级程序文件进行校验,得到实际校验码;
比较模块306,用于比较所述实际校验码和所述标准校验码,在所述实际校验码与所述标准校验码一致时,写入待升级标志;
CRC16计算模块308,用于对所述升级程序文件进行CRC16计算,得到计算结果;
文件写入模块310,用于根据所述计算结果,写入所述升级程序文件,升级结束。
综上所述,本申请实施例所述的一种单片机在线升级系统,读取外置存储设备中的升级程序文件和标准校验码,然后对所述升级程序文件进行校验,生成实际校验码,将所述实际校验码与所述标准校验码比价来判断读取得到的升级程序文件是否正确,当升级程序文件正确时,再根据所述升级程序文件进行在线升级过程,避免了因升级程序文件错误而造成MCU在线升级过程错误或失败的问题。
参照图4,示出了本申请另一实施例所述一种单片机在线升级系统的结构框图。所述单片机在线升级系统包括:
文件读取模块402,用于读取外置存储设备中的升级程序文件和所述升级程序文件对应的标准校验码;
在本申请实施例中,所述文件读取模块402,可以包括:
判断子模块4022,用于读取外置存储设备中的程序文件,根据升级程序文件特征码,判断所述程序文件是否为升级程序文件,得到判断结果;
获取子模块4024,用于根据所述判断结果,获取得到所述升级程序文件。
校验码生成模块404,用于对所述升级程序文件进行校验,得到实际校验码;
比较模块406,用于比较所述实际校验码和所述标准校验码,在所述实际校验码与所述标准校验码一致时,写入待升级标志;
CRC16计算模块408,用于对所述升级程序文件进行CRC16计算,得到计算结果;
在本申请实施例中,所述CRC16计算模块408,可以包括:
提取子模块4082,用于逐次提取所述升级程序文件,其中,每次提取所述升级程序文件中的16字节数据;
第一校验码生成子模块4084,用于对提取得到的所述16字节数据进行CRC16计算,生成所述16字节数据对应的CRC16第一校验码;
校验数据生成子模块4086,用于生成包含所述16字节数据和所述第一校验码的校验数据;
第二校验码生成子模块4088,对所述校验数据中的16字节数据再次进行CRC16计算,生成第二校验码。
文件写入模块410,用于根据所述计算结果,写入所述升级程序文件。
在本申请实施例中,所述文件写入模块410,可以包括:
CRC16校验码比较子模块4102,用于比较所述第一校验码和所述第二校验码的一致性;
第一写入子模块4104,用于在所述第一校验码和所述第二校验码一致时,写入所述校验数据中的所述16字节数据;
第二写入子模块4106,用于在所述第一校验码和所述第二校验码不一致,升级过程失败时,将所述待升级标志更新为升级失败标志;
第三写入子模块4108,用于在写入所有提取得到的所述16字节数据后,升级成功时,将所述待升级标志更新为升级成功标志。
综上所述,本申请实施例所述的一种单片机在线升级方法,通过对读取得到的外置存储设备中的升级程序文件进行校验,判断升级程序文件是否正确,当升级程序文件正确时,再根据所述升级程序文件进行在线升级过程,避免了因升级程序文件错误而造成MCU在线升级过程错误或失败的问题。
对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
以上对本申请所提供的一种单片机在线升级方法和系统,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。