STM32 OTA APP部分 demo流程学习

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

 学习依据的源文链接: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发送数据,两方的动作:

  1. MCU向PC发送一个C字符,请求文件传输。
  2. PC收到启动命令后,通过Xshell等终端工具集成的Ymodem协议向MCU发送数据包。
  3. PC将发送的文件分为若干个带有SOH或STX的数据包,分次向MCU发送。
  4. MCU每收到一个SOH或STX的数据包,需要向PC端返回ACK。
  5. PC端要收到ACK后才会发送下一个数据包,直到发送完最后一个数据块,收到MCU的ACK后,向MCU发送EOT表示发送结束。
  6. MCU收到EOT后需要返回一个ACK。

需要注意的是,C字符,ACK,EOT等信息,在Ymodem协议当中都是规定的一个转义字符,具有特定含义,以下列举协议当中的转义字符:

  1.  SOH(Start of Header):表示一个数据块的开始,其值为0x01。
  2.  STX(Start of Text):表示一个数据块的开始,其值为0x02,与SOH的区别在于STX支持1024字节的数据块,而SOH只支持128字节。
  3.  EOT(End of Transmission):表示文件传输结束,其值为0x04。
  4.  ACK(Acknowledgement):表示接收方已经成功接收到一个数据块,其值为0x06。
  5.  NAK(Negative Acknowledgement):表示接收方接收数据出现错误,需要重新发送数据,其值为0x15。
  6.  CAN(Cancel):表示终止文件传输,其值为0x18。
  7.  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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值