跳转到内容

分区方案与管理

分区方案与管理

本节介绍 ESP32 的分区表结构及其对 OTA 升级的影响。学习完成后,您将能够:

  • 理解 ESP32 闪存分区表的结构
  • 区分不同分区方案对 OTA 的影响
  • 评估分区大小与固件大小的关系
  • 解释分区方案的能力限制

在开始本节之前,请确保:

  • 理解 ESP32 闪存(Flash)的基本概念
  • 了解 OTA 双分区机制
  • 了解固件编译产出的 .bin 文件

ESP32 使用 SPI Flash 作为程序存储和文件系统存储,常用容量为 4MB、8MB 或 16MB。

┌──────────────────────────────┐
│ Bootloader │ ← 只读(~48KB)
├──────────────────────────────┤
│ Partition Table │ ← 分区表(~8KB)
├──────────────────────────────┤
│ Factory (可选) │ ← 出厂固件
├──────────────────────────────┤
│ OTA 0 (app0) │ ← 当前运行的固件
├──────────────────────────────┤
│ OTA 1 (app1) │ ← OTA 更新的目标分区
├──────────────────────────────┤
│ SPIFFS / LittleFS │ ← 文件系统(配置、证书等)
├──────────────────────────────┤
│ NVS │ ← 非易失性存储
└──────────────────────────────┘

ESP32 的 partitions.csv 文件定义了闪存布局:

# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x1C0000,
app1, app, ota_1, 0x1D0000,0x1C0000,
spiffs, data, spiffs, 0x390000,0x70000,
方案Flash 大小OTA 分区应用大小限制文件系统适用场景
default_4MB4MB2 × 1.75MB1.75MB~448KB基础 OTA 方案
min_spiffs4MB2 × 2MB2MB~200KB需要大固件空间
default_8MB8MB2 × 3MB3MB~2MB大固件 + 大文件系统
factory4MB无 OTA3MB~1MB无 OTA 需求
huge_app16MB2 × 6MB6MB~4MB复杂应用 + 富媒体
分区表 (default_4MB.csv):
────────────────────────────────────────────────
Bootloader : 0x0000 - 0x8FFF (~36KB)
Partition : 0x9000 - 0x9FFF (~4KB)
NVS : 0xA000 - 0xEFFF (~20KB)
OTAData : 0xF000 - 0x10FFF (~8KB)
App0 (OTA_0): 0x11000 - 0x1CFFFF (~1.8MB) ← 当前应用
App1 (OTA_1): 0x1D0000 - 0x38FFFF (~1.8MB) ← OTA 备用
SPIFFS : 0x390000 - 0x3EFFFF (~384KB)
────────────────────────────────────────────────
总计: 4MB (0x000000 - 0x3FFFFF)

注意: 如果编译后的固件超过 ~1.7MB,需要使用 min_spiffs 或更大 Flash 的分区方案。

带 Factory 分区

nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
factory, app, factory, 0x10000, 0x1C0000,
app0, app, ota_0, 0x1D0000,0x1C0000,
app1, app, ota_1, 0x390000,0x1C0000,
spiffs, data, spiffs, 0x550000,0x2B0000,
特性有 Factory无 Factory
出厂固件保护✅ 始终可恢复❌ 可能被覆盖
OTA 空间2 × 1.75MB2 × 1.75MB
总可用固件空间3 × 1.75MB2 × 1.75MB
恢复流程OTA 失败 → 回滚 FactoryOTA 失败 → 回滚另一个 OTA
适用场景产品出货,需恢复出厂开发调试,空间优化

otadata 分区存储 OTA 状态信息,用于决定启动哪个应用分区:

字段说明
当前启动分区当前正在运行的应用分区序号
待确认分区新 OTA 下载完成但未确认的分区
OTA 序列号递增更新计数
CRC 校验otadata 完整性校验
Flash 大小分区方案最大固件大小文件系统
4MBdefault_4MB~1.8MB~384KB
4MBmin_spiffs~2.0MB~200KB
8MBdefault_8MB~3.0MB~2.0MB
16MBcustom~6.0MB~4.0MB
固件大小组成:
├── Arduino 框架库 ~400-600KB
├── WiFi + MQTT 库 ~100-200KB
├── LVGL / TFT 库 ~200-400KB
├── 业务逻辑代码 ~100-300KB
├── 字体文件(中文) ~100-500KB
├── 图片资源 ~50-500KB
└── 其他依赖库 ~100-300KB
────────────────────────────────
典型总大小 ~1.0-2.0MB

优化建议

  • 仅包含必要的库
  • 使用字体子集化(仅包含需要的字符)
  • 图片资源存入文件系统而非固件
  • 使用编译优化 -Os 减小体积

ESP32 支持 Flash 加密功能:

特性说明
加密范围用户可配置分区
密钥存储eFuse(一次性写入)
性能影响解密约 5-10% 性能损失
影响 OTAOTA 固件需加密后分发
买家需求推荐方案理由
”基本 OTA 功能”4MB + default_4MB最常用方案,兼容性好
”固件较大(LVGL/触摸屏)“8MB + default_8MB提供 ~3MB 应用空间
”需要中文和图片资源”16MB + custom大文件系统存储资源
”无需 OTA,仅一个固件”4MB + factory最大化应用空间
”高安全需求”4/8MB + Flash 加密保护固件不被读取

Q1: 固件空间不够怎么办? A: 有以下解决方案:1) 升级到 8MB/16MB Flash;2) 使用 min_spiffs 分区方案腾出更多空间;3) 将资源文件存储在文件系统或 SD 卡中;4) 移除不必要的库。

Q2: 不同分区方案会影响功能吗? A: 会影响可用的应用空间和文件系统空间。选型时需要权衡固件大小和资源文件大小的需求。default_4MB 适合大多数基础 IoT 应用。

Q3: 升级到更大 Flash 需要改什么? A: 主要修改 partitions.csvplatformio.ini 中的 board_build.flash_mode 配置。代码通常无需修改。硬件上需要更换对应容量的 Flash 芯片或开发板。

本节介绍了 ESP32 的分区方案:

  1. 分区表结构:Bootloader、分区表、应用分区、文件系统、NVS
  2. 双 OTA 分区:确保升级失败可回滚
  3. 分区方案选型:根据 Flash 大小和固件需求选择
  4. 大小限制:default_4MB 支持 ~1.8MB 固件
  5. Flash 加密:可选功能,增加安全性