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
refer:
https://esp-idf.readthedocs.io/en/latest/api-guides/partition-tables.html
https://blog.csdn.net/abc517789065/article/details/79891568
https://github.com/espressif/esp-idf/blob/be81d2c/components/partition_table/gen_esp32part.py