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
卫朋
人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。
卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。
文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。