ESP32 各型号远程 OTA 分区表建议与实战说明
ESP32 各型号远程 OTA 分区表建议与实战说明1. OTA 分区表核心概念ESP32 系列做远程 OTA核心不是看“ESP32、ESP32-S3、ESP32-C3”这些名字而是看Flash 容量、固件大小、是否需要文件系统、是否需要回滚保护。ESP-IDF 的分区表默认烧录在 Flash 的0x8000地址占用一个完整 4KB 扇区普通 App 默认从0x10000开始。分区表每一项包含Name、Type、SubType、Offset、Size、Flags等字段。([Espressif Systems][1])OTA 项目通常至少需要otadata, data, ota ota_0, app, ota_0 ota_1, app, ota_1其中otadata用来记录当前应该启动哪个 OTA 分区ota_0和ota_1是两个 App 槽位设备运行其中一个分区时可以把新固件写入另一个分区。ESP-IDF/Arduino-ESP32 文档都说明基础 OTA 一般需要两个 OTA App 分区和一个 OTA data 分区。([Espressif Systems][1])2. 各型号 OTA 分区表推荐说明同一套分区表格式适用于 ESP32、ESP32-S2、ESP32-S3、ESP32-C3、ESP32-C6、ESP32-H2 等 ESP-IDF 支持的芯片。真正影响分区表的是 Flash 大小。芯片型号常见 Flash推荐 OTA 分区方案建议ESP32 / ESP32-WROOM / ESP32-WROVER4MB / 8MB / 16MB4MB 基础 OTA 或 8MB 平衡 OTA普通 WiFi 设备 4MB 可用带 HTTPS、Web 配置页、日志建议 8MBESP32-S24MB / 8MB / 16MB4MB 或 8MB OTA只有 WiFi无蓝牙USB 相关项目建议 8MB 起ESP32-S38MB / 16MB 常见8MB 或 16MB OTA摄像头、语音、LVGL、AI、Web 资源建议 16MBESP32-C22MB / 4MB2MB 勉强 OTA推荐 4MB2MB 只能做极简 OTA不建议放复杂 HTTPS 固件ESP32-C34MB / 8MB4MB 基础 OTA小型 IoT、传感器、开关类设备很适合ESP32-C58MB 常见8MB OTA新项目建议 ESP-IDF多协议功能建议预留更大 App 分区ESP32-C64MB / 8MB / 16MB8MB 或 16MB OTAWiFi 6、BLE、Thread、Zigbee 项目建议 8MB 起乐鑫模块页列出 C6 WROOM 有 4/8/16MB 规格。([Espressif Systems][2])ESP32-H24MB / 8MB4MB 或 8MB OTAH2 主要是 BLE/Thread/Zigbee不自带 WiFi远程 OTA 通常依赖网关ESP32-P416MB / 32MB 常见外部 Flash16MB 或 32MB OTAP4 偏 HMI、视觉、边缘计算建议大 Flash3. 分区表选择原则3.1 远程 OTA 最少要两个 App 分区OTA 的基本逻辑是当前运行 ota_0 下载新固件到 ota_1 校验成功 修改 otadata 重启进入 ota_1 下一次更新再写回 ota_0所以远程 OTA 不建议只有一个 App 分区。一个 App 分区只能串口升级或者做非常复杂的临时下载方案不适合普通远程 OTA。3.2 建议去掉 factory 分区ESP-IDF 默认 OTA 表经常是factory ota_0 ota_1但是factory分区不会被 OTA 更新。官方文档也说明如果想节省 Flash可以去掉 factory 分区直接使用ota_0作为默认应用分区。([Espressif Systems][1])推荐新项目使用ota_0 ota_1而不是factory ota_0 ota_1原因是 4MB Flash 很紧张去掉 factory 可以让两个 OTA 分区更大。3.3 App 分区必须够大判断方法单个 OTA 分区大小 当前 firmware.bin 大小 未来增长空间例如当前固件 1.1MB 建议单个 OTA 分区至少 1.5MB 更推荐 2MB 以上如果你的固件包含HTTPS OTA 蓝牙 WiFi 配网 WebServer LVGL 摄像头 音频 证书 字体 图片资源就不要用太小的 1MB App 分区。4. 推荐分区表一2MB Flash 极限 OTA适合ESP32-C2 2MB 极简传感器 无复杂 Web 无大资源 固件小于 900KB不推荐HTTPS 很复杂 BLE WiFi 大量库 WebServer 文件系统 LVGL 摄像头文件名建议partitions_ota_2mb.csv# ESP-IDF Partition Table # 适用场景2MB Flash 极限 OTA # 注意2MB 做 OTA 非常紧张只适合极简固件 # Name, Type, SubType, Offset, Size, Flags # NVS保存 WiFi、参数、设备配置 nvs, data, nvs, 0x9000, 0x3000, # OTA 选择信息固定 8KB otadata, data, ota, 0xC000, 0x2000, # PHY 校准数据一般保留 4KB phy_init, data, phy, 0xE000, 0x1000, # 第一个 OTA App 分区960KB ota_0, app, ota_0, 0x10000, 0xF0000, # 第二个 OTA App 分区960KB ota_1, app, ota_1, 0x100000, 0xF0000, # 崩溃转储可选如果固件太大可以删除 coredump, data, coredump,0x1F0000, 0x10000,5. 推荐分区表二4MB Flash 基础 OTA适合ESP32-WROOM-32 4MB ESP32-C3 4MB ESP32-S2 4MB ESP32-C6 4MB 普通 WiFi 远程升级项目特点两个 App 分区接近 1.8MB 适合普通 OTA 不放 SPIFFS / LittleFS文件名建议partitions_ota_4mb_basic.csv# ESP-IDF Partition Table # 适用场景4MB Flash最大化 App 空间 # Name, Type, SubType, Offset, Size, Flags # NVS保存 WiFi、设备配置、Token 等 nvs, data, nvs, 0x9000, 0x5000, # OTA 选择信息必须有固定 8KB otadata, data, ota, 0xE000, 0x2000, # 第一个 OTA App 分区约 1.8125MB ota_0, app, ota_0, 0x10000, 0x1D0000, # 第二个 OTA App 分区约 1.8125MB ota_1, app, ota_1, 0x1E0000, 0x1D0000, # 崩溃转储用于保存 panic 信息调试阶段建议保留 coredump, data, coredump,0x3B0000, 0x10000, # 预留参数区可以保存设备 SN、出厂参数、校准数据 factory_param,data,nvs, 0x3C0000, 0x40000,如果你的固件超过 1.8MB这个方案就不够了建议换 8MB Flash。6. 推荐分区表三4MB Flash 带文件系统 OTA适合需要少量网页资源 需要存日志 需要 LittleFS / SPIFFS 固件控制在 1.5MB 以内文件名建议partitions_ota_4mb_storage.csv# ESP-IDF Partition Table # 适用场景4MB Flash同时需要 OTA 和文件系统 # 缺点App 分区比 basic 方案小 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xE000, 0x2000, # 每个 App 分区 1.5MB ota_0, app, ota_0, 0x10000, 0x180000, ota_1, app, ota_1, 0x190000, 0x180000, # 文件系统区约 896KB spiffs, data, spiffs, 0x310000, 0xE0000, # 崩溃转储64KB coredump, data, coredump,0x3F0000, 0x10000,如果是 ESP-IDF 新项目也可以把spiffs改成fat具体看你用 SPIFFS、LittleFS 还是 FATFS。7. 推荐分区表四8MB Flash 平衡 OTA适合ESP32-S3 8MB ESP32-C6 8MB ESP32-C5 8MB ESP32-WROVER 8MB 需要 HTTPS OTA 需要 Web 配置页 需要日志、图片、证书、资源文件Arduino-ESP32 官方示例中也给出了 8MB OTA Storage 的常见布局例如两个约 2MB App 分区加文件系统。([Espressif Systems][3])这里给一个更偏向 ESP-IDF 项目的 8MB 平衡方案文件名建议partitions_ota_8mb.csv# ESP-IDF Partition Table # 适用场景8MB Flash推荐大多数正式 OTA 项目使用 # Name, Type, SubType, Offset, Size, Flags # NVS32KB用于 WiFi、配置、Token nvs, data, nvs, 0x9000, 0x5000, # OTA 选择信息8KB otadata, data, ota, 0xE000, 0x2000, # App03.1875MB ota_0, app, ota_0, 0x10000, 0x330000, # App13.1875MB ota_1, app, ota_1, 0x340000, 0x330000, # 文件系统约 1.5625MB spiffs, data, spiffs, 0x670000, 0x180000, # 崩溃转储64KB coredump, data, coredump,0x7F0000, 0x10000,这个方案比较适合WiFi MQTT HTTPS OTA BLE 配网 WebServer 传感器数据缓存 小型 UI 资源8. 推荐分区表五16MB Flash 大型 OTA适合ESP32-S3-N16R8 ESP32-S3 摄像头项目 LVGL 项目 大字体 图片资源 离线网页 音频提示 复杂 Web 面板文件名建议partitions_ota_16mb.csv# ESP-IDF Partition Table # 适用场景16MB Flash大型 OTA 项目 # Name, Type, SubType, Offset, Size, Flags # NVS64KB nvs, data, nvs, 0x9000, 0x7000, # OTA 选择信息8KB otadata, data, ota, 0x10000, 0x2000, # 为了 App 分区 64KB 对齐这里预留一小段 reserved, data, 0x40, 0x12000, 0xE000, # App06MB ota_0, app, ota_0, 0x20000, 0x600000, # App16MB ota_1, app, ota_1, 0x620000, 0x600000, # 文件系统约 3.75MB spiffs, data, spiffs, 0xC20000, 0x3D0000, # 崩溃转储64KB coredump, data, coredump,0xFF0000, 0x10000,注意如果你不想手动计算偏移也可以把 App 之后的 Offset 留空让工具自动对齐。ESP-IDF 文档说明CSV 中 Offset 留空时gen_esp32part.py会根据前一个分区和对齐要求自动计算App 分区偏移需要 64KB 对齐。([Espressif Systems][1])9. 推荐分区表六16MB 自动偏移写法这种写法更安全不容易算错地址。# ESP-IDF Partition Table # 自动偏移版本推荐给不想手算地址的项目 # 注意第一个分区建议保留 0x9000 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x7000, otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, # App 分区 Offset 留空工具会自动 64KB 对齐 ota_0, app, ota_0, , 6M, ota_1, app, ota_1, , 6M, # 文件系统区 spiffs, data, spiffs, , 0x3C0000, # 崩溃转储 coredump, data, coredump,, 0x10000,10. 为什么不建议 1MB 1MB OTAESP-IDF 默认示例中常见factory, 1M ota_0, 1M ota_1, 1M这个表适合早期简单项目但现在很多项目很容易超过 1MB例如WiFi BLE HTTPS MQTT JSON 证书 NVS WebServer 日志 OTA 回滚如果固件超过分区大小编译时会报类似app partition is too small或者烧录后无法正常启动。所以实际项目建议4MB Flash每个 OTA App 至少 1.5MB 8MB Flash每个 OTA App 建议 2MB ~ 3.2MB 16MB Flash每个 OTA App 建议 4MB ~ 6MB11. ESP-IDF 具体怎么配置 OTA 分区表11.1 创建 CSV 文件在项目根目录创建partitions_ota.csv例如your_project/ ├── CMakeLists.txt ├── main/ │ └── main.c ├── partitions_ota.csv └── sdkconfig11.2 menuconfig 配置执行idf.py menuconfig进入Partition Table选择Custom partition table CSV然后填写partitions_ota.csv再进入Serial flasher config确认 Flash 大小4MB / 8MB / 16MBFlash 大小必须和你的开发板真实 Flash 一致否则会出现分区超出 Flash 的问题。11.3 查看分区表执行idf.py partition-table它会输出最终生成的分区布局。ESP-IDF 构建系统会检查 App 是否能放入可用 App 分区如果固件太大会在构建阶段报错或警告。([Espressif Systems][1])11.4 第一次烧录如果你改过分区表建议先擦除整片 Flashidf.py-pCOM3 erase-flash然后烧录idf.py-pCOM3 flash monitorLinux / macOS 示例idf.py-p/dev/ttyUSB0 erase-flash idf.py-p/dev/ttyUSB0 flash monitor12. ESP-IDF 远程 HTTPS OTA 代码框架12.1 CMakeLists.txt 加依赖idf_component_register( SRCS main.c INCLUDE_DIRS . REQUIRES esp_https_ota esp_http_client app_update )12.2 简化 OTA 代码#includeesp_https_ota.h#includeesp_log.h#includeesp_system.h#defineOTA_URLhttps://your-server.com/firmware.binstaticconstchar*TAGOTA;externconstcharserver_cert_pem_start[]asm(_binary_server_cert_pem_start);voidstart_https_ota(void){esp_http_client_config_thttp_config{.urlOTA_URL,.cert_pemserver_cert_pem_start,};esp_https_ota_config_tota_config{.http_confighttp_config,};ESP_LOGI(TAG,Starting OTA from: %s,OTA_URL);esp_err_tretesp_https_ota(ota_config);if(retESP_OK){ESP_LOGI(TAG,OTA success, restarting...);esp_restart();}else{ESP_LOGE(TAG,OTA failed: %s,esp_err_to_name(ret));}}esp_https_ota()会建立 HTTPS 连接、读取固件、写入 OTA 分区并完成 OTA 流程成功后需要调用esp_restart()重启进入新固件。([Espressif Systems][4])13. OTA 回滚建议正式产品建议开启CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE开启后新固件第一次启动时需要主动确认自己可用#includeesp_ota_ops.hvoidapp_confirm_if_pending(void){constesp_partition_t*runningesp_ota_get_running_partition();esp_ota_img_states_tota_state;if(esp_ota_get_state_partition(running,ota_state)ESP_OK){if(ota_stateESP_OTA_IMG_PENDING_VERIFY){// 这里可以检查 WiFi、传感器、配置、任务是否正常bool oktrue;if(ok){esp_ota_mark_app_valid_cancel_rollback();}else{esp_ota_mark_app_invalid_rollback_and_reboot();}}}}ESP-IDF 的回滚机制会在新 App 第一次启动后等待确认如果没有确认且发生重启Bootloader 会把它标记为失败并回滚到上一个可用 OTA 分区。([Espressif Systems][5])建议在app_main()前期调用voidapp_main(void){app_confirm_if_pending();// 后续初始化 WiFi、MQTT、业务逻辑}14. Arduino / PlatformIO 怎么用自定义 OTA 分区表14.1 Arduino IDE在.ino同级目录放partitions.csvArduino-ESP32 文档说明可以在草图同目录创建partitions.csv构建系统会使用这个自定义分区表。([Espressif Systems][3])示例目录MyOtaProject/ ├── MyOtaProject.ino └── partitions.csv4MB OTA 示例# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xE000, 0x2000, app0, app, ota_0, 0x10000, 0x1D0000, app1, app, ota_1, 0x1E0000,0x1D0000, spiffs, data, spiffs, 0x3B0000,0x50000,14.2 PlatformIO在项目根目录放partitions_ota.csv然后修改[env:esp32dev] platform espressif32 board esp32dev framework arduino board_build.partitions partitions_ota.csv board_upload.flash_size 4MBESP32-S3 示例[env:esp32-s3-devkitc-1] platform espressif32 board esp32-s3-devkitc-1 framework arduino board_build.partitions partitions_ota_8mb.csv board_upload.flash_size 8MB15. 分区表注释写法建议CSV 文件中推荐这样写注释# 这是注释 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000,不建议这样写nvs, data, nvs, 0x9000, 0x5000, # 保存 WiFi原因是不同构建环境对行尾中文注释兼容性不一定一致。最稳妥的方式是# NVS保存 WiFi、Token、设备参数 nvs, data, nvs, 0x9000, 0x5000,16. 常见错误和解决办法16.1 固件太大错误现象app partition is too small解决1. 换 8MB 或 16MB Flash 2. 增大 ota_0 / ota_1 3. 删除 factory 分区 4. 减少 SPIFFS / LittleFS 空间 5. 关闭不必要组件16.2 OTA 成功但重启后还是旧版本可能原因1. 没有 otadata 分区 2. OTA 写入后没有设置 boot partition 3. 没有 esp_restart() 4. 分区表不是 OTA 分区表 5. 实际运行的是 factory 分区如果用esp_https_ota()成功后它会处理切换逻辑但仍然需要你调用esp_restart();16.3 改了分区表后运行异常解决idf.py erase-flash idf.py flash monitor原因是旧分区数据还残留在 Flash 里。ESP-IDF 文档也提醒更新分区表不会自动擦除旧数据必要时要整片擦除。([Espressif Systems][1])16.4 4MB Flash 放不下 HTTPS OTAHTTPS OTA 需要 TLS、证书、HTTP Client、OTA 组件固件会明显变大。建议ESP32-C3 / ESP32 普通项目4MB 勉强够 ESP32-S3 / C6 / 复杂项目建议 8MB 起 带 UI / 摄像头 / Web 资源建议 16MB16.5 开启 Flash Encryption 后 OTA 失败注意事项1. app 分区会被自动加密 2. otadata 也会被加密 3. OTA 写入必须走 ESP-IDF OTA API 4. 不要自己乱写 Flash 偏移ESP-IDF 文档说明开启 Flash Encryption 后Bootloader、分区表、otadata、所有 app 分区等会默认加密。([Espressif Systems][6])17. 我的实际推荐17.1 新手 / 普通项目ESP32 / ESP32-C3 / ESP32-S2 Flash4MB 分区表4MB basic OTA推荐partitions_ota_4mb_basic.csv17.2 正式联网产品ESP32 / ESP32-S3 / ESP32-C3 / ESP32-C6 Flash8MB 分区表8MB balanced OTA推荐partitions_ota_8mb.csv17.3 摄像头 / 屏幕 / LVGL / 复杂项目ESP32-S3 Flash16MB PSRAM8MB 分区表16MB large OTA推荐partitions_ota_16mb.csv17.4 ESP32-H2 / Zigbee / Thread 设备ESP32-H2 Flash4MB 或 8MB OTA 方式通常通过网关或 BLE / Thread 传输 分区表4MB basic OTA 或 8MB OTA注意ESP32-H2 不适合直接做 WiFi HTTPS OTA因为它本身不是 WiFi 芯片。18. 最终建议总结如果你不知道怎么选直接按下面来2MB Flash不建议 OTA除非极简固件 4MB Flash可以 OTA但不要放太多资源 8MB Flash最推荐正式项目够用 16MB FlashESP32-S3 / UI / 摄像头 / 大资源项目首选最推荐的通用方案ESP32-C3 / ESP324MB basic OTA ESP32-S3 / ESP32-C68MB OTA 起步 ESP32-S3 屏幕 / 摄像头16MB OTA不要盲目使用默认factory ota_0 ota_1更推荐ota_0 ota_1这样 OTA 分区更大后期不容易因为固件变大而爆分区。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580202.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!