amobbs.com 阿莫电子技术论坛
标题:
《DNESP32S3使用指南-IDF版_V1.6》第七章 分区表
[打印本页]
作者:
正点原子
时间:
2024-7-15 11:18
标题:
《DNESP32S3使用指南-IDF版_V1.6》第七章 分区表
本帖最后由 正点原子 于 2024-7-17 09:49 编辑
()
上传
点击文件名下载附件
1)实验平台:正点原子ESP32S3开发板
2)购买链接:
https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:
http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:
https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:
https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
()
上传
点击文件名下载附件
()
上传
点击文件名下载附件
第七章 分区表
分区表,主要是用来对ESP32外挂的SPI FLASH进行区域划分的一个表格,通过一个表格,可以根据多个不同的功能,将SPI Flash划分为不同的区域,方便开发者存储数据。本章,作者带大家来了解一下ESP32分区表的妙用。
本章将分为如下几个小节:
7.1 分区表概述
7.2 分区表API函数
7.1 分区表概述
一、分区表简介
ESP32分区表在ESP32的flash存储管理中扮演着至关重要的角色。其主要意义体现在以下几个方面:
1,存储空间优化:通过将flash划分为不同的区域,每个区域根据其功能进行定义,可以更有效地利用存储空间。开发者可以根据实际需求为不同的应用或数据分配适当的存储空间,确保资源得到最大化利用。
2,数据管理和维护:每个分区都有其特定的作用,比如存储应用程序、文件系统数据、校准数据等。这种分区的设置使得数据的管理和维护变得更加方便。当需要对特定数据进行更新或修复时,只需关注相关的分区,而无需对整个flash进行操作。
3,应用程序更新和回滚:ESP32支持在线升级(OTA)功能,这意味着应用程序可以在运行时进行更新。通过分区表,可以设置一个或多个用于OTA的分区,使得新版本的应用程序可以安全地下载并存储在flash中,然后在需要时切换到新版本。同时,如果新版本存在问题,还可以轻松回滚到旧版本,确保系统的稳定性。
4,灵活性:分区表可以根据用户的需求进行自定义。这意味着开发者可以根据其项目的特定需求来定义分区的数量、大小和功能。这种灵活性使得ESP32能够适应各种不同的应用场景。
在ESP32中,分区表固定长度为0xc000字节,也就是说一个分区表只能创建95条子分区(条目),并且MD5校验位和附加在分区表之后,用于在运行时验证分区表的完整性。
二、 分区表格式
ESP32的分区表主要有两种格式,一种是.csv格式,它方便开发人员进行更改和设置各个子分区的偏移与空间大小;另一种则是用于烧录设备的.bin文件格式。在系统编译时,系统会将.csv文件转化为.bin文件格式的分区表。下面展示了基础例程的分区表文件的内容。
()
上传
点击文件名下载附件
图7.1.1 基础例程的分区表文件
上图中展示了ESP32的多个子分区及其功能。其中,nvs子分区是专为开发者设计的非易失性存储(NVS)设备区域;phy_init子分区用于存放PHY初始化数据,确保每个设备都能单独配置其PHY;factory子分区则专门用于存储应用程序区域;vfs子分区作为虚拟文件系统的存储区域;而storage子分区则是自定义的SPIFFS文件系统区域。这些子分区共同构成了ESP32的分区结构,满足了不同功能的需求。
三、分区表条目结构
从上图中可以看到,每一个子分区都由以下几个部分组成:
1,name:子分区名称。该字段对 ESP32-S3 并不是特别重要。
2,Type:子分区的存储类型。设置子分区的存储格式,app (0x00) 和 data (0x01)。
3,SubType:进一步描述或分类分区表的条目。如果这个子分区Type为app,则SubType只能设置factory、ota_0、ota_15和test;如果这个子分区Type为data,则SubType只能设置ota、phy、nvs和nvs_keys。
4,Offset:偏移地址。编译地址必须是4KB的倍数
5,Size:大小。子分区的大小
6,Flags:标志位。一般不设置该字段。
四、分区表的类型
分区表的类型具有四种,如下表所示:
()
上传
点击文件名下载附件
表7.1.1 分区表的类型
根据上述内容,如果不打算使用OTA升级功能,可以根据项目的大小选择第一种或第二种分区类型。而想要使用OTA升级功能时,应选择第三种分区类型。作者推荐采用最后一种分区类型,因为它允许自定义分区表,能更精确地满足项目工程的需求,从而实现完美的契合。
从上述内容可以了解到,分区表是对flash闪存进行区域划分,以便根据不同的功能需求将flash划分为不同的区域。这些区域可以包括应用、数据等不同类型,例如应用可以进一步细分为Factory程序、OTA程序等,数据则可以包括校准数据、文件系统数据、参数存储数据等。
每个分区都有其特定的作用,开发者可以根据自己的需求进行配置以及修改。这样的设计使得开发者能够更方便地管理和使用flash空间,同时也有助于提高系统的稳定性和安全性。
7.2 分区表API函数
esp_partition 组件是 ESP-IDF中用于管理 ESP32 及其系列芯片上 flash 分区的一个关键组件。它提供了一组高层次的 API 函数,允许开发者方便地访问和操作定义在分区表中的各个分区。这些高层次的 API 函数为开发者提供了简洁和易用的接口,以进行诸如读取、写入、擦除分区内容等操作。这些函数可在components/esp_partition/include/esp_partition.h路径下找到这些分区表API函数。
1,esp_partition_find函数
该函数查找子分区,该函数原型如下所示:
const esp_partition_t *esp_partition_find_first(esp_partition_type_t type,
esp_partition_subtype_t subtype,
const char *label)
复制代码
该函数的形参描述如下表所示:
()
上传
点击文件名下载附件
表7.2.1 esp_partition_find函数函数描述
该函数返回值如下:
NULL:未找到子分区。esp_partition_t指针:返回子分区。
2,esp_partition_read函数
该函数用于读取子分区的某个地址的数据,该函数原型如下所示:
esp_err_t esp_partition_read( const esp_partition_t* partition,
size_t src_offset,
void* dst, size_t size)
复制代码
该函数的形参描述如下表所示:
()
上传
点击文件名下载附件
表7.2.2 esp_partition_read函数函数描述
该函数返回值如下:
ESP_OK:读取成功。其他:失败。
3,esp_partition_write函数
该函数用于写入子分区的某个地址的数据,该函数原型如下所示:
esp_err_t esp_partition_write( const esp_partition_t* partition,
size_t dst_offset,
void* src, size_t size)
复制代码
该函数的形参描述如下表所示:
()
上传
点击文件名下载附件
表7.2.3 esp_partition_write函数函数描述
该函数返回值如下:
ESP_OK:读取成功。其他:失败。
4,esp_partition_range函数
该函数用于擦除子分区的某个地址的数据,该函数原型如下所示:
esp_err_t esp_partition_erase_range(const esp_partition_t *partition,
size_t offset, size_t size)
复制代码
该函数的形参描述如下表所示:
()
上传
点击文件名下载附件
表7.2.4 esp_partition_range函数函数描述
该函数返回值如下:
ESP_OK:读取成功。其他:失败。
上述列举的函数是访问和操作分区表时较为常用的API函数。若需进一步了解或学习其他剩余的分区表API函数,可查阅esp_partition.h头文件。
注意:上述函数的使用方法,可打开28_chinese_display实验下的fonts.c文件,我们使用这些函数把GBK字库更新至storage分区表,然后完成了汉字实验。
欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/)
Powered by Discuz! X3.4