【ESP32】【分区表】

编译 ESP32 工程时,build 成功,但是下载时遇到如下问题:

经大神指点,发现是由于编译的 bootloader.bin 过大:新编译的 bootloader.bin 29K。而默认下载地址为:

0x1000: bootloader.bin
0x8000: partition-table.bin
0x10000: user.bin

计算 0x8000 - 0x1000 = 0x7000 = 7*16^3 = 28672 < 29K=29000。
解决方法:
idf.py menuconfig - > Bootloader config -> Bootloader log verbosity — > No output
重新编译,bootloader.bin 的大小降低至 20K,下载成功。


借此机会,学习下 ESP32 的 分区表

ESP32需要外部搭配一颗 Flash,用以配置、存储用户代码。以官网 ESP32-WROVER-B 模组上使用的 GD25Q32C 为例: 32Mbit/4MB,其扇区结构如下:

总共 1024 个扇区,每个扇区 16^3 = 4096(4KB),故而共 4MB。

注意:写入 Flash 前一定要先擦除(0xFF),才能再写入(0x00);


分区表概述:

partitions_two_ota_coredump 为例,其在 4MB flash 上的分区如下:

每片 ESP32 的 flash 包含了多个应用程序以及各种类型的数据。默认,ESP32 在 flash 的偏移地址 0x8000 处烧写一张分区表,其长度为 0xC00(最多可保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了安全启动功能,则该分区表后还会保存签名信息。

分区表每个条目包含:Name(标签)、Type(app、data等)、SubType 以及在 flash 中的偏移地址、size、Flags:

  • Name 字段: 可以是任何名称,但不能超过 16 个字符(之后的内容会被截断);

  • Type 字段:可指定为 app(0) 或 data(1),也可直接使用数字 0-254(0x00-0xFE)。0x00-0x3F 预留给 esp-idf 的核心功能,不得使用。注意。bootloader 将忽略 app(0) 或 data(1) 以外的其他分区类型;

  • SubType:长 8bit,内容与具体 Type(app 或 data) 有关:

    1> Type为 app 时,SubType 字段可以指定为 factory (0),ota_0 (0x10) … ota_15 (0x1F) 或者 test (0x20)。factory(0)为默认的 app 分区, bootloader 将默认加载该应用程序;
    2> Type为 data 时,SubType 字段可以指定为 ota (0),phy (1),nvs (2) 或者 nvs_keys (4)。ota (0) 即 OTA 数据分区 ,用于存储当前所选的 OTA 应用程序的信息。这个分区的大小需要设定为 0x2000。phy (1) 分区用于存放 PHY 初始化数据,从而保证可以为每个设备单独配置 PHY,而非必须采用固件中的统一 PHY 初始化数据。nvs (2) 是专门给 非易失性存储 (NVS) API 使用的分区。nvs_keys (4) 是 NVS 秘钥分区。

  • Offset 字段:偏移地址紧跟前一个分区开始,若为首个分区,则紧跟分区表开始。app 分区的偏移地址必须要与 0x10000 (64K) 对齐。如果希望允许分区表中的分区采用任意起始偏移量,需要将分区表(CSV 文件)中所有分区的偏移字段都留空。

  • Size 字段:分区的大小,默认以 0x 为前缀的十六进制数,支持 K 或者 M 的倍数(分别代表 1024 和 1024*1024 字节)。

  • Flags 字段:当前仅支持 encrypted 标记。如果 Flags 字段设置为 encrypted,且已启用 Flash Encryption 功能,则该分区将会被加密。app 分区始终会被加密,不管 Flags 字段是否设置。


生成二进制分区表

使用 partition_table/gen_esp32part.py 工具实现 csv 和二进制文件之间的转换:

1> 手动将 csv 文件转换为二进制文件:

$ python gen_esp32part.py input_partitions.csv binary_partitions.bin

2> 手动将二进制文件转换为 csv 文件:

$ python gen_esp32part.py binary_partitions.bin input_partitions.csv

MD5 校验

一些老版本的 bootloader 不支持 MD5 校验。
如果发现 MD5 校验报错: invalid magic number 0xebeb,则可以通过:
1)gen_esp32part.py 的 --disable-md5sum
2)idf.py menuconfig - > Partition Table - > Generate an MD5 checksum for the partition table
关闭 MD5 校验。


分区表的烧写、擦除:

使用 esptool.py 工具烧写分区表:

$ idf.py partition_table-flash

注意:

1)使用 $ idf.py flash 命令会烧写所有内容,包括分区表。
2)分区表的更新并不会擦除之前根据分区表存储的数据,此时,可以使用 $ idf.py erase_flash$ esptool erase_flash 命令来擦除 flash 中的所有内容。

发布了30 篇原创文章 · 获赞 12 · 访问量 8261

猜你喜欢

转载自blog.csdn.net/syjie19900426/article/details/104055412