注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区)。

如:Flash64KBBootLoader10KB,那么用户代码应存放在Flash0X08003000地址

BootLoader要实现的功能一般有:

  • 接收上位机发过来的.bin固件并写入APP区(主Flash空间 - BootLoader所占用空间 = APP区
  • 读取APP区内容并发送给上位机
  • 擦除芯片

需要注意的是,如果使用IAP的话,就不可以使用厂家固化好的BootLoader(一般来说是将BOOT0引脚拉低),而应该使用用户自己的BootLoader

使用用户自己的BootLoader烧录完程序后需执行跳转指令,跳转到APP区,这样就实现了IAP

ICP

ICP即在电路编程(In Circuit Programming)

使用厂家配套的软件或仿真器进行程序烧录。

BootLoader

以下两张图应该可以很好地反映出BootLoader的作用:

BOOTLOADER.png

BootLoader整体流程设计.png

Ymodem

YModem议由XModem协议演变而来,是一种比较高效的文件传输协议,每包数据1024或者128字节。

帧格式

Ymodem协议有两种帧格式,主要区别是信息块长度不一样。

名称帧头包号包号反码信息块校验
简写SOH/STXPNXPNDATACRC16
字节数111128/10242

帧头

主要用来区分信息块长度;

帧头为SOH(在传输中以0X01表示),表示该帧信息块是128字节;

帧头为STX(在传输中以0X02表示),表示该帧信息块是1024字节。

包序号

数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。

帧长度

  1. SOH(0x01)开始的数据包,信息块是128字节,该类型帧总长度为133字节。

  2. STX(0x02)开始的数据包,信息块是1024字节,该类型帧总长度为1029字节

校验

Ymodem协议采用的是CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后;CRC计算数据为信息块数据,不包含帧头、包号、包号反码。

握手信号

握手信号由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C字符C 即:'C'ASII码为0x43,发送方收到后,开始传输起始帧。

起始帧

Ymodem起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH 133字节长度帧传输的,格式如下表:

帧头包号包号反码文件名文件大小填充区校验高位校验低位
SOH0X000XFFFile Name + 0X00File Size + 0X000X00CRC-HCRC-L

其中包号为固定为0X00;

File Name为文件名称,文件名称后必须加0x00作为结束;

File Size为文件大小值,文件大小值后必须加0x00作为结束;

余下未满128字节数据区域,以0x00填充。

数据帧

帧头包号包号反码有效数据校验高位校验低位
SOH/STXPNXPNDATACRC-HCRC-L

传输有效数据时,主要考虑的是最后一包数据的处理,SOH帧和STX帧有不同的处理,具体如下:

  1. 对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。
  2. 对于STX帧需考虑几种情况:
    1. 余下数据等于1024字节,以1029长度帧发送;
    2. 余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以0x1A填充;
    3. 余下数据等于128字节,以133字节帧长度发送;
    4. 余下数据小于128字节,以133字节帧长度发送,无效数据以0x1A填充。

结束帧

Ymodem协议的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。

常用命令

命令命令码说明
SOH0X01128字节数据包
STX0X021024字节数据包
EOT0X04结束传输
ACK0X06应答
NAK0X15无应答,需重传当前数据包
CA0X18取消传输,连续两个表示取消
C0X43‘C’ 握手信号
ABORT10X41‘A’ 用户取消
ABORT20X61‘a’ 用户取消

Ymodem完整传输过程

SENDER:发送方(文件名:fileName.bin - 12Bytes
RECEIVER:接收方

具体握手的步骤如下:

  1. 接收方发送一个字符C,也就是十六进制0X43,代表接收方已经处于接收数据的状态。
  2. 发送方接收到字符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.bin NULL[116 - 文件大小所占字节数]信息块128字节。 fileName.bin是文件名,在文件名后面还有文件大小。数据区不足128字节的,用0x00补齐。
    CRC校验(最后2个字节):16位CRC校验,高位字节在前,地位字节在后。(注意:只有数据区进行CRC校验,不包含头、编码、编码反码)。
  3. 接收方收到数据包后,发送ACK正确应答,然后发送一个字符C
  4. 发送方收到字符C后,开始发送第二帧数据,第二帧数据存放的是第一包数据
  5. 接收方收到数据包后,发送ACK正确应答,然后等待下一包数据传送完毕,继续ACK应答,如此循环。
  6. 数据传输完毕后,发送方第一次发EOT,第一次接收方以NAK应答,进行二次确认。
  7. 发送方收到NAK后,第二次发EOT。接收方第二次收到结束符,依次以ACKC作为应答。
  8. 发送方收到ACKC之后,发送结束帧:SOH 00 FF 00...00[128个00] CRC-H CRC-L
  9. 接收方收到结束符之后,以ACK做应答,然后通信正式结束。

— 摘自 CSDN - STM32基于YModem协议串口升级程序的实现

YMODE整体分类总结

YModem分为YModem-1KYModem-g

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

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

— 摘自 CSDN - YMODE协议注意事项详解

代码实现

具体代码实现可参考如下链接:

参考文章

CSDN - YMODE协议注意事项详解

CSDN - STM32基于YModem协议串口升级程序的实现

Github - STM32F103-UartIAP Demo

Github - STM32F4_SerialPort_BootLoader Demo

Github - STM32-IAP Demo