目前使用的ESP-WROOM-32集成4MB SPI Flash。在编译esp32程序时,通过make menuconfig -> PartitionTable 可以有三种分区选择:工厂程序(无OTA分区)/工厂程序(双OTA分区)/用户自定义分区。
本文以ESP32 4M Flash为例,讲一讲如何用户自定义分区表。
0x8000
之前的地址保存Boot loader。Partition Table
分区:ESP32 在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。该分区表的长度为 0xC00 字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了安全启动
功能,则该分区表后还会保存签名信息。这个默认偏移地址在make menuconfig
- Partition Table
-offset of Partition Table
这里设置。修改这个值,会影响到后面所有分区的偏移量。NVS
分区:这个实际上是NVS(2)
分区。用于存储每台设备的 PHY 校准数据(注意,并不是 PHY 初始化数据)。也用于存储 Wi-Fi 数据(如果使用了 esp_wifi_set_storage(WIFI_STORAGE_FLASH) 初始化函数)和通过NVS API 保存的其他应用程序数据。强烈建议为 NVS 分区分配至少 0x3000 字节空间。上图分配了0x4000字节。OTA data
分区:系统从哪个app分区启动由此分区内的信息决定。Phy_init
分区:用于存储 PHY 初始化数据。这样可以为每个设备(而不是在固件中)配置 PHY。在默认的配置中,phy partition 未被使用。Factory app
分区:用于保存工厂(出厂)应用程序。如果分区表中有工厂应用程序,ESP-IDF 软件启动加载器会启动工厂应用程序。如果分区表中没有工厂应用程序(如上面的分区表例子),则启动第一个可用的 OTA 分区(通常是 OTA_0)。Core dump
分区:core dump分区用于查找系统崩溃时的软件错误,系统崩溃的时候会将调试信息写入到Flash中保存以便开发者对崩溃原因进行分析。关于这个分区的使用可以参考使用ESP32 的调试工具 coredump。OTA_0
/OTA_1
分区用于保存OTA下载的固件。OTA启用后,OTA下载的固件镜像交替保存于OTA_0
/OTA_1
分区,镜像验证后,OTA data
分区更新,指定在下一次启动时使用该镜像。OTA不会影响到Factory app
分区,这样用户可以随时恢复到出厂状态。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
offset
),只标明长度,所以相应分区会紧跟着前一个分区之后开始;若为首个分区,则将紧跟着分区表(Partition Table)开始。系统会自动计算。fctry
的offset仍然需要我们自行计算,因为我们需要手动烧录这个分区,而烧录的时候需要指定地址。0x10000 (64K)
对齐,如果将偏移字段留空,gen_esp32part.py 工具会自动计算得到一个满足对齐要求的偏移地址。如果 app 分区的偏移地址没有与 0x10000 (64K) 对齐,则该工具会报错。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
参考文献::