1、背景:
ESP32 是一款蓝牙与 WIFI 合一的 IoT 芯片,并且支持 OTA 在线升级功能,在实际产品开发过程中需要对 FLASH 分区定制才能更好地满足产品需求,做刚刚好的产品。
ESP32 系统可以运行多个应用程序,同时包括大量的数据(校正数据、文件系统、参数保存等),分区表存放在 FLASH 偏移地址 0x8000。
2、分区表简析
分区表长度为 0xC00 字节,最多支持 95 个分区入口,使用 MD5 校验,笔者使用的 ESP32 模组是 ESP-WROOM-32,该模组集成了 4MB SPI Flash,在编译esp32程序时,通过make menuconfig -> PartitionTable 可以看到三种分区选择:
工厂程序(无OTA分区):
偏移地址 0x10000 处存放出厂固件,bootloader 启动时默认加载该偏移地址应用程序
# Espressif ESP32 Partition Table # Name, Type, SubType, Offset, Size nvs, data, nvs, 0x9000, 0x6000 phy_init, data, phy, 0xf000, 0x1000 factory, app, factory, 0x10000, 1M
工厂程序(双OTA分区):
otadata 分区存储 OTA 升级数据,用于启动时判断加载哪个入口的应用程序:factory、ota_0,ota_1
# Espressif ESP32 Partition Table # Name, Type, SubType, Offset, Size nvs, data, nvs, 0x9000, 0x4000 otadata, data, ota, 0xd000, 0x2000 phy_init, data, phy, 0xf000, 0x1000 factory, 0, 0, 0x10000, 1M ota_0, 0, ota_0, , 1M ota_1, 0, ota_1, , 1M
用户自定义分区:
# Name, Type, SubType, Offset, Size nvs, data, nvs, 0x9000, 0x4000 otadata, data, ota, 0xd000, 0x2000 phy_init, data, phy, 0xf000, 0x1000 factory, app, factory, 0x10000, 1M ota_0, app, ota_0, , 1M ota_1, app, ota_1, , 1M
menuconfig 中的配置只是修改配置文件中的宏,实际上 ESP32 SDK 对应 FLASH 分区配置的源码路径是:
\esp-idf\components\partition_table
该路径下有文件:
partitions_singleapp
partitions_singleapp_coredump
partitions_two_ota
partitions_two_ota_coredump
都是用来对Flash分区进行配置的。
以 partitions_two_ota_coredump 为例,使用 partitions_two_ota_coredump 配置分区时4M SPI Flash的分区情况如下图所示:
3、生成分区二进制文件
分区文件是 CSV 格式,但是需要生成二进制文件才能被写入 FLASH,工具 gen_esp32part.py 被用于文件转化(CVS 和 二进制)。
转化 CVS 为二进制文件:
python gen_esp32part.py input_partitions.csv binary_partitions.bin
转化二进制为 CVS 文件:
python gen_esp32part.py binary_partitions.bin input_partitions.csv