ESP32 IDF 分区表
在esp32的一些项目里面我们都会看到这样一个文件:partions.csv
点进去一看,发现里面装着的很多个键值对,这个文件叫做分区表。
在 ESP32(及其他嵌入式设备)中,分区表(Partition Table)是一份存储在 Flash 中的 “索引文件”,用于定义 Flash 存储空间的 “区域划分规则”—— 就像电脑硬盘的分区(C 盘、D 盘、E 盘),每个分区有明确的用途、大小和地址范围,避免不同类型的数据(如程序固件、配置参数、用户文件)互相干扰。
简介
一、分区表的核心作用:给 Flash 做 “规划图”
ESP32 的所有数据(程序代码、WiFi 配置、用户参数等)都存在外部 SPI Flash 中,但 Flash 本身是 “连续的字节空间”,如果不做划分,程序无法区分 “哪里存固件”“哪里存配置”,可能导致写入配置时覆盖程序代码,或读取参数时读到无效数据。
分区表的作用就是解决这个问题:
- 它用 “表格” 形式记录了 Flash 中每个 “分区” 的名称、用途(类型)、具体地址范围和大小;
- 设备上电后,Bootloader(启动程序)和应用程序会先读取分区表,再根据表中的规则访问对应区域(比如 “从 factory 分区加载程序”“往 nvs 分区写配置”)。
二、分区表的组成:每个分区包含 5 个关键信息
一份完整的分区表由多个 “分区项” 组成,每个分区项描述一个独立的 Flash 区域。以 ESP32 常用的 partitions.csv
为例,每个分区的格式为:
# 名称, 类型, 子类型, 起始地址, 大小, 标志
nvs, data, nvs, 0x9000, 0x6000, # NVS配置分区
phy_init, data, phy, 0xF000, 0x1000, # PHY初始化数据分区
factory, app, factory, 0x10000, 0x100000,# 应用程序分区
- 名称(Name):分区的标识(如 “nvs”“factory”),方便代码中引用;
- 类型(Type):分区的大类,主要分两种:
app
:存储应用程序固件(如 factory 分区、ota 分区);data
:存储数据(如 NVS 配置、PHY 校准数据、SPIFFS 文件系统);
- 子类型(SubType):细分类型,明确具体用途:
nvs
(data 子类型):用于 NVS 存储键值对;phy
(data 子类型):存储 WiFi / 蓝牙 物理层校准数据;factory
(app 子类型):存储默认的出厂固件;
- 起始地址(Offset):分区在 Flash 中的起始位置(必须 4KB 对齐);
- 大小(Size):分区的容量(如 0x6000 表示 24KB)。
三、分区表的存储位置:固定在 Flash 的 0x8000 地址
分区表本身也是一段数据,必须存储在 Flash 的固定位置,才能让设备启动时找到它。ESP32 约定:
- 分区表存储在 Flash 的
0x8000 ~ 0x8FFF
地址(共 4KB); - 设备上电后,第一步是 Bootloader(启动程序)从
0x0
地址加载自身,然后立即读取0x8000
处的分区表,再根据分区表找到应用程序分区(如 factory),加载程序运行。
四、分区域表的参数设置
分区表的参数其实并不是可以随意设置的,那分区表的组成成员来说,factory部分是缺一不可的,因为当前运行的程序都储存在factory部分,nvs和phy_init(需要网络组件必须选)是可选的。
需要注意的是起始地址和偏移地址,起始地址在官网分区表 - ESP32 - — ESP-IDF 编程指南 release-v5.5 文档 的这个位置有写
就是说分区表的起始地址在0x8000,结束地址在0x8ffff,分区表的偏移大小基本在0x1000的整数倍
接着是其他分区的分布规律:
1.所有分区的地址范围(起始地址 + 大小)互不重叠;
3.数据类型分区(如 NVS)起始地址是 4KB(0x1000)的整数倍;
4.应用类型分区(如 factory)起始地址是 64KB(0x10000)的整数倍;
5.所有分区都在 Flash 总容量范围内(如 16MB Flash 地址上限为 0xFFFFFF
)。
五、分区表有自动设置还有自定义分区表
一般推荐自定义分区表
创建流程如下:
1.进入menuconfig并在搜索栏中填入cus
2.在partition table选择custom partition table csv,然后在custom partition csv file输入分区表的名称
3.在工程目录新建一个同你在custom partition csv file输入分区表的名称相同的.csv文件
更多问题
1.像是嵌入式的.pem格式的ca证书使用EMBED_TXTFILES存放在分区表的哪里?
答:EMBED_TXTFILES一般存储在factory和应用程序一起储存,存放在只读数据段中
六、参考文章
ESP32的分区表(partitions)及如何配置_esp32分区-CSDN博客
分区表 - ESP32 - — ESP-IDF 编程指南 v5.5.1 文档