文章目录
- 一、分区表简介
- 1、什么是分区表
- 2、ESP32 内置分区表
- 3、分区表的格式
- (1) 注释
- (2) Name —— 分区名
- (3) Type —— 主类型
- (4) SubType —— 子类型
- (5) Offset & Size —— 偏移地址 & 分区大小
- (6) Flag —— 标记
- 二、通过分区表设置分区
- 1、使用内置分区表
- 2、自定义分区表
一、分区表简介
1、什么是分区表
分区表是 ESP32 划分内部 flash 闪存的清单,它将 flash 划分为多个不同功能的区域用于其他功能。
分区类型分为两种,分别为 “应用” 和 “数据”。如应用分为Factory程序,OTA程序等,又如数据分为校准数据、文件系统数据、参数存储数据等。
分区表的长度为 0xC00
字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5
校验和,用于验证分区表的完整性。此外,如果芯片使能了 “安全启动” 功能,则该分区表后还会保存签名信息。
2、ESP32 内置分区表
分区表可以自定义,也可以使用两种内置的简单分区表。在idf.py monitor
下有两张预定义的分区表,分别是:
- “Single factory app, no OTA”
(单APP,无OTA分区) - “Factory app, two OTA definitions”
(单APP + 两个OTA分区)
idf.py menuconfig 中分区表设置:
首页 -> Partitions Table
对应的分区表分别为:
1. “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,NameTypeSubTypeOffsetSizeFlagnvsdatanvs0x90000x6000phy_initdataphy0xf0000x1000factoryappfactory0x100001M2. “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,NameTypeSubTypeOffsetSizeFlagnvsdatanvs0x90000x4000otadatadataota0xd0000x2000phy_initdataphy0xf0000x1000factoryappfactory0x100001Mota_0appota_00x1100001Mota_1appota_10x2100001M
从上方两张内置分区表中我们可以发现,分区表具有一定的格式,接下来我们来探究分区表的格式
3、分区表的格式
分区表有两种格式,一种是给人阅读的,是ASCII
文件,文件类型为*.CSV
。
另一种是烧录到 ESP32 中的,是二进制文件,通常编译成*.bin
文件。对于上文给出的两种分区表,毋庸置疑是第一种。包括下边部分
(1) 注释
字段之间的空字符会被忽略,任何以 #
开头的行(注释)都会被忽略。
(2) Name —— 分区名
Name 字段可以是任何有意义的名称,但不能超过 16 个字符(之后的内容将被截断)。该字段对 ESP32 并不是特别重要。
(3) Type —— 主类型
Type 字段可以指定为 app (0x00)
或者 data (0x01)
,也可以直接使用数字 0-254(或者十六进制 0x00
-0xFE
)。但二级引导程序bootloader
会忽略除app
和 data
的类型
如果您的应用程序需要以 ESP-IDF 尚未支持的格式存储数据,请在
0x40
-0xFE
内添加一个自定义分区类型。因为0x00
-0x3F
是预留给 esp-idf 的核心功能的
(4) SubType —— 子类型
子类型用于明确具体类型,该字段本质上为长度 8 bit 的数字,内容与具体分区 Type 有关。目前,esp-idf 仅仅规定了 “app”
和 “data”
两种分区类型的子类型含义。
目前esp-idf能识别的已知关键字有:
app
类型下:factory
,test
,ota_0
,ota_1
,ota_2
,ota_3
,ota_4
,ota_5
,ota_6
,ota_7
,ota_8
,ota_9
,ota_10
,ota_11
,ota_12
,ota_13
,ota_14
,ota_15
data
类型下:ota
,phy
,nvs
,coredump
,nvs_keys
,efuse
,esphttpd
,fat
,spiffs
其余自定义类型要通过数字来表示:见官方文档
(5) Offset & Size —— 偏移地址 & 分区大小
偏移地址指此分区开始的位置,语法上分区的大小和偏移地址可以采用以下表示方法:
- 十进制数(支持 K 或 M 的倍数单位(分别代表
1024
和1024²
字节) - 以
0x
为前缀的十六进制数,
对于主类型为 app
的分区,要求分区偏移地址必须与0x10000 (64K)
对齐,否则编译分区表时,gen_esp32part.py
工具会报错!
另外,Offset
字段可以留空。如果留空则会发生以下情况:
① 若为首个分区,则将紧跟着分区表开始。
② 若为 app
分区,gen_esp32part.py
工具会自动计算得到一个满足偏移地址对齐要求的偏移地址。
③ 对于其余情况,偏移地址将紧跟在前一个分区之后。
(6) Flag —— 标记
当前仅支持 encrypted
标记。如果 Flags 字段设置为 encrypted
,且已启用 Flash 加密 功能,则该分区将会被加密。其余情况此标记可以省略。
二、通过分区表设置分区
1、使用内置分区表
进入工程文件夹,打开idf.py menuconfig
(这里假设大家已经执行过export.bat (Windows)
或 export.sh (Linux)
)
如上图,可以看到内置的两张分区表(前两个选项),按空格键即可选中,然后按Q之后按Y即可保存。
之后使用idf.py build
和 idf.py flash
即可编译并烧录整个应用程序。
如果只是想编译分区表,请用idf.py partition_table
和idf.py partition_table-flash
分别来编译和烧录分区表。
2、自定义分区表
内置分区表功能很少,例如无文件系统等分区。
使用自定义分区表时,要先在工程根目录下新建一个*.csv
文件,内容按照上文规则编写自定义分区表。分区表文件名随意。如下csv.csv
$ tree
.
├── main
│ ├── CMakeLists.txt
│ └── Hello.cpp
├── CMakeLists.txt
└── csv.csv #这个文件
之后打开idf.py menuconfig
参考上文打开分区表设置界面,选择第三项“自定义分区表 CSV
文件”
按空格键选中之后,在如图位置填写自定义分区表的文件名。例如本示例里分区表叫csv.csv
按Enter键即可确认,然后按Q之后按Y即可保存。
之后使用idf.py build
和 idf.py flash
即可编译并烧录整个应用程序。
如果只是想编译分区表,请用idf.py partition_table
和idf.py partition_table-flash
分别来编译和烧录分区表。