系列文章:
【玩转ESP32】1、开发环境搭建
【玩转ESP32】2、开发参考资料
【玩转ESP32】3、点亮LED,Blink,blink,blink
【玩转ESP32】4、ESP32驱动DHT11
【玩转ESP32】5、i2c-tools访问i2c设备
【玩转ESP32】6、驱动i2c设备—0.96 OLED
【玩转ESP32】7、ESP32连接wifi
【玩转ESP32】8、ESP32 Guru MeditationError报错分析
【玩转ESP32】9、ESP32 作为TCP客户端连接服务器(非阻塞接收)
1、选择使用自定义分区表
在终端中输入 idf.py menuconfig
,进入menuconfig界面,依次选择Partition Table
—>选中Custom partition table csv
—>选择Custom partition table Csv file
—>输入分区表的名称,例如使用partitions.csv
,然后选中Generate an MD5 checksum for the partition table
,最后保存、退出。
2、在工程目录下新建partitions.csv文件
可以从components\partition_table
目录下拷贝一个模板出来,命名为partitions.csv
,注意这里文件名要和menuconfg
里面输入的保持一致。
3、在partitions.csv文件中新建分区
# Name, Type, SubType, Offset, Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 2M,
user_config, 0x40, 0, , 64K,
其中user_config分区就是新增的用户分区。
关于各个字段的含义,引用官方的文档,说明如下:
Name:表示分区表的名称,最长不能超过16个字符;
Type:字段可以指定为 app (0) 或者 data (1),也可以直接使用数字0- 254(或者十六进制 0x00-0xFE);注意,0x00-0x3F 不得使用(预留给 esp-idf 的核心功能);
SubType:子类型,与Type类型有关;Type 定义为 app 时,SubType 字段可以指定为 factory (0),ota_0 (0x10) … ota_15 (0x1F) 或者 test (0x20);当 Type 定义为 data 时,SubType 字段可以指定为 ota(0),phy (1),nvs (2) 或者 nvs_keys (4);
Offset:偏移地址,若分区为app类型,则偏移地址必须64k对齐;
Size:长度; Flags:当前仅支持 encrypted标记,表示启用 Flash Encryption 功能,则该分区将会被加密。
4、分区表操作API
4.1、寻找分区
const esp_partition_t* esp_partition_find_first(esp_partition_type_t type, esp_partition_subtype_t subtype, const char* label)
type
:分区表的类型;
subtype
:子类型;
label
:名称;
esp_partition_t
:返回值是分区表的指针。
4.2、擦除分区
esp_err_t esp_partition_erase_range(const esp_partition_t* partition,size_t offset, size_t size)
partition
:分区表指针;
offset
:偏移地址,必须4k对齐
size
:大小,必须4k对齐;
esp_err_t
:操作结果,ESP_OK
表示成功。
4.3、写数据
esp_err_t esp_partition_write(const esp_partition_t* partition,size_t dst_offset, const void* src, size_t size);
partition
:分区表指针;
dst_offset
:偏移地址;
src
:写入的数据;
size
:大小;
esp_err_t
:操作结果,ESP_OK
表示成功。
4.4、读数据
esp_err_t esp_partition_read(const esp_partition_t* partition,
size_t src_offset, void* dst, size_t size);
partition
:分区表指针;
src_offset
:偏移地址;
dst
:读取的数据缓冲区;
size
:大小;
esp_err_t
:操作结果,ESP_OK
表示成功。
4、代码操作
需要包含#include "esp_partition.h"
头文件
void test_partiton(void)
{
uint8_t write_partition_data[16],read_partition_data[20];
esp_partition_t* res=esp_partition_find_first(0x40,0,NULL);
if(res==NULL)
{
printf("no partition is found\r\n");
return;
}
else
{
printf("partiton info:\r\n name:%s\r\n size:%x\r\n start address:%x\r\n",
res->label,res->size,res->address);
}
for(uint8_t i=0;i<16;i++)
{
write_partition_data[i]=i;
}
if(esp_partition_erase_range(res,0,4096)!=ESP_OK)
{
printf("partition erase fail\r\n");
return ;
}
if(esp_partition_write(res,0, write_partition_data, sizeof(write_partition_data))!=ESP_OK)
{
printf("partition write fail\r\n");
return ;
}
else
{
printf("partition write success\r\n");
}
if(esp_partition_read(res,0, read_partition_data, 16)!=ESP_OK)
{
printf("partition read fail\r\n");
}
else
{
printf("read partition data from :");
for(uint8_t i=0;i<16;i++)
printf("%x ",read_partition_data[i]);
printf("\r\n");
}
}
5、现象
6、总结
1、配置使用用户分区表;
2、创建分区表,新增分区;
3、读写操作,写操作之前要先擦除,擦除地址要4k对齐。