目录

一、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升级期间的一些注意事项,以保证升级成功。