esp32的falsh可以分为三部分:
flash从结构上来看,包括BootLoader、分区表和用户数据(包括代码和存储数据)三部分。
比如我们看下面实际的一张flash内存表
flash从0x8000以前的区域,都是bootloader,用于esp32的启动
flash在0x8000处烧写一张分区表(partition Table),该分区长度为0xC00字节,最多可以保存95条分区表条目。分区表定义了后面数据段的用途
分区表后面的数据都属于用户数据,用来存放用户的代码和数据。该部分具体包含什么功能区,由分区表决定。可能包含以下内容:
提到了flash区域,顺便说一下esp32的启动过程
ESP32启动大概分为三个步骤:
前文已经提到,分区表主要的作用是用来划分剩余flash空间的功能和大小的。
分区表在0x8000的位置被烧写,最大长度为0xC00字节,最多能把flash分为95段。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了安全启动功能,则该分区表后还会保存签名信息。
在esp32中,分区表是以bin类型的二进制文件进行烧写的。如果想读取这个分区表,可以通过一些方法把bin转换为csv进行阅读,具体方法后文会讲。
分区表含有六个字段。包括Name,Type,SubType、Offset、Size、Flags,如默认的分区表定义如下:
# 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,
Name 字段可以是任何有意义的名称,但不能超过16个字符(之后的内容将被截断)。该字段对 ESP32 并不是特别重要。
Type 字段可以指定为 app (0x00)(代码类型) 或者 data (0x01)(数据类型),也可以直接使用数字0-254(或者十六进制 0x00-0xFE)。注意,0x00-0x3F 不得使用(预留给 esp-idf 的核心功能)。
如果应用程序需要以ESP-IDF尚未支持的格式存储数据,请在0x40-0xFE内添加一个自定义分区类型。
SubType 字段长度为 8 bit,内容与具体分区 Type 有关。目前,esp-idf 仅仅规定了 “app” 和 “data” 两种分区类型的子类型含义。
Name | Type | SubType |
---|---|---|
any value | app | factory ota_0-15 |
any value | data | ota data phy nvs spiffs |
当Type定义为app的时候,SubType可以选择factory(0x00)、0ta_0(0x10)…ota_15(0x1F)或test(0x20):
当Type定义为data的时候,SubType可以选择ota(0x00),phy(0x01),nvs(0x02),nvs_keys(0x04)等
偏移地址是功能分区的起始地址。这个地址要求与0x10000(64k)对齐。
如果偏移字段留空,gen_esp32part.py 工具会自动计算得到一个满足对齐要求的偏移地址。
如果 app 分区的偏移地址没有与 0x10000 (64K) 对齐,则该工具会报错。
app 分区的大小和偏移地址可以采用十进制数、以 0x 为前缀的十六进制数,且支持 K 或 M 的倍数单位(分别代表 1024 和 1024*1024 字节)
当前仅支持 encrypted 标记。如果 Flags 字段设置为 encrypted,且已启用 Flash 加密 功能,则该分区将会被加密。
分区表以二进制文件bin类型的方式进行存储,如果我们想要查看,就要把bin文件转换为csv文件。转换方法如下:
python C:\Software\Esp\espidf\components\partition_table\gen_esp32part.py build\partition_table\partition-table.bin C:\Users\30311\Desktop\partition-table.csv
idf.py menuuconfig
前两个选择是内置分区表
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,
Factory app, two OTA definitions
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
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, 0x110000, 1M,
ota_1, app, ota_1, 0x210000, 1M,
把自定义的分区表放在项目路径下,在这里吧名字输入进去即可。idf会自动把csv转换为bin文件
[1] ESP32分区表图解
[2] 玩转ESP32(3):partitiontable使用
[3] 分区表