ESP32之 ESP-IDF 教学(十三)—— 分区表

专栏简介:
本专栏讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容!

每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏主页↓↓↓
CSDN 请求进入专栏       _ O x

是否进入ESP32教学专栏(基于ESP-IDF)?

       确定

一、分区表简介

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,
Name Type SubType Offset Size Flag
nvs data nvs 0x9000 0x6000
phy_init data phy 0xf000 0x1000
factory app factory 0x10000 1M

2. “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,
Name Type SubType Offset Size Flag
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

从上方两张内置分区表中我们可以发现,分区表具有一定的格式,接下来我们来探究分区表的格式

3、分区表的格式

分区表有两种格式,一种是给人阅读的,是ASCII文件,文件类型为*.CSV
另一种是烧录到 ESP32 中的,是二进制文件,通常编译成*.bin文件。对于上文给出的两种分区表,毋庸置疑是第一种。包括下边部分

(1) 注释

字段之间的空字符会被忽略,任何以 # 开头的行(注释)都会被忽略。

(2) Name —— 分区名

Name 字段可以是任何有意义的名称,但不能超过 16 个字符(之后的内容将被截断)。该字段对 ESP32 并不是特别重要。

(3) Type —— 主类型

Type 字段可以指定为 app (0x00) 或者 data (0x01),也可以直接使用数字 0-254(或者十六进制 0x00-0xFE)。但二级引导程序bootloader会忽略除appdata 的类型

如果您的应用程序需要以 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 —— 偏移地址 & 分区大小

偏移地址指此分区开始的位置,语法上分区的大小和偏移地址可以采用以下表示方法:

  1. 十进制数(支持 K 或 M 的倍数单位(分别代表 10241024² 字节)
  2. 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 buildidf.py flash即可编译并烧录整个应用程序。

如果只是想编译分区表,请用idf.py partition_tableidf.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 buildidf.py flash即可编译并烧录整个应用程序。

如果只是想编译分区表,请用idf.py partition_tableidf.py partition_table-flash分别来编译和烧录分区表。

猜你喜欢

转载自blog.csdn.net/m0_50064262/article/details/122279800