使用Ymodem+BootLoader进行固件升级
注1:
上位机发送的固件后缀必须为.bin
而不能为.hex
!!! 具体二者区别可自行搜索……
注2:
旧版本的SecureCRT
可能会导致传输时首包数据丢失文件大小信息(文件名后边的那个),可用Xshell等其他支持Ymodem协议的工具
ISP&IAP&ICP
ISP
ISP即在系统编程(In System Programming)
;
该操作是MCU
厂商在芯片出厂前已经固化好的BootLoader
实现的,该BootLoader
存放于flash中的信息块,用户不可操作。
IAP
IAP
即在应用编程(In Application Programming)
;
该操作需工程师自行编写BootLoader
来实现:将芯片Flash区域分割成多个部分,BootLoader
存放在Flash开头(大小10kb
以内,一般来说,越复杂的功能占用空间越多),其余空间为用户代码区(以下简称APP区
)。
如:Flash
共64KB
,BootLoader
占10KB
,那么用户代码应存放在Flash
的0X08003000
地址
该BootLoader
要实现的功能一般有:
- 接收上位机发过来的
.bin
固件并写入APP区
(主Flash
空间 -BootLoader
所占用空间 =APP区
) - 读取
APP区
内容并发送给上位机 - 擦除芯片
需要注意的是,如果使用IAP的话,就不可以使用厂家固化好的BootLoader
(一般来说是将BOOT0
引脚拉低),而应该使用用户自己的BootLoader
。
使用用户自己的BootLoader
烧录完程序后需执行跳转指令,跳转到APP区
,这样就实现了IAP
。
ICP
ICP
即在电路编程(In Circuit Programming)
;
使用厂家配套的软件或仿真器进行程序烧录。
BootLoader
以下两张图应该可以很好地反映出BootLoader
的作用:

Ymodem
YModem
议由XModem
协议演变而来,是一种比较高效的文件传输协议,每包数据1024或者128字节。
帧格式
Ymodem
协议有两种帧格式,主要区别是信息块长度不一样。
名称 | 帧头 | 包号 | 包号反码 | 信息块 | 校验 |
---|---|---|---|---|---|
简写 | SOH/STX | PN | XPN | DATA | CRC16 |
字节数 | 1 | 1 | 1 | 128/1024 | 2 |
帧头
主要用来区分信息块长度;
帧头为SOH
(在传输中以0X01
表示),表示该帧信息块是128字节;
帧头为STX
(在传输中以0X02
表示),表示该帧信息块是1024字节。
包序号
数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。
帧长度
以
SOH(0x01)
开始的数据包,信息块是128字节,该类型帧总长度为133字节。以
STX(0x02)
开始的数据包,信息块是1024字节,该类型帧总长度为1029字节
校验
Ymodem
协议采用的是CRC16
校验算法,校验值为2字节,传输时CRC
高八位在前,低八位在后;CRC
计算数据为信息块数据,不包含帧头、包号、包号反码。
握手信号
握手信号由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C
字符C 即:'C'
,ASII
码为0x43
,发送方收到后,开始传输起始帧。
起始帧
Ymodem
起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH
133字节长度帧传输的,格式如下表:
帧头 | 包号 | 包号反码 | 文件名 | 文件大小 | 填充区 | 校验高位 | 校验低位 |
---|---|---|---|---|---|---|---|
SOH | 0X00 | 0XFF | File Name + 0X00 | File Size + 0X00 | 0X00 | CRC-H | CRC-L |
其中包号为固定为0X00;
File Name为文件名称,文件名称后必须加0x00
作为结束;
File Size为文件大小值,文件大小值后必须加0x00
作为结束;
余下未满128字节数据区域,以0x00
填充。
数据帧
帧头 | 包号 | 包号反码 | 有效数据 | 校验高位 | 校验低位 |
---|---|---|---|---|---|
SOH/STX | PN | XPN | DATA | CRC-H | CRC-L |
传输有效数据时,主要考虑的是最后一包数据的处理,SOH
帧和STX
帧有不同的处理,具体如下:
- 对于
SOH
帧,若余下数据小于128字节,则以0x1A
填充,该帧长度仍为133字节。 - 对于
STX
帧需考虑几种情况:- 余下数据等于1024字节,以1029长度帧发送;
- 余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以
0x1A
填充; - 余下数据等于128字节,以133字节帧长度发送;
- 余下数据小于128字节,以133字节帧长度发送,无效数据以
0x1A
填充。
结束帧
Ymodem
协议的结束帧采用SOH
133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00
填充。
常用命令
命令 | 命令码 | 说明 |
---|---|---|
SOH | 0X01 | 128字节数据包 |
STX | 0X02 | 1024字节数据包 |
EOT | 0X04 | 结束传输 |
ACK | 0X06 | 应答 |
NAK | 0X15 | 无应答,需重传当前数据包 |
CA | 0X18 | 取消传输,连续两个表示取消 |
C | 0X43 | ‘C’ 握手信号 |
ABORT1 | 0X41 | ‘A’ 用户取消 |
ABORT2 | 0X61 | ‘a’ 用户取消 |
Ymodem完整传输过程
SENDER:发送方(文件名:fileName.bin - 12
Bytes
)
RECEIVER:接收方具体握手的步骤如下:
- 接收方发送一个字符
C
,也就是十六进制0X43
,代表接收方已经处于接收数据的状态。- 发送方接收到字符
C
之后,发送头帧数据包,内容如下:SOH 00 FF fileName.bin fileSize NULL[116] CRC-H CRC-L
数据包内容解释:
SOH(第1字节):表示本数据区大小有128字节。(STX表示本数据包数据区大小1024字节)。
00(第2字节):数据块编号。 第一包为00,第二包为01,此后依次累加。FF后,继续从00循环。
FF(第3字节):数据块编号的反码。 编号00->FF,01->FE,此后依次类推。
fileName.binNULL[116 - 文件大小所占字节数]
:信息块128字节。 fileName.bin是文件名,在文件名后面还有文件大小。数据区不足128字节的,用0x00补齐。CRC
校验(最后2个字节):16位CRC
校验,高位字节在前,地位字节在后。(注意:只有数据区进行CRC
校验,不包含头、编码、编码反码)。- 接收方收到数据包后,发送
ACK
正确应答,然后发送一个字符C
。- 发送方收到字符
C
后,开始发送第二帧数据,第二帧数据存放的是第一包数据。- 接收方收到数据包后,发送
ACK
正确应答,然后等待下一包数据传送完毕,继续ACK
应答,如此循环。- 数据传输完毕后,发送方第一次发
EOT
,第一次接收方以NAK
应答,进行二次确认。- 发送方收到
NAK
后,第二次发EOT
。接收方第二次收到结束符,依次以ACK
和C
作为应答。- 发送方收到
ACK
和C
之后,发送结束帧:SOH 00 FF 00...00[128个00] CRC-H CRC-L
- 接收方收到结束符之后,以
ACK
做应答,然后通信正式结束。
YMODE整体分类总结
YModem
分为YModem-1K
与YModem-g
:
YModem-1K
用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC
校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK
信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。YModem-g
传输形式与YModem-1K
差不多,但是它去掉了数据的CRC
校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK
信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K
来得块。 一般都会选择YModem-1K
传输,平时所说的YModem
也是指的是YModem-1K
。
— 摘自 CSDN - YMODE协议注意事项详解
代码实现
具体代码实现可参考如下链接:
参考文章
CSDN - STM32基于YModem协议串口升级程序的实现
Github - STM32F103-UartIAP Demo