STM32 通过 WIFI 实现远程 OTA 升级:探索与实践

📅 发布时间:2026/7/9 2:54:35 👁️ 浏览次数:
STM32 通过 WIFI 实现远程 OTA 升级:探索与实践
stm32 远程升级 OTA升级 使用WIFI连接升级 芯片 stm32f103系列 升级方式:wifi模块?自建服务器 升级文件为BIN文件需要使用配套的exe文件将原来的bin文件内的数据每隔128个字节进行crc16检验并添加到后面。 单片机下载后每下载130个字节便检验一下数据让升级变得稳定可靠。 升级过程: 用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info文件 然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息 如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启, 重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址, 然后使用http下载程序文件,把程序文件写入flash,完成升级. 资料包含bootloader源码一份bin文件crc检验处理的exe文件一份操作说明一份在嵌入式开发领域STM32 系列芯片凭借其强大的性能和丰富的资源被广泛应用。今天咱就来讲讲基于 STM32F103 系列芯片如何借助 WIFI 连接实现远程 OTAOver - the - Air升级。整体升级流程概述整个升级过程涉及到用户程序、BootLoader 以及自建服务器之间的协同工作。用户程序负责定时与云端交互获取升级信息BootLoader 则在检测到升级标志后执行实际的下载和写入操作。升级文件处理升级文件是 BIN 文件不过在此之前需要用配套的 exe 文件对原始 bin 文件进行特殊处理。具体来说就是每隔 128 个字节进行 CRC16 校验并将校验结果添加到后面。这一步骤大大增强了数据的可靠性防止在传输和存储过程中数据发生错误。虽然这里没有给出这个 exe 文件的具体代码实现但它背后的原理大致如下以下为伪代码示意实际实现需根据具体语言和库# 假设使用 Python 实现 CRC16 校验 import binascii def crc16(data): crc 0xFFFF for byte in data: crc ^ byte for _ in range(8): if crc 0x0001: crc 1 crc ^ 0xA001 else: crc 1 return crc # 读取 bin 文件数据 with open(original.bin, rb) as f: bin_data f.read() new_data bytearray() for i in range(0, len(bin_data), 128): chunk bin_data[i:i 128] new_data.extend(chunk) crc_result crc16(chunk) new_data.extend(crc_result.to_bytes(2, byteorderbig)) # 写入新的 bin 文件 with open(processed.bin, wb) as f: f.write(new_data)在上述代码中crc16函数实现了 CRC16 校验算法。我们以 128 字节为一块读取原始 bin 文件数据对每一块进行 CRC16 校验并将校验结果追加到数据块之后最终生成新的 bin 文件。单片机端升级实现用户程序部分用户程序主要负责与网络模块交互通过 HTTP 的 GET 指令获取云端 info 文件进而获取服务器中的固件程序版本和下载地址等关键信息。这里以 C 语言为例假设已经有一个网络库net_lib来实现网络相关功能实际开发中可能是像 lwIP 这样的网络协议栈#include net_lib.h // 假设 info 文件格式为 versionxxxurlxxx void get_update_info() { char info[256]; if (net_lib_get(http://your_server.com/info, info, sizeof(info))) { char version[32], url[256]; sscanf(info, version%[^]url%s, version, url); // 与自身版本号对比 if (strcmp(version, current_version)! 0) { // 写入 flash 并设置更新标志 write_flash(url); set_update_flag(); // 重启 system_reset(); } } } // 定时调用获取升级信息 void user_program() { while (1) { // 假设每隔 60 秒检查一次 delay(60000); get_update_info(); } }在上述代码中getupdateinfo函数通过netlibget从云端获取 info 文件内容并解析出版本号和下载地址。通过与当前版本号对比若不一致则将下载地址写入 flash 并设置更新标志然后重启设备。userprogram函数则以固定时间间隔调用getupdate_info来周期性检查升级。BootLoader 部分当设备重启进入 BootLoader 后它会检测更新标志。若检测到标志则提取固件下载地址通过 HTTP 下载程序文件并写入 flash完成升级。以下是 BootLoader 关键部分代码示意#include net_lib.h void bootloader() { if (check_update_flag()) { char url[256]; get_download_url(url); char bin_data[130]; int total_size 0; FILE *flash_file fopen(flash.bin, wb); net_lib_get_file(url, [](char *data, int size) { // 每 130 字节检验一次数据 for (int i 0; i size; i 130) { int read_size (size - i 130)? size - i : 130; memcpy(bin_data, data i, read_size); // 这里需要实现 CRC16 校验检查 if (check_crc16(bin_data, read_size)) { fwrite(bin_data, 1, read_size, flash_file); total_size read_size; } else { // 校验失败处理 fclose(flash_file); remove(flash.bin); return; } } }); fclose(flash_file); // 将下载的文件写入真正的 flash write_to_real_flash(flash.bin); clear_update_flag(); } // 跳转到用户程序 jump_to_user_program(); }在这段代码中bootloader函数首先检查更新标志若存在则获取下载地址。通过netlibgetfile以回调方式下载文件数据每次读取 130 字节进行 CRC16 校验这里checkcrc16函数需自行实现校验通过则写入临时文件全部下载完成后将临时文件写入真正的 flash 并清除更新标志最后跳转到用户程序。资料说明本次升级方案提供了 bootloader 源码一份方便大家根据实际需求进行定制修改。还有 bin 文件 CRC 检验处理的 exe 文件一份无需我们从头实现 CRC16 校验及数据追加操作。另外还有操作说明一份能帮助快速上手整个升级流程的搭建和配置。stm32 远程升级 OTA升级 使用WIFI连接升级 芯片 stm32f103系列 升级方式:wifi模块?自建服务器 升级文件为BIN文件需要使用配套的exe文件将原来的bin文件内的数据每隔128个字节进行crc16检验并添加到后面。 单片机下载后每下载130个字节便检验一下数据让升级变得稳定可靠。 升级过程: 用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info文件 然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息 如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启, 重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址, 然后使用http下载程序文件,把程序文件写入flash,完成升级. 资料包含bootloader源码一份bin文件crc检验处理的exe文件一份操作说明一份通过上述步骤和代码示例我们可以基于 STM32F103 系列芯片利用 WIFI 连接和自建服务器实现稳定可靠的远程 OTA 升级为产品的后续功能更新和优化提供了极大的便利。希望这篇博文能对正在研究 STM32 OTA 升级的朋友们有所帮助。