ESP32 官方文档(三)分区表

本文深入解析ESP32的分区表概念,涵盖内置与自定义分区表的创建,包括分区表条目的名称、类型、子类型、偏移量及大小,以及如何生成和烧录二进制分区表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分区表分区表概述内置分区表创建自定义分区表名字字段类型字段子类型App 子类型数据子类型偏移量 & 大小标志生成二进制分区表MD5 校验和烧录分区表
分区表
概述
单个 ESP32 的 flash 可以包含多个应用程序,以及许多不同类型的数据(校准数据,文件系统,参数存储等). 因此,分区表被下载到 flash 中的 0x8000 地址(默认偏移量).
分区表长度为 0xC00 字节(最多 95 个分区表条目). 在表数据之后附加 MD5 校验和. 如果分区表由于安全引导而签名,则签名将附加在分区表之后.
分区表中的每个条目都有一个 name (label),type(app,data 或其他),subtype以及加载分区的 flash 中的 offset (偏移量).
使用分区表的最简单方法是 make menuconfig 并选择一个简单的预定义分区表:

“Single factory app, no OTA”
“Factory app, two OTA definitions”

在这两种情况下,factory 应用程序下载到 0x10000 地址. 如果您 make partition_table,那么它将打印分区表的摘要.
内置分区表
以下是 Single factory app, no OTA 的分区表配置信息:
# Espressif ESP32 Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 1M,
12345

flash 中的 0x10000(64KB) 偏移量被标记为 factory 应用程序. 默认情况下,引导加载程序将运行此应用程序.
在分区表中还定义了两个用于存储 NVS 库分区和 PHY 初始化数据的数据区域.

以下是 Factory app, two OTA definitions 的分区表配置信息:
# Espressif ESP32 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,  0,    0,       0x10000, 1M,
ota_0,    0,    ota_0,  0x110000, 1M,
ota_1,    0,    ota_1,  0x210000, 1M,
12345678

现在有三个应用程序分区定义.
这三种 Type 都设置为 app,但在 0x10000 位置的 factory 应用程序和后面的两个 OTA 应用程序的子类型有所不同.
还有一个新的 ota data 区域,用于保存 OTA 更新的数据. 引导加载程序会查询此数据,以便了解要执行的应用程序. 如果 ota data 为空,它将执行 factory 应用程序.

创建自定义分区表
如果在 menuconfig 中选择 “Custom partition table CSV”,还应该输入要用于分区表的 CSV 文件的名称(在项目目录中). CSV 文件中有将要用于分区表配置的任意数量的定义.
CSV 格式与上面摘要中打印的格式相同. 但是,CSV 中并非所有字段都是必需的. 例如,以下是 OTA 分区表的“输入” CSV:
# Custom partition table
# Name,   Type, SubType, Offset, Size, Flags
nvs,      data, nvs,     ,       0x4000,
otadata,  data, ota,     ,       0x2000,
phy_init, data, phy,     ,       0x1000,
factory,  app,  factory, ,       1M,
ota_0,    app,  ota_0,   ,       1M,
ota_1,    app,  ota_1,   ,       1M,
12345678

字段之间的空格被忽略,任何以#(注释)开头的行也是如此.
CSV 文件中的每个非注释行都是分区定义.
每个分区的 “Offset” 字段为空. gen_esp32part.py 工具填充每个空白偏移量,从分区表开始并确保每个分区正确对齐.

名字字段
名称字段可以是任何有意义的名称. 这对 ESP32 来说并不重要. 超过 16 个字符的名称将被截取.
类型字段
分区类型字段可以指定为 app(0) 或 data(1). 或者它可以是数字 0-254(或十六进制 0x00-0xFE). 类型 0x00-0x3F 保留用于 esp-idf 核心功能.
如果您的应用程序需要存储数据,请在 0x40-0xFE 范围内添加自定义分区类型.
引导加载程序忽略 app(0) 和 data(1) 以外的任何分区类型.
子类型
8 位子类型字段特定于给定的分区类型.
esp-idf 当前仅指定 “app” 和 “data” 分区类型的子类型字段的含义.
App 子类型
当 type 为 “app” 时,子类型字段可以指定为 factory(0),ota_0(0x10)… ota_15(0x1F) 或 test(0x20).

factory(0) 是默认的应用程序分区. 引导加载程序将执行工厂应用程序,除非它看到类型为 data/ota 的分区,在这种情况下,它会读取此分区以确定要引导的 OTA 映像.

OTA 永远不会更新 factory 分区.
如果要保留 OTA 项目中的闪存使用率,可以删除 factory 分区并改为使用 ota_0.


ota_0(0x10)… ota_15(0x1F) 是 OTA app 区域. 有关更多详细信息,请参阅OTA文档,然后使用 OTA 数据分区配置引导加载程序应引导的应用程序. 如果使用 OTA,则应用程序应至少具有两个 OTA 应用程序槽(ota_0&ota_1). 有关更多详细信息,请参阅OTA文档.
test(0x2) 是 factory 测试程序的保留子类型. esp-idf 引导程序当前不支持它.

数据子类型
当 type 为 “data” 时,子类型字段可以指定为 ota(0),phy(1),nvs(2).

ota(0) 是OTA数据分区,它存储有关当前所选 OTA 应用程序的信息.此分区的大小应为 0x2000 字节.有关更多详细信息,请参阅OTA文档.
phy(1) 用于存储 PHY 初始化数据.这允许 PHY 到每个设备被配置,而不是在固件.

在默认配置中,不使用 phy 分区,并且 PHY 初始化数据被编译到 app 本身.因此,可以从分区表中删除此分区以节省空间.
要从此分区加载 PHY 数据,请运行 make menuconfig 并启用 CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION 选项.您还需要使用 phy init 数据刷新(flash)设备,因为 esp-idf 构建系统不会自动执行此操作.


nvs(2) 用于非易失性存储(NVS)API.

NVS 用于存储每个设备 PHY 校准数据(与初始化数据不同).
如果使用esp_wifi_set_storage(WIFI_STORAGE_FLASH)初始化功能,则 NVS 用于存储 WiFi 数据.
NVS API 还可用于其他应用程序数据.
强烈建议您在项目中包含至少 0x3000 字节的 NVS 分区.
如果使用 NVS API 存储大量数据,请将 NVS 分区默认的 0x6000 字节大小增加.

 

其他数据子类型保留用于将来的 esp-idf 用途.
偏移量 & 大小
具有空白偏移的分区将在前一个分区之后开始,或者第一个分区是在分区表之后开始.
应用程序分区必须处于与 0x10000(64K) 对齐的偏移量. 如果将偏移字段留空,工具将自动对齐分区. 如果为应用程序分区指定未对齐的偏移量,该工具将返回错误.
大小和偏移量可以指定为十进制数,带前缀 0x 的十六进制数,或大小乘数 K 或 M(1024 和 1024 * 1024 字节).
如果希望分区表中的分区与表本身的任何起始偏移量(CONFIG_PARTITION_TABLE_OFFSET)一起使用,请将所有分区的偏移字段(在 CSV 文件中)留空. 类似地,如果更改分区表偏移,则要注意所有空白分区偏移可能会更改为匹配,并且任何固定偏移现在可能与分区表冲突(导致错误).
标志
目前仅支持一个加密的标志. 如果此字段设置为加密,则在启用 Flash 加密时将对此分区进行加密.
(请注意,无论是否设置此标志,应用程序类型分区都将始终加密.)
生成二进制分区表
下载到 ESP32 的分区表是二进制格式,而不是 CSV 格式. 工具 partition_table/gen_esp32part.py 用于在 CSV 和二进制格式之间进行转换.
如果在 make menuconfig 中配置分区表 CSV 名称,然后生成 partition_table,则此转换将在构建过程中完成.
要手动将 CSV 转换为二进制:
python gen_esp32part.py input_partitions.csv binary_partitions.bin
1
要将二进制格式转换回 CSV:
python gen_esp32part.py binary_partitions.bin input_partitions.csv
1
在 stdout 上显示二进制分区表的内容(这是生成 make partition_table 时显示的摘要的方式:
python gen_esp32part.py binary_partitions.bin
1
MD5 校验和
分区表的二进制格式包含基于分区表计算的 MD5 校验和. 此校验和用于在引导期间检查分区表的完整性.
可以通过 gen_esp32part.py 的 --disable-md5sum 选项或 CONFIG_PARTITION_TABLE_MD5 选项禁用 MD5 校验和生成. 例如,当使用传统引导加载程序无法处理 MD5 校验和且引导失败并且错误消息无效幻数 0xebeb 时,这很有用.
烧录分区表

make partition_table-flash:将使用 `esptool.py 下载分区表.
make flash:会下载所有固件,包括分区表.

手动下载命令也会打印在 make partition_table 中.
请注意,更新分区表不会擦除已根据旧分区表存储的数据. 您可以使用 make erase_flash (或 esptool.py erase_flash)来擦除整个闪存内容.
--------------------- 
作者:InfiniteYuan 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_27114397/article/details/82157058 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>我们正在讨论如何在ESP32-S3上使用ESP-IDF框架配置和使用分区表分区表是ESP-IDF中用于定义闪存布局的重要机制,它允许开发者将闪存划分为多个区域,例如应用程序、OTA数据、文件系统等。 参考步骤: 1. 理解分区表概念 2. 创建自定义分区表 3. 配置项目以使用分区表 4. 在代码中使用分区信息 注意:ESP32-S3的分区表配置与其他ESP32系列类似,但可能有特定的分区类型(如用于USB、PSRAM等)。 详细步骤: 1. **理解分区表概念** - 分区表是一个CSV文件,通常位于项目根目录下的`partitions.csv`。 - 每个分区包括:名称、类型、子类型、偏移量、大小和标志。 - 常用分区类型:`app`(应用程序)、`data`(数据)、`ota`(OTA更新)等。 2. **创建自定义分区表** - 在项目根目录创建`partitions.csv`文件。 - 示例内容: ``` # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 1M, storage, data, spiffs, , 0x100000, ``` - 注意:如果偏移量(Offset)留空,则分区会紧接上一个分区之后开始。大小(Size)可以使用十六进制或带单位(如K、M)的十进制表示。 3. **配置项目以使用分区表** - 运行`idf.py menuconfig`打开配置菜单。 - 进入`Partition Table`设置: - 选择`Partition Table`(分区表)→ `Custom partition table CSV`(自定义分区表CSV),并填写`partitions.csv`的路径(如果不在项目根目录)。 - 可以设置`Partition Table offset`(分区表偏移量),默认为`0x8000`。 - 保存配置。 4. **在代码中使用分区信息** - 使用`esp_partition`相关API访问分区。 - 示例:查找并操作分区 ```c #include "esp_partition.h" // 查找类型为数据,子类型为spiffs的分区 const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "storage"); if (partition == NULL) { ESP_LOGE(TAG, "Failed to find partition"); return; } // 读取分区数据 uint8_t buffer[128]; esp_err_t err = esp_partition_read(partition, 0, buffer, sizeof(buffer)); if (err != ESP_OK) { ESP_LOGE(TAG, "Read failed: %s", esp_err_to_name(err)); } ``` 5. **构建和烧录** - 分区表会在构建过程中自动编译并烧录到闪存的默认位置(`0x8000`)。 - 使用`idf.py flash`烧录整个项目(包括分区表)。 6. **验证分区表** - 烧录后,可以通过串口监视器查看启动日志,其中会打印分区表信息。 - 或者使用`esptool.py`读取闪存中的分区表: ``` esptool.py -p COMx read_flash 0x8000 0xC00 partition_table.bin ``` 然后使用`gen_esp32part.py`解析: ``` python components/partition_table/gen_esp32part.py partition_table.bin ``` 注意:对于ESP32-S3,如果需要使用特定的功能(如USB OTG),可能需要配置特定的分区类型和子类型。请参考官方文档。 引用:ESP-IDF分区表文档[^1] 相关问题: 1. 如何在分区表中为ESP32-S3的USB功能预留空间? 2. 如何配置分区表以支持OTA更新? 3. 如何扩展分区表以包含自定义数据类型?</think>### ESP32-S3 ESP-IDF 分区表配置指南 在 ESP-IDF 框架中配置分区表是管理 ESP32-S3 闪存空间的关键步骤,它定义了应用程序、文件系统、OTA 更新等组件的存储布局。以下是详细配置指南: --- #### 1. **分区表基础概念** - **分区表作用**:定义闪存空间的逻辑划分,每个分区包含名称、类型、子类型、偏移量和大小 - **核心分区类型**: - `app`:应用程序固件(可包含多个 OTA 分区) - `data`:数据存储(NVS、SPIFFS、FATFS 等) - `ota`:OTA 更新数据 - **ESP32-S3 特有**:支持 PSRAM 缓存分区和 USB OTG 专用分区 --- #### 2. **创建自定义分区表** 在项目根目录创建 `partitions.csv` 文件: ```csv # ESP32-S3 典型分区表示例 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, otadata, data, ota, 0xf000, 0x2000, phy_init, data, phy, 0x11000, 0x1000, factory, app, factory, 0x20000, 2M, ota_0, app, ota_0, , 2M, ota_1, app, ota_1, , 2M, spiffs, data, spiffs, , 1M, usb, data, fat, , 512K, encrypted ``` **参数说明**: - `Offset`:留空表示自动接续前一分区 - `Size`:支持单位(K/KB, M/MB)或十六进制(0x100000) - `Flags`:可选 `encrypted`(加密分区) --- #### 3. **配置项目使用分区表** 1. 运行配置工具: ```bash idf.py menuconfig ``` 2. 导航至: ``` > Partition Table [*] Custom partition table CSV (partitions.csv) Partition table CSV file (0x8000) Partition table offset address ``` 3. 启用 SPIFFS/FATFS(如使用文件系统分区): ``` > Component config > SPIFFS Configuration [*] Enable SPIFFS support ``` --- #### 4. **在代码中使用分区** ```c #include "esp_partition.h" // 查找 SPIFFS 分区 const esp_partition_t *spiffs_partition = esp_partition_find_first( ESP_PARTITION_TYPE_DATA, // 类型: data ESP_PARTITION_SUBTYPE_DATA_SPIFFS, // 子类型: spiffs "spiffs" // 分区标签 ); // 挂载 SPIFFS 文件系统 esp_vfs_spiffs_conf_t conf = { .base_path = "/spiffs", .partition_label = "spiffs", .max_files = 5, .format_if_mount_failed = true }; esp_vfs_spiffs_register(&conf); // 访问 USB 分区 (加密) const esp_partition_t *usb_partition = esp_partition_find_first( ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, "usb" ); esp_partition_read(usb_partition, 0, buffer, size); // 自动解密 ``` --- #### 5. **构建与烧录** 1. 编译包含分区表的固件: ```bash idf.py build ``` 2. 烧录所有内容(含分区表): ```bash idf.py flash ``` 3. 查看分区信息(烧录后): ```bash idf.py partition-table partition-table-flash monitor ``` --- #### 6. **高级配置技巧** 1. **OTA 滚动更新**: ```csv ota_0, app, ota_0, , 2M, ota_1, app, ota_1, , 2M, ``` 使用 `esp_ota_set_boot_partition()` 切换启动分区 2. **加密分区**: - 添加 `encrypted` 标志 - 在代码中使用 `esp_partition_get_encryption_key()` 获取密钥 3. **PSRAM 缓存优化**: ```csv psram_cache, data, spiram, , 256K, ``` --- #### 7. **分区表验证** 1. 生成二进制分区表: ```bash python $IDF_PATH/components/partition_table/gen_esp32part.py partitions.csv partitions.bin ``` 2. 解析现有分区表: ```bash esptool.py read_flash 0x8000 0xC00 partition-table.bin gen_esp32part.py partition-table.bin ``` --- ### 注意事项 1. **偏移量对齐**:确保分区起始地址按 4KB 对齐(0x1000 倍数) 2. **空间预留**:在分区表后预留至少 0x1000 空间 3. **默认分区**:未指定分区表时使用 `$IDF_PATH/components/partition_table/default.csv` 4. **大小计算**:总分区大小不应超过 ESP32-S3 闪存容量(通常 4MB/8MB/16MB) > 参考:ESP-IDF 分区表官方文档[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值