发布时间:2023-11-05 16:30
使用Vscode+Platformio开发ESP32,因为代码量过大,超过了默认的程序分区大小,所以就需要修改默认的分区表以扩大程序分区。使用Arduino可以很方便修改分区表,但是刚接触Platformio这个插件,且网络上有关介绍资料甚少,所以就动手找了找修改分区表的方法。
找到方法后,添加csv文件并且编译,但是开始不管我怎么改都没效果,后来发现是工程的问题。重新建立工程后再添加、编译csv文件就可以了。
首先在工程路径下建立一个.csv文件,如下。
然后在工程下的platformio.ini文件中添加编译命令board_build.partitions,在后面输入创建的.csv文件名全称,需要带上文件后缀,如下。
然后在创建的.csv文件中填写自定义的分区表。分区表的格式和内容在乐鑫官方的编程指南上写的非常清楚,并且也解释了各个字段对应的功能,同时也列出了好几种格式(末尾有链接)。
首先是最简单的一种,单应用没有OTA功能。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
然后是有带有OTA功能的。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000
otadata, data, ota, 0xd000, 0x2000
phy_init, data, phy, 0xf000, 0x1000
factory, app, factory, 0x10000, 1M
ota_0, app, ota_0, , 1M
ota_1, app, ota_1, , 1M
nvs_key, data, nvs_keys, , 0x1000
还有带spiffs的。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x140000,
app1, app, ota_1, 0x150000,0x140000,
spiffs, data, spiffs, 0x290000,0x170000,
验证了都可以正常使用,官网上有很详细的说明,可以去看下,末尾会附上链接。
多说一句,开始我看网上分区表是下面这样,中间没用逗号分隔开的方式,
# Name Type SubType Offset Size Flags
nvs data nvs 0x9000 0x5000
otadata data ota 0xe000 0x2000
app0 app ota_0 0x10000 0x140000
app1 app ota_1 0x150000 0x140000
spiffs data spiffs 0x290000 0x170000
我开始就用的这种,我发现这个文件里面不管写什么,哪怕乱写大小和起始地址,都一点反应也没有,地址不对齐4K(是需要地址4k对齐吧),大小超出4MB范围,毛反应都没有,还不报错,就整的很无语。但是在乱改一通后也不报错,我意识到应该不是分区表格式内容的问题,我就重新建立了一个工程,然后重新建立.csv文件且编写,编译后发现不写逗号就会报错,拷贝了一个官方的示例后编译成功了,有效果,到这我确定了是原先工程的问题。
下面是修改前的,默认程序分区大小为1.25MB
下面是添加的分区表和修改分区表后编译的结果。
看上面分区表可以看到大小是0x170000,转换成10进制就是1507328,和实际相符,说明分区表修改成功。
到此就完成了修改ESP32分区表的全部工作。
开始一直不好用,可能是因为那个工程是搭建完环境后第一次建立的,有些东西不全,导致在编译分区表上发生问题。在PlatformIO中下载库时和支撑时最好还是开加速器,尤其是第一次建立工程时,不开加速器非常慢,在下载好前面的支撑文件后,后面再建立工程就不需要开加速器了,还很快。
看官方文档上,对应的有俩APP区,说是用于交换运行程序,这样的话我觉得可以只写一个APP分区,下面可以试试(后面经过验证是可以的,可以只写一个APP区),如果可以省下的flash就可以多码点代码了(手动滑稽)。写这个是为了帮助其他遇到此问题的人,也算记录一下,希望可以节省一些时间。
以上纯属个人经验,并且个人能力也有限,可能出现差错,如有问题请指正,我就改。
下面附上一些链接。ESP32的,PlatformIO的。
PlatformIO在线说明文档 :https://docs.platformio.org/en/latest/what-is-platformio.html.
PlatformIO中有关ESP32的配置命令,如端口波特率、主频设置、flash模式、分区表编译调用等其他杂七杂八的:https://docs.platformio.org/en/latest/platforms/espressif32.html.
乐鑫有关分区表说明文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/partition-tables.html.
github上一些分区表示例:https://github.com/espressif/arduino-esp32/tree/master/tools/partitions.