分区方案与管理
分区方案与管理
本节介绍 ESP32 的分区表结构及其对 OTA 升级的影响。学习完成后,您将能够:
- 理解 ESP32 闪存分区表的结构
- 区分不同分区方案对 OTA 的影响
- 评估分区大小与固件大小的关系
- 解释分区方案的能力限制
在开始本节之前,请确保:
- 理解 ESP32 闪存(Flash)的基本概念
- 了解 OTA 双分区机制
- 了解固件编译产出的 .bin 文件
ESP32 Flash Memory
Section titled “ESP32 Flash Memory”ESP32 使用 SPI Flash 作为程序存储和文件系统存储,常用容量为 4MB、8MB 或 16MB。
┌──────────────────────────────┐ │ Bootloader │ ← 只读(~48KB) ├──────────────────────────────┤ │ Partition Table │ ← 分区表(~8KB) ├──────────────────────────────┤ │ Factory (可选) │ ← 出厂固件 ├──────────────────────────────┤ │ OTA 0 (app0) │ ← 当前运行的固件 ├──────────────────────────────┤ │ OTA 1 (app1) │ ← OTA 更新的目标分区 ├──────────────────────────────┤ │ SPIFFS / LittleFS │ ← 文件系统(配置、证书等) ├──────────────────────────────┤ │ NVS │ ← 非易失性存储 └──────────────────────────────┘Partition Table (CSV)
Section titled “Partition Table (CSV)”默认分区方案
Section titled “默认分区方案”ESP32 的 partitions.csv 文件定义了闪存布局:
# Name, Type, SubType, Offset, Size, Flagsnvs, 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,常用分区方案对比
Section titled “常用分区方案对比”| 方案 | Flash 大小 | OTA 分区 | 应用大小限制 | 文件系统 | 适用场景 |
|---|---|---|---|---|---|
| default_4MB | 4MB | 2 × 1.75MB | 1.75MB | ~448KB | 基础 OTA 方案 |
| min_spiffs | 4MB | 2 × 2MB | 2MB | ~200KB | 需要大固件空间 |
| default_8MB | 8MB | 2 × 3MB | 3MB | ~2MB | 大固件 + 大文件系统 |
| factory | 4MB | 无 OTA | 3MB | ~1MB | 无 OTA 需求 |
| huge_app | 16MB | 2 × 6MB | 6MB | ~4MB | 复杂应用 + 富媒体 |
4MB Flash 默认分区详解
Section titled “4MB Flash 默认分区详解”分区表 (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 Partition
Section titled “Factory Partition”带 Factory 分区 vs 无 Factory 分区
Section titled “带 Factory 分区 vs 无 Factory 分区”带 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.75MB | 2 × 1.75MB |
| 总可用固件空间 | 3 × 1.75MB | 2 × 1.75MB |
| 恢复流程 | OTA 失败 → 回滚 Factory | OTA 失败 → 回滚另一个 OTA |
| 适用场景 | 产品出货,需恢复出厂 | 开发调试,空间优化 |
OTA Data Partition
Section titled “OTA Data Partition”otadata 分区
Section titled “otadata 分区”otadata 分区存储 OTA 状态信息,用于决定启动哪个应用分区:
| 字段 | 说明 |
|---|---|
| 当前启动分区 | 当前正在运行的应用分区序号 |
| 待确认分区 | 新 OTA 下载完成但未确认的分区 |
| OTA 序列号 | 递增更新计数 |
| CRC 校验 | otadata 完整性校验 |
Partition Size Considerations
Section titled “Partition Size Considerations”固件大小限制
Section titled “固件大小限制”| Flash 大小 | 分区方案 | 最大固件大小 | 文件系统 |
|---|---|---|---|
| 4MB | default_4MB | ~1.8MB | ~384KB |
| 4MB | min_spiffs | ~2.0MB | ~200KB |
| 8MB | default_8MB | ~3.0MB | ~2.0MB |
| 16MB | custom | ~6.0MB | ~4.0MB |
影响固件大小的因素
Section titled “影响固件大小的因素”固件大小组成:├── Arduino 框架库 ~400-600KB├── WiFi + MQTT 库 ~100-200KB├── LVGL / TFT 库 ~200-400KB├── 业务逻辑代码 ~100-300KB├── 字体文件(中文) ~100-500KB├── 图片资源 ~50-500KB└── 其他依赖库 ~100-300KB────────────────────────────────典型总大小 ~1.0-2.0MB优化建议:
- 仅包含必要的库
- 使用字体子集化(仅包含需要的字符)
- 图片资源存入文件系统而非固件
- 使用编译优化
-Os减小体积
Flash Encryption and Partition
Section titled “Flash Encryption and Partition”ESP32 支持 Flash 加密功能:
| 特性 | 说明 |
|---|---|
| 加密范围 | 用户可配置分区 |
| 密钥存储 | eFuse(一次性写入) |
| 性能影响 | 解密约 5-10% 性能损失 |
| 影响 OTA | OTA 固件需加密后分发 |
Pre-sales Key Points
Section titled “Pre-sales Key Points”分区方案选型建议
Section titled “分区方案选型建议”| 买家需求 | 推荐方案 | 理由 |
|---|---|---|
| ”基本 OTA 功能” | 4MB + default_4MB | 最常用方案,兼容性好 |
| ”固件较大(LVGL/触摸屏)“ | 8MB + default_8MB | 提供 ~3MB 应用空间 |
| ”需要中文和图片资源” | 16MB + custom | 大文件系统存储资源 |
| ”无需 OTA,仅一个固件” | 4MB + factory | 最大化应用空间 |
| ”高安全需求” | 4/8MB + Flash 加密 | 保护固件不被读取 |
常见买家问题
Section titled “常见买家问题”Q1: 固件空间不够怎么办?
A: 有以下解决方案:1) 升级到 8MB/16MB Flash;2) 使用 min_spiffs 分区方案腾出更多空间;3) 将资源文件存储在文件系统或 SD 卡中;4) 移除不必要的库。
Q2: 不同分区方案会影响功能吗?
A: 会影响可用的应用空间和文件系统空间。选型时需要权衡固件大小和资源文件大小的需求。default_4MB 适合大多数基础 IoT 应用。
Q3: 升级到更大 Flash 需要改什么?
A: 主要修改 partitions.csv 和 platformio.ini 中的 board_build.flash_mode 配置。代码通常无需修改。硬件上需要更换对应容量的 Flash 芯片或开发板。
Summary
Section titled “Summary”本节介绍了 ESP32 的分区方案:
- 分区表结构:Bootloader、分区表、应用分区、文件系统、NVS
- 双 OTA 分区:确保升级失败可回滚
- 分区方案选型:根据 Flash 大小和固件需求选择
- 大小限制:default_4MB 支持 ~1.8MB 固件
- Flash 加密:可选功能,增加安全性