学习依据的源文链接:STM32 OTA应用开发——通过USB实现OTA升级
前言
在《STM32 OTA Bootloader部分 demo流程学习》一文中,梳理了OTA过程在Bootloader中的逻辑流程,这篇将梳理APP部分在OTA过程的处理;
需要注意的是,这份demo里面,Bootloader部分主要是进行APP跳转(无需升级)和Download分区程序覆盖写入APP分区(有升级需求)的功能,而将新APP传输到Download分区这部分工作放到了APP部分,所以主要是对这部分进行梳理;
APP的OTA功能工作原理
APP运行起来后,需要连接USB,等待上位机发送升级命令,如果收到对应的升级命令,则进入下载模式;demo当中采用USB连接PC,实际实现可能会使用UART替代USB;
考虑到适用性,USB传输固件的方式采用Ymodem协议,可以适配很多上位机的终端程序(Xshell,secureCRT等等),当然,也可以自定义协议;

如上图是APP部分处理OTA过程的流程图,后面重点分析demo是如何通过Ymodem协议传输固件的,以及Ymodem过程的状态机;
YModem协议简介
Ymodem协议是一种数据传输协议,可以用于在计算机之间传输文件。它是Xmodem协议的改进版,支持传输更大的文件和更高的传输速度。Ymodem协议将文件分成128字节的块,每个块都有一个序号和校验号,以确保数据的完整性。传输过程中,接收方会发送一个ACK信号来确认每个块是否已经正确接收。如果出现错误,发送方会重新发送该块。Ymodem协议还支持批处理传输,可以将多个文件打包成一个压缩文件进行传输。
这样看这个协议有些抽象,举个实际通信的例子,例如MCU通过UART与PC上位机终端对接,MCU接收数据,PC发送数据,两方的动作:
- MCU向PC发送一个C字符,请求文件传输。
- PC收到启动命令后,通过Xshell等终端工具集成的Ymodem协议向MCU发送数据包。
- PC将发送的文件分为若干个带有SOH或STX的数据包,分次向MCU发送。
- MCU每收到一个SOH或STX的数据包,需要向PC端返回ACK。
- PC端要收到ACK后才会发送下一个数据包,直到发送完最后一个数据块,收到MCU的ACK后,向MCU发送EOT表示发送结束。
- MCU收到EOT后需要返回一个ACK。
需要注意的是,C字符,ACK,EOT等信息,在Ymodem协议当中都是规定的一个转义字符,具有特定含义,以下列举协议当中的转义字符:
- SOH(Start of Header):表示一个数据块的开始,其值为0x01。
- STX(Start of Text):表示一个数据块的开始,其值为0x02,与SOH的区别在于STX支持1024字节的数据块,而SOH只支持128字节。
- EOT(End of Transmission):表示文件传输结束,其值为0x04。
- ACK(Acknowledgement):表示接收方已经成功接收到一个数据块,其值为0x06。
- NAK(Negative Acknowledgement):表示接收方接收数据出现错误,需要重新发送数据,其值为0x15。
- CAN(Cancel):表示终止文件传输,其值为0x18。
- CRC(Cyclic Redundancy Check):表示数据块的校验和,其值为两个字节的校验和值。
上述的字符值都是与ASCII码对应的;
源码解析
main流程
demo当中的main.c除开初始化系统时钟,USB设备,打印APP信息这些常规操作以外,主要是执行了ymodem_init()和循环执行ymodem_handle();
其中,ymodem_init()主要是初始化了定时器和一个接收队列(ymodem.c line 216),定时器和接收队列在后面的接收数据流程中会用到;
ymodem_handle()当中,针对三个状态做处理:
START_PROGRAM:没有收到升级命令,继续执行原本程序
UPDATE_PROGRAM:收到升级命令,通过USB向上位机发送一个字符C,表示可以进行Ymodem传输;
UPDATE_SUCCESS:升级完成后,重置Setting区域的标志,然后重启MCU,后面又会从Bootloader启动,在Boo

文章详细介绍了STM32应用程序(APP)如何通过USB接口和Ymodem协议实现固件的OTA更新。在Bootloader仅负责跳转和更新时,APP部分负责接收新固件并使用Ymodem进行传输。Ymodem协议确保数据完整性,通过特定的控制字符进行交互。文章还解析了接收数据的流程和Ymodem数据处理状态机,包括从升级命令到接收新固件包的整个过程。
6830

被折叠的 条评论
为什么被折叠?



