【ESP32】ESP-IDF的分区表

夕凪マナ 发布于 2024-12-21 154 次阅读


【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字段支持encryptedreadonly,如果分区启用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
此作者没有提供个人介绍
最后更新于 2024-12-21