【ESP32】ESP-IDF的分区表
1. 分区表概述
ESP32的flash能够存储多个应用程序及多种数据,因此会在flash中存一张分区表用来管理,ESP-IDF将这个分区表烧录在flash的默认偏移地址0x8000上。分区表占据一整个flash扇区(0x1000),分为分区表0xC00字节+MD5校验和。
以下是是ESP-IDF预定义分区表中“Single factory app, no OTA”的内容:
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
从这个分区表中可以看出,每块分区都包括6个属性,分别是名称(Name)、类型(Type)、子类型(SubType)、偏移量(Offset)、大小(Size)和标志(Flags)。
其中的Type分为app和data两种,用于存储运行的程序或者是数据,也可以是自定义的0x40~0xFE。当Type选择为app时,子类型可以是factory(一般用来放置出厂程序)、ota_0~ota_15(用来放置OTA升级的程序);当Type选择为data时,子类型可以是ota、phy、nvs等。
2. 自定义分区表
除了ESP-IDF提供的几种分区表模板,还可以选择自定义分区表(Custom partition table CSV),默认为项目根目录下的partitions.csv文件。并不是所有字段都是必须的,但是格式必须与ESP-IDF提供的预定义的分区表一致。例如分区的Offset字段可以省略,ESP-IDF在构建的时候会自动帮我们计算并填充分区的偏移地址。
2.1 Name字段
Name字段仅作为一个标识,最长不超过16个字节。
2.2 Type字段
Type字段可以指定为app(0x00)、data(0x01)或是自定义的0x40~0xFE,其中的0x02~0x3F是为ESP-IDF的核心功能预留的类型,不能使用。自定义类型可以参考乐鑫官方文档中esp_partition_type_t关于app和data分区的枚举定义。
2.3 SubType字段
SubType字段的内容与Type字段有关:
==当Type定义为app时==,SubType可以指定为factory(0x00)、ota_1(0x10)...ota_15(0x1F)或是test(0x20)。
其中factory为默认的app分区,bootloader会默认加载factory中的程序,但是如果存在ota分区,则会加载ota分区中的程序并判断使用哪个ota分区中的程序。factory不会因为OTA升级而改变,如果需要进行OTA升级但程序比较大导致flash空间不足,可以删除factory分区。
ota_1...ota_15为OTA应用程序分区,bootloader会根据OTA数据分区中的数据来决定加载哪个OTA应用程序分区中的程序。在使用OTA功能时,应至少包含两个OTA应用程序分区。
test一般用于工厂测试,如果没有其他可用程序分区就会加载该分区中的应用程序,也可以通过配置bootloader,在启动时读取GPIO电平,如果GPIO被拉低则启动该分区中的应用程序。
==当Type定义为data时==,SubType可以指定为ota(0x00)、phy(0x01)、nvs(0x02)、nvs_keys(0x03)或其他组件特定的子类型。
ota为OTA数据分区,用来存储OTA应用程序相关信息,大小为0x2000。
phy是用来存放初始化数据的,默认情况下是把phy初始化数据编译在应用程序中的,如果要使用该分区,则需要手动将phy初始化数据烧录至flash中。
nvs给非易失性存储使用的分区,用来存储phy设备的校准数据,WiFi数据等,该可以用来存储一些其他应用程序数据。如果需要用该分区存储某些应用程序数据,最好增大该分区的大小(默认为0x6000字节)。
nvs_keys是nvs密钥分区。
2.4 Offset&Size字段
偏移地址表示SPI flash中的分区地址,扇区大小为0x1000(4KB),因此偏移地址必须是4KB的倍数。app分区的偏移地址必须与0x10000对齐,分区的大小也必须与扇区大小对齐。
2.5 Flags字段
Flags字段支持encrypted和readonly,如果分区启用encrypted则该分区会被加密(app分区即是没有设置该字段,都会保持加密)。readonly标记仅支持data分区(除ota和coredump外),用来防止一些意外写入的情况发生。
3. 生成分区表二进制文件
烧录至ESP32的分区表采用二进制格式,可以使用gen_esp32part.py将CSV格式的分区表文件转换为二进制格式,同样也可以使用该python脚本将二进制分区表文件还原为CSV文件。
python gen_esp32part.py input_partitions.csv binary_partitions.bin
python gen_esp32part.py binary_partitions.bin input_partitions.csv
该脚本也可以打印二进制分区表的内容
python gen_esp32part.py binary_partitions.bin
Comments NOTHING