硬件:正点原子mini开发板v3.0,使用的硬件有f103RCT6芯片、w25q64 flash芯片、AT24C02 EEPROM芯片。
软件:STM32CubeMx、Keil5
上位机:SecureCRT、野火上位机
本程序主要参考哔站up主:超子说物联网,有具体视频可以学习,本人只是进行了一个HAL库的移植和一些逻辑的修改,如果有侵权会删除文章。还有就是本人的OTA逻辑可能存在疏漏,欢迎大家向我提出质疑。
关于程序具体实现的链接:
链接:https://pan.baidu.com/s/12rTU0TcYWFOXtAEGvi01oQ?pwd=6666
提取码:6666
本程序IAP升级流程属于双app升级,其中w25q64存放app副本,AT24C02用于存放OTA结构体,判断是否需要进行OTA升级以及版本号等信息。当然也可以把boot程序、app程序、app副本程序和OTA结构体信息在一个单片机flash中分区存放从而省下一个w25q64和一个AT24C02,但是这样做要求单片机flash大小足够,后面有时间会尝试这个做法。(挖个坑)
串口IAP大致升级步骤如下:
bootloader程序执行流程:
app程序执行流程:
上述逻辑规避OTA升级时出错的方法:
1、当上位机向单片机w25q64烧写程序时断开连接,由于已经清掉了OTA_FLAG,单片机复位后仍然能够继续运行APP程序,而且由于新的APP程序没有被烧录,所以版本号还是之前的,通过对比版本号可以知道没有升级成功。
2、当w25q64已经下载了新的app程序,向单片机复制的时候出现了问题,这个时候分为能够跳转和无法跳转两个情况,如果无法跳转那么程序会进入boot命令行,这次可以选择IAP升级再次对程序进行升级;如果跳转成功但是程序出问题了,可以复位单片机,然后2s内输入w主动后进入boot命令行,选择IAP升级再次对程序进行升级;
关于为什么要先把程序下载到w25q64,然后再复制到单片机中进行OTA升级,而不是直接把程序下载到flash中。这其实就是双app升级和单app升级的区别,单app升级如果传输出现问题了就会一直卡在bootloader,而双app传输出现问题了还能回到app运行原先的程序。虽然双app升级时,在将程序从一个flash复制到另一个flash的过程中也可能出错,但是这个概率远比上位机把程序传输到flash这个过程中出错的概率小。
Xmodem协议:
XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节(ACK)。该协议的CRC多项式校验值为:
多项式poly | 0x1021 |
初始值init | 0x0000 |
Xmodem协议相关控制字符
SOH 0x01
STX 0x02
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
CTRLZ 0x1A
XModem-CRC16
在XModem-CRC16的数据帧中使用128字节空间用来传输文件数据,帧格式如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
SOH | 0x01 | 0xFE | data[128] | CRCH | CRCL |
- 协议头:SOH=0x01,表示这个数据帧包含128个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了128字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;
如果最后一帧剩余的数据小于128字节,则剩余空间全部用0x1A(Ctrl-Z)填充;
XModem-1K
在XModem-1K的数据帧中使用1024字节空间用来传输文件数据,帧格式如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
STX | 0x01 | 0xFE | data[1024] | CRCH | CRCL |
- 协议头:STX=0x02,表示这个数据帧包含1024个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了1024个字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;
如果最后一帧剩余的数据小于1024字节,则剩余空间全部用0x1A(Ctrl-Z)填充;
中间遇到了一个问题,就是OTA升级的时候一直失败,最后发现因为OTA的时候用的是正点原子DAP仿真器的串口,而那个串口是虚拟串口,每传输64字节就会自动分包,Xmodem协议133字节为一帧,下位机就一直判断接受的数据没有133字节,不予处理,就一直升级失败。后面用来usb转串口的模块之后就能正常升级了。
关于芯片软件复位无效的问题:
STM32 软重启失败解决方法___set_faultmask-优快云博客
参考链接:【野火多功能调试助手】,野火串口助手协议发送文件通讯协议 - 电脑上位机 - 野火电子论坛 - Powered by Discuz! (firebbs.cn)
STM32 软重启失败解决方法___set_faultmask-优快云博客
【手把手写【STM32/GD32】OTA升级Boot程序,跳转A区两大关键点 SP和PC寄存器】https://www.bilibili.com/video/BV1324y1G7wX?vd_source=d1e91e9e17a031e2d6e11ed04c3ab205