【玩转ESP32】10、创建用户分区表,数据读写存储

系列文章:

【玩转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对齐

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值