目录
一、ESP32 OTA升级原理
1. ESP32固件编译
2. 固件的远程传输
二、基于ESP32HTTPUpdate库的OTA升级
1. 硬件准备
2. 软件实现
三、注意事项
1. 升级文件大小限制
2. WiFi稳定性
3. 固件版本号
结语
OTA(Over-The-Air)升级,是指通过无线网络对设备进行在线的升级。通俗的说,就是通过网络对设备进行在线升级,而不需要连接设备的 USB 接口或者其他的 JTAG/SWD 等工具。ESP32作为一款功能强大的单片机,具有WiFi和蓝牙通信功能,因此可以实现OTA升级。本文将介绍ESP32如何实现OTA升级,包括代码示例,代码讲解以及注意事项等等。
一、ESP32 OTA升级原理
ESP32 OTA升级主要分为两步:编写固件与固件的远程传输。ESP32固件编译生成APP BIN文件,通过网络传输升级至ESP32控制的设备。以下分别对两个步骤进行详细的讲解。
1. ESP32固件编译
ESP32固件编译主要是生成一个APP BIN文件,用于进行OTA升级。在进行OTA升级之前,必须编译出可供 OTA 升级用的APP BIN 文件。这个 APP BIN 文件一定要经过gen_esp32part.py 转换成 .bin 的格式,否则会导致 STM32Flash 工具无法烧录进去。
ESP32项目中需要在 menuconfig 里面配置OTA选项,具体配置如下:
① 进入 Component Config -> ESP32-specific,将Serial flasher config选项打开。
② 进入 Component Config -> OTA update,根据需要进行相应的配置。
在进行OTA升级之前,需要在ESP32的bootloader中配置OTA服务器地址信息。在bootloader中,有两种方式可以配置OTA服务器地址:在项目中使用idf.py set-target 和 idf.py set-extras 命令设置OTA服务器地址,或者将OTA服务器地址写入到ESP32的EEPROM中。并且,在OTA升级期间,ESP32需要连接到WiFi网络,以保证能够成功连接到OTA服务器。
2. 固件的远程传输
固件远程传输主要是将编译好的APP BIN文件通过网络传输到ESP32控制的设备中。在ESP32中,可以使用Arduino框架或者ESP-IDF进行OTA升级。本文主要介绍Arduino框架下的OTA升级。
在Arduino IDE中,可以通过ESP32HTTPUpdate库或ESP32OTA库实现OTA升级。其中,ESP32HTTPUpdate库可以从指定的URL下载固件并进行升级;ESP32OTA库可以通过WiFi和MDNS查找到可 OTA 升级的设备,并进行OTA升级。
二、基于ESP32HTTPUpdate库的OTA升级
1. 硬件准备
在进行OTA升级之前,需要将ESP32与LED灯连接起来,下面是具体的连接方式:
① 将LED正极连接到GPIO13
② 将LED负极通过220欧姆的电阻连接到地线
2. 软件实现
在实现OTA升级功能之前,需要在Arduino IDE中安装ESP32HTTPUpdate库。然后,可以运行以下代码,实现OTA升级功能:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32httpUpdate.h>
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* serverUrl = "http://你的OTA服务器URL/OTA.bin";
void setup()
{
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to WiFi");
Serial.println("Checking for updates...");
t_httpUpdate_return ret = ESPhttpUpdate.update(serverUrl);
switch(ret)
{
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILED Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
break;
}
}
void loop()
{
}
在上述代码中,首先需要通过WiFi连接到指定的SSID和密码。然后,调用ESPhttpUpdate类的update函数,将OTA服务器的URL传递给它。
update函数将会下载固件文件,并将其写入到OTA分区中。如果一切顺利,update函数会返回HTTP_UPDATE_OK。如果发生了错误,ESP32会尝试异步升级,直到升级成功或是到达最大错误重试次数。
最后,需要在串口监视器中查看OTA升级的结果。如果升级成功,将看到HTTP_UPDATE_OK消息。
三、注意事项
在使用ESP32进行OTA升级时,需要注意以下几点:
1. 升级文件大小限制
在进行OTA升级之前,需要先执行 menuconfig 并优化分区表。具体的操作如下:
进入目录:IDF_PATH/components/partition_table
执行命令:python partition_table_generator.py -q
这条命令会根据 components/partition_table/template.csv 生成 components/partition_table/partitions_two_ota.csv 文件。之后打开 menuconfig,设置 “Partition Table”(分区表),选择 “Custom partition table CSV”。如下所示:
我的自定义分区表csv文件的内容如下:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
otadata, data, ota, 0xf000, 0x2000,
app0, app, ota_0, 0x10000, 1000K,
app1, app, ota_1, ,1000K,
2. WiFi稳定性
在进行OTA升级之前,需要确保ESP32已经连接到了WiFi,并且具有足够的网络稳定性,以保证成功进行OTA升级。如果网络不稳定或者连接的WiFi质量不好,可能会导致OTA升级失败。
3. 固件版本号
在进行OTA升级之前,需要将新版本的固件与旧版本进行比较,确保新版本的固件版本号比旧版本的固件版本号 更高。
结语
本文主要介绍了ESP32如何实现OTA升级,包括代码示例、代码讲解以及注意事项等等。读者可以通过学习本文,了解ESP32 OTA升级的原理和实现方式,并可以应用到实际项目中。同时,也需要注意OTA升级期间的一些注意事项,以保证升级成功。