STM32固件升级

发布于 2020-04-07  577 次阅读


STM32固件升级

传输协议——Ymodem

以下内容摘抄自网络,为了解释Ymodem协议。

最常用的几种通信传输协议有:XModem、YModem、ZModem等。

XModem是最早的协议之一,几乎所有的通讯程序支持的文件传输协议,它传输128字节信息块。

YModem协议是XModem的改进协议,它最用于调制解调器之间的文件传输的协议,具有快速,稳定传输的优点。它的传输速度比XModem快,这是由于它可以一次传输1024字节的信息块,同时它还支持传输多个文件,也就是常说的批文件传输。

ZModem速度快于XModem和YModem,而且可以更好地断开后恢复传输。

如今,XModem基本已经被淘汰,最常用的就是YModem与ZModem。为了后面YModem升级程序实现做铺垫,下面就简单介绍下YModem协议。YModem的说明手册在Ymodem网站上可以查看。

YModem分成YModem-1K与YModem-g。

YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。

YModem-g传输形式与YModem-1K差不多,但是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K来得块。

一般都会选择YModem-1K传输,平时所说的YModem也是指的是YModem-1K。下面就讲讲它的传输协议。

起始帧的数据格式

YModem的起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=33字节。它的数据结构如下:

SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL

其中SOH=0x01,表示这个数据帧中包含着128字节的数据部分;在SOH后面的00 FF,00表示数据帧序号,因为是起始帧,所以它的帧序为00,至于FF,它是帧序的取反,YModem特地这么做是为了给数据是否正确提供一种判断依据,通过判断这两个字节是否为取反关系,就可以知道数据是否传输出错;filename[ ]就是文件名,如文件名foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00,一定要在文件名最后跟上一个00,表示文件名结束;filesize[ ]就是文件大小,如上面的foo.c的大小为1KByte,即1024Byte,需要先将它转化成16进制,即0x400,所以它在数据帧的存放格式为:34 30 30 00,即“400”,同样的文件大小最后需要跟上00,表示结束;NUL[ ]表示剩下的字节都用00填充,数据部分大小为128字节,除去文件名与文件大小占用的空间外,剩余的字节全部用00填充;CRCH CRCL分别表示16位CRC校验码的高8位与低8位。

数据帧的数据格式

YModem的数据帧中会预留1024字节空间用来传输文件数据,它跟起始帧接收差不多,如下:

STX 01 FE data[1024] CRCH CRCL

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;STX后面的01 FE,01表示第一帧数据帧,FE则是它的取反,当然如果是第二帧数据的话就是:01 FD;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A填充,如下结构:

STX [num] [~num] data[ ] 1A ...1A CRCH CRCL

有一种特殊的情况:如果文件大小小于等于128字节或者文件数据最后剩余的数据小于128字节,则YModem会选择SOH数据帧用128字节来传输数据,如果数据不满128字节,剩余的数据用0x1A填充这是数据正的结构就变成了:

文件大小小于128字节: SOH 01 FE data[ ] 1A ...1A CRCH CRCL

文件最后剩余数据小于128字节:SOH [num] [~num] data[ ] 1A...1A CRCH CRCL

结束帧数据结构

YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

SOH 00 FF NUL[128] CRCH CRCL

结束帧同样以SOH开头,表示后面跟着128字节大小的数据;结束帧的帧序也认为是00 FF;结束帧的128字节的数据部分不存放任何信息,即NUL[128]全部用00填充。

文件传输过程

文件的传输过程,以具体的例子说明。把foo.c,大小为4196Byte(16进制为0x1064)的文件作为传输的对象,则它的传输过程如下:

发送端                                                                           接收端
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     C
SOH 00 FF "foo.c" "1064'' NUL[118] CRC CRC >>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     C
STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>      
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
SOH 05 FA data[100]  1A[28] CRC CRC>>>>>>>>>>>>>>>>
......
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    NAK
EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    C
SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK

第一步先由接收方,发送一个字符'C'

发送方收到'C'后,发送第一帧数据包,内容如下:

SOH 00 FF "foo.c" "1064'' NUL[118] CRC CRC

第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024

第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。

第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。

第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, XShell下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。

在文件名和文件大小之后,如果不满128字节,以0补满。

最后两字节:这里需要注意,只有数据部分参与了CRC校验,不包括头和编码部分

16位CRC效验,高字节在前,低字节在后

接收方收到第一帧数据包后,发送ACK正确应答。

然后再发送一个字符'C'。

发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。

接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。

数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。

发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。

最后接收方再发送一个'C',发送方在没有第二个文件要传输的情况下,

发送如下数据

SOH 00 FF 00~00(共128个) CRCH CRCL

接收方应答ACK后,正式结束数据传输。

以上部分,为YMODEM协议的基本操作流程。

YModem的传输过程就是上面所描述的。但是上面传输过程中存在许多通信信号,它们的数值与意义如下表所示:

符号 数值 含义
SOH 0x01 128字节数据包
STX 0x02 1024字节数据包
EOT 0x04 结束传输
ACK 0x06 回应
NAK 0x15 不回应
CA 0x18 传输中止
C 0x43 请求数据包

说明

还有几点需要说明下:

  • EOT信号由发送端发送
  • CA中止传输信号也有发送端发送
  • C的含义在英文的数据手册上的意思有点难以理解,个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!

CRC的计算

​ YModem的采用的是CRC16-CCITT欧洲版本的CRC校验,它的生成多项式为:x16+x12+x5+1。

BootLoader

固件升级的核心就是BootLoader。相较于普通的程序烧录,我们在IAP升级之前,需要提前烧录好一个BootLoader,用来接收保存APP程序,指定程序的跳转等。

APP

APP是用户要升级的固件程序,相对于常规的要烧写的固件,这个的改动不大

  • 最好生成bin格式,否则后期需要上位机去转换成bin格式的文件。
  • 指定FLASH的起始地址和所占FLASH的大小。
  • 程序开始之前,设置中断向量表的映射。

那么我们根据Ymodem协议接收APP的固件,然后保存到指定的FLASH中,最后跳转到指定的FLASH地址执行程序,就完成了固件升级任务。

结束

这里只是简单的介绍一下,有个大概的认知就行。再详细一点的后面再说吧!

至此,所有。


这是一个记录个人学习笔记的博客,如果内容涉嫌侵权,请及时联系我删改。