一、分区表介绍
每片 ESP32-S3 的 flash 可以包含多个应用程序,以及多种不同类型的数据(例如校准数据、文件系统数据、参数存储数据等)。因此,在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。
分区表中的每个条目都包括以下几个部分:Name(标签)、Type(app、data 等)、SubType 以及在 flash 中的偏移量(分区的加载地址)。
demo分区表路径:
打开“partitions_singleapp.csv” 如下图所示:
类型:
Name:分区名称
Type:类型,app、data、0x40-0xFE(自定义)
SubType:子类型,Tpye=app,可选factory、ota_0-ota15
Offset:偏移地址,分区在flash中的起始地址
Flags:可选encrypted(加密)和readonly(只读)
指定为app的类型,会在flags中强制加密成encrypted
分区表中如果Offset为空,IDF系统将会自动计算起始地址。
详细参考 官网介绍
二、分区表配置
1、建立分区表,使用idy.py menuconfig进入如下地址,选择目标分区配置。
2、分区表中的信息如下,在分区表中添加一个“user”分区,类型为“0x40”,子类型定义为“0x01”,大小“0x1000”,如下图所示:
3、配置分区表文件名称,如下图所示“partitions.csv”
4、程序编译过程中可以看到如下信息,说明配置表已完成配置。其中显示的user项的配置
三、向用户分区中进行读写操作
按照如上配置完毕后,编译如下程序。
程序中执行了2个操作,一个是想目标类型(USER_PARTITION_TYPE)首地址写入字符串“this is flash write test!”。
然后申请一个字符串空间,将写入的文件读出到目标空间中。
#include <stdio.h>
#include <esp_log.h>
#include <esp_partition.h>
#include "string.h"
static const char*TAG = "partition";
/*定义分区类型*/
#define USER_PARTITION_TYPE 0x40
/*定义分许子类型*/
#define USER_PARTITION_SUBTYPE 0x01
/*定义目标分区指针*/
static const esp_partition_t* partition_ptr = NULL;
void app_main(void)
{
/*获取目标分区指针*/
partition_ptr = esp_partition_find_first(USER_PARTITION_TYPE, USER_PARTITION_SUBTYPE, NULL);
if(partition_ptr == NULL)
{
ESP_LOGE(TAG,"CAN'T FIND partition");
return;
}
/*1-擦除操作*/
esp_partition_erase_range(partition_ptr,0,0x1000);
/*2-准备目标字符串*/
const char *test_str = "this is flash write test!";
/*3-写入目标地址*/
esp_partition_write(partition_ptr,0,test_str,strlen(test_str));
/*4-读出目标地址*/
char read_buf[64];
memset(read_buf,0,sizeof(read_buf));
esp_partition_read(partition_ptr,0,read_buf,strlen(test_str));
ESP_LOGI(TAG, "read partition data:%s" ,read_buf);
return;
}
运行结果如下图所示。