ESP32分区表图解

目前使用的ESP-WROOM-32集成4MB SPI Flash。在编译esp32程序时,通过make menuconfig -> PartitionTable 可以有三种分区选择:工厂程序(无OTA分区)/工厂程序(双OTA分区)/用户自定义分区。

本文以ESP32 4M Flash为例,讲一讲如何用户自定义分区表。

首先下图是一个适用于阿里云物联网平台的分区表:
ESP32分区表图解_第1张图片

关于分区图示的说明:

  1. 0x8000之前的地址保存Boot loader。
  2. Partition Table分区:ESP32 在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。该分区表的长度为 0xC00 字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了安全启动功能,则该分区表后还会保存签名信息。这个默认偏移地址在make menuconfig - Partition Table-offset of Partition Table这里设置。修改这个值,会影响到后面所有分区的偏移量。
  3. NVS分区:这个实际上是NVS(2)分区。用于存储每台设备的 PHY 校准数据(注意,并不是 PHY 初始化数据)。也用于存储 Wi-Fi 数据(如果使用了 esp_wifi_set_storage(WIFI_STORAGE_FLASH) 初始化函数)和通过NVS API 保存的其他应用程序数据。强烈建议为 NVS 分区分配至少 0x3000 字节空间。上图分配了0x4000字节。
  4. OTA data分区:系统从哪个app分区启动由此分区内的信息决定。
  5. Phy_init分区:用于存储 PHY 初始化数据。这样可以为每个设备(而不是在固件中)配置 PHY。在默认的配置中,phy partition 未被使用。
  6. Factory app分区:用于保存工厂(出厂)应用程序。如果分区表中有工厂应用程序,ESP-IDF 软件启动加载器会启动工厂应用程序。如果分区表中没有工厂应用程序(如上面的分区表例子),则启动第一个可用的 OTA 分区(通常是 OTA_0)。
  7. Core dump分区:core dump分区用于查找系统崩溃时的软件错误,系统崩溃的时候会将调试信息写入到Flash中保存以便开发者对崩溃原因进行分析。关于这个分区的使用可以参考使用ESP32 的调试工具 coredump。
  8. OTA_0/OTA_1分区用于保存OTA下载的固件。OTA启用后,OTA下载的固件镜像交替保存于OTA_0/OTA_1分区,镜像验证后,OTA data分区更新,指定在下一次启动时使用该镜像。OTA不会影响到Factory app分区,这样用户可以随时恢复到出厂状态。
  9. fctry分区:保存阿里云四元组。如果不连接阿里云,该分区可以省略。

esp-aliyun仓库提供的默认例程的分区表文件(examples/ota/ota_example_mqtt/partitions_esp32.csv)如下:

# Name,   Type, SubType, Offset,   Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     ,        0x4000,
otadata,  data, ota,     ,        0x2000,
phy_init, data, phy,     ,        0x1000,
ota_0,    app,  ota_0,   ,        1M,
ota_1,    app,  ota_1,   ,        1M,
fctry,    data, nvs,     ,        0x4000

关于这个分区表文件的说明:

  1. 在上面分区表文件内,没有写偏移地址(offset),只标明长度,所以相应分区会紧跟着前一个分区之后开始;若为首个分区,则将紧跟着分区表(Partition Table)开始。系统会自动计算。
  2. 即便系统自动计算了偏移地址,fctry的offset仍然需要我们自行计算,因为我们需要手动烧录这个分区,而烧录的时候需要指定地址。
  3. app 分区的偏移地址必须要与 0x10000 (64K)对齐,如果将偏移字段留空,gen_esp32part.py 工具会自动计算得到一个满足对齐要求的偏移地址。如果 app 分区的偏移地址没有与 0x10000 (64K) 对齐,则该工具会报错。
  4. 上面的这个分区表例子中没有Factory app工厂应用程序分区,所以默认从第一个可用的 OTA 分区(通常是 OTA_0)启动。

下面是esp-idf/components/partition_table/partitions_two_ota_coredump.csv中的分区标文件内容,可以看到比上个例子多了factory分区。

# Name,   Type, SubType, Offset,   Size
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,      data, nvs,     ,         0x4000
otadata,  data, ota,     ,         0x2000
phy_init, data, phy,     ,         0x1000
factory,  0,    0,       ,         1M
coredump, data, coredump,,         64K
ota_0,    0,    ota_0,   ,         1M
ota_1,    0,    ota_1,   ,         1M

参考文献::

  1. 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档
  2. 空中升级 (OTA) - ESP32 - — ESP-IDF 编程指南 latest 文档

你可能感兴趣的:(ESP32)