Esp32 芯片 16MB Flash 的分区表问题
前言
Esp32这块芯片真的好久都没有用了,原因是Flash真的太小了,Esp32最大支持Flash内存大小是16MB(因为设计的时候用的是24Bit的地址),某宝上常见的Esp8266常见的为4MB,16MB的ESP32卖的价格算起来还不如买个pi,4MB的Flash小到真的很操蛋。就比如你调用了几个依赖库,这4MB的大小很快就用完了。当然你也可以使用Web + OTA,但是方案会有个
近期有人拿了一块esp32的衍生物给我做研究:
因为这个Esp32芯片的Flash有16MB,但 Arduino IDE 1.8.13 里 Tools 下的
可以看到都是4MB的分区大小。
使用esptool检查总共的Flash大小
有些某宝商家故意会误导你,会把
为了避免这种尴尬的情况,所以开始之前要使用esptool来检查这块芯片到底有没有16MB的Flash。
可以先使用下
这里以ESP32 标准的4MB作为example:
$ python -m esptool --port COM3 flash_id esptool.py v3.0 Serial port COM4 Connecting.... Detecting chip type... ESP32 Chip is ESP32-D0WDQ6 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz MAC: 7c:9e:bd:ed:09:04 Uploading stub... Running stub... Stub running... Manufacturer: d8 Device: 4016Detected flash size : 4MB Hard resetting via RTS pin...
Detected flash size 这一行就是你实际的Flash大小了。
制作分区表
正因为工具没有16MB的分区表,那也只能够通过手动去创建16MB Flash的分区表了。这里可以参考下ESP32的分区表格式,然后根据你的实际情况来分区。
我希望我的代码能够在OTA区域尽量大,这样可以有更多的空间来放编译后的文件,由于我没有使用spiffs和FATFS,就把原本是spiffs的空间腾出来给OTA,以至于OTA区域最大化来放我的代码。接下来就是手动配置分区,我在这里设置了一个叫 mane_16.csv 的文件,放到了分区表集里。
# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x7F0000, app1, app, ota_1, 0x800000,0x7F0000,
注意:由于Esp32这块芯片的OTA是以0x10000来对齐的,app0和app1也要对称,算起来就整个Flash就有一块用不到的分区在 Offset:0xFF0000 Size:0x10000
OTA requires configuring the Partition Table of the device with at least two "OTA app slot" partitions (ie ota_0 and ota_1) and an "OTA Data Partition". [Source]
切记:如果你使用了OTA分区作为应用程序启动的话,一定要加上otadata,否则会出现很严重的bug,比如bootloader不知道要启动OTA下的哪个app分区。
如果你懒得计算的话,ESP32有内置的 python 脚本 gen_esp32part.py,可以帮您自动计算Offset,可以参考下这里来了解如何使用。
加入到boards.txt
然后在boards.txt定义下PartitionScheme属性:
ttgo-t1.menu.PartitionScheme.mane=Mane 16MB OTA ttgo-t1.menu.PartitionScheme.mane.build.partitions=mane_16 ttgo-t1.menu.PartitionScheme.mane.upload.maximum_size=8323072
值得注意的是maximum_size应该填上面一个OTA的App区域的大小,然后尝试Upload到Esp32。
输出:
Sketch uses 756986 bytes (9%) of program storage space. Maximum is8323072 bytes. Global variables use 40304 bytes (12%) of dynamic memory, leaving 287376 bytes for local variables. Maximum is 327680 bytes.
当然,并不是说修改了分区表就一定完美的,测试的时候还看程序有没有一些未知的bug出现。
参考
- SPI Memory selection
- Partition Tables
- Partition Schemes in the Arduino IDE
- 玩转ESP32(3):partition table使用
禁止转载,可以引用连接。
太强惹,这就是Mane大佬吗
ReplyDeletePT才是大佬哈哈哈
Delete