Esp32 芯片 16MB Flash 的分区表问题

前言

Esp32这块芯片真的好久都没有用了,原因是Flash真的太小了,Esp32最大支持Flash内存大小是16MB(因为设计的时候用的是24Bit的地址),某宝上常见的Esp8266常见的为4MB,16MB的ESP32卖的价格算起来还不如买个pi,4MB的Flash小到真的很操蛋。就比如你调用了几个依赖库,这4MB的大小很快就用完了。当然你也可以使用Web + OTA,但是方案会有个很大的缺点

近期有人拿了一块esp32的衍生物给我做研究:LILYGO 家的 TTGO T-Display (Flash 16MB)

因为这个Esp32芯片的Flash有16MB,但 Arduino IDE 1.8.13 里 Tools 下的 Partition Scheme还停留在4MB Flash的时代除非你选了ESP32 Dev Module,如果只选择TTGO T1的话,就算是16MB的Flash,经过了Arduino的IDE编译出来的程序Upload上去,用的还是4MB的分区表,至于剩下的12MB内存也就只能空在那里了。所以,回过头来还是没有真正的解决了问题。虽然Flash Size 已经选了 16MB(128Mb),但是分区表依然没有扩大。

可以看到都是4MB的分区大小。

使用esptool检查总共的Flash大小 

有些某宝商家故意会误导你,会把16Mb的b写成的小写的b,然后拿出来卖,让你以为是真的是16MB。

为了避免这种尴尬的情况,所以开始之前要使用esptool来检查这块芯片到底有没有16MB的Flash。

可以先使用下flash_idchip_id参数观察一下,如果不妙的话去可以去售后问下或者退款。

这里以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: 4016
Detected 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 is 8323072 bytes.
Global variables use 40304 bytes (12%) of dynamic memory, leaving 287376 bytes for local variables. Maximum is 327680 bytes.

当然,并不是说修改了分区表就一定完美的,测试的时候还看程序有没有一些未知的bug出现。

参考

禁止转载,可以引用连接。

Comments

Post a Comment