使用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
