当前位置 博文首页 > freemote的博客:【玩转ESP32】10、创建用户分区表,数据读写存

    freemote的博客:【玩转ESP32】10、创建用户分区表,数据读写存

    作者:[db:作者] 时间:2021-07-05 09:54

    系列文章:

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

    cs