esp32 同时打开蓝牙,wifi和ota后程序过大导致无法启动
原创文章,转发请注明链接和作者。(而且作者很懒,没有检查错别字)
序言
esp32如果使同时使用了蓝牙模块、wifi模块和ota的话很有可能会导致程序过大(超过1M),系统无法启动的情况。这里提供一种通过修改分区表扩大程序储存空间的方法来避免这一问题。这一解决方法同样只用于因为其他问题导致的程序过大的情况。
现象
上电后esp32会屏幕重启,如果此时接通串口0观察到打印出来的内容。如果开启了日志则会如图1,否则会如图2
图1
图2
分区表
简单的来说,分区表就是对Flash进行划分,不同区域存放不同的东西。如下面一个分区表文件对应的是图3的划分。通过对比文件和图3,很容易理解分区表。每一行对应的内容顺序分别是Name, Type, SubType, Offset,Size。如果Offset没有填写则默认在上一个分区的末尾添加。在esp-idf/components/partition_table有多个分区表文件供参考。
# Name, Type, SubType, Offset, Size
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, , 0x4000,
otadata, data, ota, , 0x2000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 1M,
coredump, data, coredump, , 64K,
ota_0, app, ota_0, , 1M,
ota_1, app, ota_1, , 1M,
图3
来自官方的分区表说明:
每片 ESP32 的 flash 可以包含多个应用程序,以及多种不同类型的数据(例如校准数据、文件系统数据、参数存储器数据等)。因此,引入分区表的概念。
具体来说,ESP32 在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。该分区表的长度为 0xC00 字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了 安全启动 功能,则该分区表后还会保存签名信息。
分区表中的每个条目都包括以下几个部分:Name(标签)、Type(app、data 等)、SubType 以及在 flash 中的偏移量(分区的加载地址)。
具体内容参见:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/partition-tables.html
解决
造成这一现象的原因是程序超出了flash中预先分配的程序存储空间(1M),通过修改分区表可以解决。步骤如下:
1.建立自己的分区表.CSV文件
2.make menuconfig 菜单中 Partition Table-->Partition Table选择Custom partition table CSV,Custom partition CSV file中指定CSV文件地址。
这里提供一个我的分区表,程序存储空间应该是0x10000的整数倍:
# Name, Type, SubType, Offset, Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, , 0x4000,
otadata, data, ota, , 0x2000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 0x140000,
ota_0, app, ota_0, , 0x140000,
ota_1, app, ota_1, , 0x140000,
需要注意的是:
1、分配分区表的时候空间一定要是4k的整数倍也就是:存储空间%4096=0。这是因为flash的一个区块是4k。
2、ota分区(ota_0,ota_1)的空间最好和原厂程序(factory)相同