ESP32-IDF 分区表

ESP32之 ESP-IDF 教学(十三)—— 分区表 本专栏讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容!本文介绍了和为分区表以及如何使用分区表,为之后的学习提理论基础。 阅读详情
AI摘要

本文围绕ESP32分区展开,先介绍了配置结构体、常用API和枚举类型等基本信息;接着阐述ESP32分区表的格式、内置分区表、生成二进制分区表、MD5校验和及烧写方法;最后通过基本读写流程和遍历操作两个实例,展示了分区的实际操作。


一、基本介绍

使用时要添加头文件 #include "esp_partition.h"。

1、配置结构体

1.1 esp_partition_t

typedef struct {
   
   
    esp_flash_t* flash_chip;            /*!< SPI flash chip on which the partition resides */
    esp_partition_type_t type;          /*!< partition type (app/data) */
    esp_partition_subtype_t subtype;    /*!< partition subtype */
    uint32_t address;                   /*!< starting address of the partition in flash */
    uint32_t size;                      /*!< size of the partition, in bytes */
    uint32_t erase_size;                /*!< size the erase operation should be aligned to */
    char label[17];                     /*!< partition label, zero-terminated ASCII string */
    bool encrypted;                     /*!< flag is set to true if partition is encrypted */
    bool readonly;                      /*!< flag is set to true if partition is read-only */
} esp_partition_t;

该结构体存储的是分区信息,使用的是 API 的格式,而不是 Flash 中的格式,该格式是 esp_partition_info_t。

  • flash_chip:分区所在的 SPI 闪存芯片
  • type:分区类型 (app/data)
  • subtype:partition subtype partition 子类型
  • address:Flash 中分区的起始地址
  • size:分区的大小(以字节为单位)
  • erase_size:擦除操作所应对齐的大小
  • label:分区标签,以零结尾的 ASCII 字符串
  • encrypted:如果分区已加密,则 flag 设置为 true
  • readonly:如果 partition 是只读的,则 flag 设置为 true

1.2 esp_partition_iterator_t

用于遍历分区表的迭代器:

typedef struct esp_partition_iterator_opaque_* esp_partition_iterator_t;

...

typedef struct esp_partition_iterator_opaque_ {
   
   
    esp_partition_type_t type;                      // requested type
    esp_partition_subtype_t subtype;                // requested subtype
    const char *label;                              // requested label (can be NULL)
    partition_list_item_t *next_item;               // next item to iterate to
    esp_partition_t *info;                          // pointer to info (it is redundant, but makes code more readable)
} esp_partition_iterator_opaque_t;

2、常用 API

2.1 esp_partition_find

esp_partition_iterator_t esp_partition_find(esp_partition_type_t type, esp_partition_subtype_t subtype, const char *label)
  • 参数
    • type:分区类型,参考 esp_partition_type_t
    • subtype:分区子类型,参考 esp_partition_subtype_t
    • label:可选)分区标签。如果查找具有特定名称的分区,请设置此值。否则传递 NULL。
  • 作用
    • 根据一个或多个参数查找分区。
  • 返回值
    • esp_partition_iterator_t :可用于枚举找到的所有分区的迭代器;如果未找到分区,则为 NULL。通过此函数获取的 Iterator 在不再使用时必须使用 esp_partition_iterator_release 释放。

2.2 esp_partition_find_first

const esp_partition_t *esp_partition_find_first(esp_partition_type_t type, esp_partition_subtype_t subtype, const char *label)
  • 参数
    • type:分区类型,参考 esp_partition_type_t
    • subtype:分区子类型,参考 esp_partition_subtype_t
    • label:可选)分区标签。如果查找具有特定名称的分区,请设置此值。否则传递 NULL。
  • 作用
    • 根据一个或多个参数查找第一个分区。
  • 返回值
    • esp_partition_iterator_t :指向 esp_partition_t 结构的指针,如果未找到分区,则为 NULL。此指针在应用程序的生存期内有效。

2.3 esp_partition_get

const esp_partition_t *esp_partition_get(esp_partition_iterator_t iterator)
  • 参数
    • iterator:通过 esp_partition_find 获取的迭代器。必须为非 NULL。
  • 作用
    • 获取给定分区 esp_partition_t 结构。
  • 返回值
    • esp_partition_t :指向 esp_partition_t 结构的指针。此指针在应用程序的生存期内有效。

2.4 esp_partition_next

esp_partition_iterator_t esp_partition_next(esp_partition_iterator_t iterator)
  • 参数
    • iterator:通过 esp_partition_find 获取的迭代器。必须为非 NULL。
  • 作用
    • 将 partition iterator 移动到找到的下一个分区。
  • 返回值
    • esp_partition_t :如果未找到分区,则为 NULL,否则为有效的 esp_partition_iterator_t。

2.5 esp_partition_iterator_release

void esp_partition_iterator_release(esp_partition_iterator_t iterator)
  • 参数
    • iterator:使用 esp_partition_find 获取的迭代器。迭代器允许为 NULL,因此在调用此函数之前无需检查其值。
  • 作用
    • 释放 partition 迭代器。

2.6 esp_partition_verify

const esp_partition_t *esp_partition_verify(const esp_partition_t *partition)
  • 参数
    • partition:指向要验证的分区数据的指针。必须为非 NULL。此结构的所有字段必须与 flash 中的分区表条目匹配,此函数才能返回成功匹配。
  • 作用
    • 验证分区数据。
  • 返回值
    • 如果未找到分区,则返回 NULL。
    • 如果找到,则返回指向 flash 中 esp_partition_t 结构的指针。此指针在应用程序的生存期内始终有效。

2.7 esp_partition_read

esp_err_t esp_partition_read(const esp_partition_t *partition, size_t src_offset, void *dst, size_t size)
  • 参数
    • partition:指向使用 esp_partition_find_first 或 esp_partition_get 获取的分区结构的指针。必须为非 NULL。
    • src_offset:要读取的数据的地址,相对于分区的开头。
    • dst:向应存储数据的缓冲区的指针。指针必须为非 NULL,并且缓冲区必须至少为 ‘size’ 字节长。
    • size:要读取的数据的大小,以字节为单位。
  • 作用
    • 从分区中读取数据。
  • 返回值
    • ESP_OK,如果数据读取成功
    • ESP_ERR_INVALID_ARG:参数错误,比如 src_offset 超过分区大小
    • ESP_ERR_INVALID_SIZE:如果读取将超出分区的边界

2.8 esp_partition_write

esp_err_t esp_partition_write(const esp_partition_t *partition, size_t dst_offset, const void *src, size_t size)
  • 参数
    • partition:指向使用 esp_partition_find_first 或 esp_partition_get 获取的分区结构的指针。必须为非 NULL。
    • dst_offset:相对于分区开头应写入数据的地址。
    • src:指向源缓冲区的指针。指针必须为非 NULL,并且缓冲区必须至少为 ‘size’ 字节长。
    • size:要写入的数据的大小,以字节为单位。
  • 作用
    • 从将数据写入分区。
  • 返回值
    • ESP_OK,如果数据读取成功
    • ESP_ERR_INVALID_ARG:参数错误,比如 dst_offset 超过分区大小
    • ESP_ERR_INVALID_SIZE:如果 write 会超出分区的边界
    • ESP_ERR_NOT_ALLOWED:如果分区是只读的

在将数据写入 flash 之前,需要擦除 flash 的相应区域。这可以使用 esp_partition_erase_range 函数来完成。

2.9 esp_partition_erase_range

esp_err_t esp_partition_erase_range(const esp_partition_t *partition, size_t offset, size_t size)
  • 参数
    • partition:指向使用 esp_partition_find_first 或 esp_partition_get 获取的分区结构的指针。必须为非 NULL。
    • offset:从擦除操作应开始的分区开头开始
ESP32分区表图解 在这篇博文ESP8266 RTOS 之 esp-aliyun 例程Flash分区中,我以2M的ESP8266为例说明了分区表的空间划分。 本文则以ESP32 4M Flash为例,讲一讲如何自定义分区。 首先下图是一个标准的分区表: 关于offset设置。make menuconfig - Partition Table设置里,有一个offset设置,默认为0x8000,即Patition Table的分区偏移地址。Patition Table的分区长度一般为0x1000。修改这个值,会影响到后面所有分区 阅读详情

相关推荐

【ESP32】打造全网最强esp-idf基础教程——12.ESP32中的分区表

其实这里并非没有指定地址,在esp-idf中,还默认有个bootloader程序,这个程序在分区表中的地址是0x1000,另外还有分区表本身也需要存储,分区表在flash中存储的地址是0x8000,大小是0x1000,也就是除开bootloader和分区表本身,可用的地址是从0x9000开始的,也就是说,esp-idf中nvs分区其实地址是从0x9000开始存储,然后Size=0x6000。这个分区的大小需要设定为0x2000。擦除一段内容,第一个参数是分区指针,第二个参数是偏移地址,第三个参数是大小。

Hello_kitty_ling的博客 2870

ESP32-IDF 自定义分区表实战:从配置到数据读写

本文详细介绍了ESP32-IDF自定义分区表的实战方法,从配置到数据读写。通过解析partitions.csv文件结构,讲解如何灵活划分Flash空间以满足复杂项目需求,如OTA升级、文件系统及自定义数据存储。文章重点演示了使用esp_partition API对自定义分区进行查找、擦除、写入和读取操作,并提供了高级技巧与常见避坑指南,帮助开发者从预定义分区表进阶到完全掌控存储布局。

weixin_29174385的博客 291

【ESP32-IDF】04-1 存储-分区表

分区表 文章目录分区表1. esp32 flash结构1.1 flash 物理组成1.2 flash 内部结构1.3 esp32启动过程2. 分区表2.1 分区表的组成2.2 分区表的定义2.2.1 Name字段2.2.2 Type字段2.2.3 SubType字段2.2.4 offset和size2.2.5 flags2.3 系统分区表的查看2.4 分区表的更换2.4.1 使用内置分区表2.4.2 使用自定义的分区表3. 参考资料 1. esp32 flash结构 1.1 flash 物理组成    es

qq_41741344的博客 1万+

ESP32 VSCode ESP-IDF 分区表实战:从零配置到空间优化

本文详细介绍了在VSCode ESP-IDF环境下为ESP32项目配置和优化分区表的实战指南。针对常见的“空间不足”问题,文章从分区表原理入手,逐步讲解如何创建自定义分区表、计算分区地址避免重叠,并对比了无OTA与支持OTA两种经典方案的优劣。通过调整分区大小、混合模式等高级技巧,帮助开发者最大化利用有限的Flash空间,是ESP32开发中管理硬件资源的必备技能。

weixin_29189363的博客 116

【ESP32-IDF】04-2 存储-分区表实战:自定义与优化

本文详细介绍了ESP32-IDF框架下自定义分区表的实战方法与优化策略。针对默认分区表在复杂项目中空间不足的问题,文章深入解析了分区表各字段含义,并通过一个物联网设备实例,手把手指导如何根据实际需求规划Flash空间,设计支持OTA、大容量存储的分区方案,同时提供了高级优化技巧与常见错误排查指南。

weixin_29194817的博客 614

ESP32 IDF开发 驱动篇⑩ 存储NVS高级应用和自定义分区表

在“ESP32 IDF开发 驱动篇⑨ 存储NVS的基本应用”章节我们已经介绍了nvs的介绍和基本操作,并且留下了许多疑问。下面就来对这些疑问一一揭开神秘的面纱。(1)分区表的介绍分区表文件位于: esp-idf\components\partition_table文件下, 该路径下所有的.csv文件都是用来对Flash分区进行配置如下图:无OTA分区:partitions_singleapp.csv、partitions_singleapp_coredump.csv。

lu330274924的博客 2489

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

CAS5和CAS6自定义异常提示消息

CAS自定义异常提示消息

weixin_42949219的博客 978

Ubuntu下NVIDIA驱动安装全攻略:从报错到完美运行nvidia-smi的完整流程

本文提供了在Ubuntu系统中安装NVIDIA驱动的完整解决方案,重点解决因驱动版本冲突、内核模块未加载或Secure Boot安全启动导致的`nvidia-smi`报错问题。通过彻底清理旧驱动、处理Secure Boot、选择兼容版本并正确安装,最终确保驱动完美运行。

weixin_29196891的博客 364

【FPGA】AD9694调试注意事项

基于FPGA的AD9694设计及其注意事项,包括同步的设计注意事项

weixin_41246509的博客 2898

【obj To 3DTiles 进阶实战】 从零配置地理坐标系与扩展属性元数据

本文详细解析了如何将OBJ模型转换为3DTiles格式,重点介绍了地理坐标系配置与属性元数据扩展的实战技巧。通过obj23dtiles工具,开发者可以精准定位模型经纬高坐标,并添加结构化属性表,实现城市规划模型在数字孪生平台的高效应用。

weixin_27215337的博客 367

4、高光图像滤镜显著改善文本图像的光学字符识别

本文介绍了高光图像滤镜在光学字符识别(OCR)中的应用,详细探讨了其技术原理、实现步骤和在多种场景下的效果。通过增强文本图像的边缘和对比度,高光滤镜显著提升了OCR的识别率,尤其适用于扫描文档、手写笔记和低质量图像。实验结果表明,该方法在不同类型的文本图像中均表现出色,并提出了未来优化方向,如深度学习集成和多模态融合,为OCR技术的发展提供了新的可能性。

ooo22的博客 93

2️⃣ Coze创建智能体教学(2025年全新版本)

扣子平台提供强大支持,可将智能体轻松集成至各类社交平台,使智能体得以服务更为庞大的用户群体。当下支持集成的平台如下:​1️⃣豆包:作为聚焦 AI 内容创作的平台,非常适合发布充满创意、娱乐性强的智能体。​2️⃣飞书:适合发布用于办公协作的智能体,助力团队提升工作效率。​3️⃣微信:借助公众号或小程序的形式,能够服务海量微信用户。​4️⃣抖音:适合发布与短视频相关的智能体,为用户提供创意与娱乐服务。​

李同学Lino的博客 4574

红队攻防渗透技术实战流程:云安全之云原生安全:特权模式和挂载模式

红队云攻防实战1. 什么是云 1. 什么是云

HACKONE的博客 571

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: ESP32-IDF 通用定时器 GPTimer
下一篇: ESP32-IDF 非易失存储 NVS
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值