OTA远程升级实现记录
STM32程序更新实现
MCU程序更新逻辑是:
- STM32的flash地址从0x0x0800 0000开始,将flash中分出三个分区,分别作为
BootLoader、APP1、APP2,每个区都可能存储着各自的代码程序 - MCU上电、复位后从 0x0800 0000 进入BootLoader程序,检测某个自定义的标志位(存储在掉电不丢失设备中),判断是否有程序需要更新
- 如果需要更新,则擦除APP1中的程序,将APP2分区中的程序写入到APP1后,擦除APP2、清除升级标志位并复位MCU
- 如果不需要更新,则跳转到APP1,执行APP1中的程序
烧录可以设置烧录的目标Flash位置,如果我分区设置是:
- BootLoader(0x0800 0000 ~ 0x0x0800 3FFF)
- APP1(0x0800 4000 ~ 0x0x0800 FFFF)
则若要代码直接烧录到APP1分区,则需要做如图设置:

这样直接烧录的话,需要BootLoader程序才能跳转到此,并且想要正常执行该程序的话,还需要在该分区程序中的main函数开头进行中断向量表位置的修改:
SCB->VTOR = FLASH_BASE | 0x00004000UL; //! 更改中断向量表地址
不同分区有了不同程序后,就需要实现从一个分区的程序跳转到另一个分区程序,其关键点在于堆栈寄存器(MSP)和程序计数寄存器(PC),基本逻辑是:
- 复位BootLoader程序中使用到的外设
- 修改堆栈寄存器,使其指向目标分区的堆栈起始位置
- 修改程序计数寄存器PC,使其指向目标分区的复位向量
// 修改MSP寄存器
__asm void MSR_MSP(uint32_t addr){MSR MSP, r0 // 将传入的地址存储到堆栈寄存器BX r14
}typedef void (*pc_adjust)(void);// 跳转APP1区
void bootloader_executeapp(void){pc_adjust pc;// 检查栈顶地址正确性if(( (*(uint32_t *) APP1_ADDR) & 0x2FFE0000 ) == 0x20000000){MSR_MSP(*(uint32_t *) APP1_ADDR);pc = (pc_adjust)(*(uint32_t*)(APP1_ADDR+4));pc(); // 调用函数,会使得PC寄存器存储该函数入口地址}
}
在APP1分区烧录程序后,该分区首地址的第一个条目(4个字节)存储的是该程序的堆栈指针,第二个条目存储的是复位向量,因而以上代码使用到*(uint32_t *) APP1_ADDR和*(uint32_t*)(APP1_ADDR+4)
能够在BootLoader程序中进行跳转,也能在不同分区存储程序后,通过手动在APP2中烧录新的程序并设置更新标志位,即可基本实现一个程序更新的例子。此后的IAP/OTA无非就是关于”如何将新的程序写到APP2“的问题。
STM32串口IAP实现
IAP指 In-Application Programming ,而串口IAP是借助上位机工具和modem协议,将.bin文件通过串口传输给MCU,MCU再进行程序更新。具体效果有个OTA升级的博客里的动图很直观:notes: 我的笔记, 简单的进行了归纳 - Gitee.com
我自己使用的是Ymodem协议,具体参考了以下博客,里面也介绍了Ymodem:Xmodem 协议介绍及应用(基于 ESP-IDF) - 知乎。
在该博客中关于Ymodem的地方有个需要注意的地方:

STM32+ESP-01S通过OneNET的远程OTA升级实现
OTA远程升级的实现需要借助云平台和相关网络通信模块,此处使用OneNET作为平台、ESP-01S作为模块(存粹因为手头有+4G模块太贵)。由于使用OneNET进行OTA升级需要使用HTTP协议,所以和MQTT没啥关系,对ESP8266相关模块而言,使用基本AT指令和TCP/IP相关AT指令即可实现通信。AT 命令集 — ESP-AT 用户指南 文档
- AT+RST 复位
- AT+CWMODE 设置为客户端模式
- AT+CWDHCP 启用 SoftAP 的 DHCP
- AT+CWJAP 连接2.4G网络(一般使用手机热点)
- AT+CIPSTART 可进行HTTP协议的连接
- AT+CIPSEND 可进行HTTP协议的发送
使用OneNET就首先需要在OneNET创建产品和升级包,具体方式参考了9-新版OneNet平台 使用网络调试助手软件 构建测试OTA升级整个流程报文数据_哔哩哔哩_bilibili。接着需要MCU通过ESP01S连接云平台、向发送、获取内容。具体需要发送的消息内容、格式是什么可直接参考OneNET平台官方文档(OneNET文档中心),下面介绍一些基本的需要发送的内容包括:
- 上传当前版本号
- 查询云平台的OTA任务
- 分片下载程序包
需要注意的是官方文档中的存在错误:

官方文档直接给出HTTP格式的内容,而在程序中传送的有关HTTP内容的字符串和其中还有一些不一样(没有学过HTTP,因而只是照猫画虎……)

参考内容:
-
notes: 我的笔记, 简单的进行了归纳 - Gitee.com
-
OneNET文档中心
-
AT 命令集 — ESP-AT 用户指南 文档
-
Xmodem 协议介绍及应用(基于 ESP-IDF) - 知乎
-
9-新版OneNet平台 使用网络调试助手软件 构建测试OTA升级整个流程报文数据_哔哩哔哩_bilibili
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956674.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!