前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【玩转ESP32】10、创建用户分区表,数据读写存储

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

作者头像
ManInRoad
发布2021-07-01 15:27:20
2.9K0
发布2021-07-01 15:27:20
举报
文章被收录于专栏:物联网思考物联网思考

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文件中新建分区

代码语言:javascript
复制
# 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、寻找分区
代码语言:javascript
复制
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、擦除分区
代码语言:javascript
复制
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、写数据
代码语言:javascript
复制
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、读数据
代码语言:javascript
复制
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"头文件

代码语言:javascript
复制
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对齐。

————————END————————

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、选择使用自定义分区表
  • 2、在工程目录下新建partitions.csv文件
  • 3、在partitions.csv文件中新建分区
  • 4、分区表操作API
    • 4.1、寻找分区
      • 4.2、擦除分区
        • 4.3、写数据
          • 4.4、读数据
          • 4、代码操作
          • 5、现象
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档