【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 中的所有內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章