ESP32-S3双Flash配置启动循环问题:分区表与Bootloader定制求助
问题描述
我们设计并制造了一款新板卡,核心采用ESP32-S3(FN8型号),该型号内置8MB Flash,同时板载额外配备了16MB的WINBOND W25Q128JVSIQ外置Flash。
目前遇到的问题:使用Arduino烧录简单的"Hello"程序后,程序无法正常运行,设备持续进入启动循环。我们怀疑当前的分区表配置存在问题,已尝试多个不同的bootloader.bin文件,但均未解决问题。
现求助两个核心问题:
- 如何为ESP32-S3内置8MB+外置16MB的双Flash配置正确的分区表?
- 如何针对该双Flash配置定制对应的
bootloader.bin文件?
一、双Flash分区表配置
ESP32-S3支持双Flash架构,需明确区分主Flash(内置8MB)与从Flash(外置16MB)的分区分配,以下是具体步骤:
1. 明确双Flash地址规则
- 内置主Flash:默认地址起始
0x0,最大覆盖到0x800000(8MB) - 外置从Flash:可通过分区表的
Flags字段指定归属,地址可独立从0x0开始,或映射到主Flash末尾之后的空间(0x800000及以上)
2. 编写自定义分区表(partitions.csv)
创建符合ESP-IDF规范的CSV分区表文件,放置在Arduino项目根目录。示例适配8MB内置+16MB外置的分区表:
# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 0x200000, // 主Flash分配2MB给出厂程序 ext_fat, data, fat, 0x0, 0x1000000, flash:1 // 从Flash全部分配为FAT存储(16MB) ext_ota, app, ota_0, 0x1000000, 0x200000, flash:1 // 可选:从Flash分配2MB给OTA分区
flash:1是关键标记,指定该分区使用外置从Flash;无此标记则默认使用内置主Flash- 可根据实际需求调整各分区的大小与用途,例如减少主Flash的APP分区大小,预留更多空间给主Flash的数据分区
3. 在Arduino环境中加载自定义分区表
- Arduino IDE:在
文件->首选项中开启"上传时显示详细输出",上传时通过命令行参数指定分区表路径;或使用ESP32核心的"自定义分区表"选项(部分版本支持) - PlatformIO:在
platformio.ini中添加配置:[env:esp32s3] platform = espressif32 board = esp32s3dev board_build.partitions = partitions.csv
二、定制双Flash适配的Bootloader
默认Bootloader未启用外置Flash支持,需通过ESP-IDF编译定制,步骤如下:
1. 准备ESP-IDF环境
安装适配ESP32-S3的ESP-IDF版本(建议v5.0及以上,双Flash支持更稳定)
2. 配置Bootloader参数
执行idf.py menuconfig进入配置界面:
- 进入
Component config->ESP32S3-specific:- 勾选
Support for external SPI flash - 设置
External SPI flash CS pin为外置Flash的CS引脚(需匹配原理图,例如GPIO10) - 设置
External SPI flash size为16MB(对应W25Q128JVSIQ)
- 勾选
- 进入
Bootloader config:- 可将
Bootloader log verbosity设为Info,方便查看启动时的Flash初始化日志 - 若需OTA功能,勾选
Enable app rollback support
- 可将
3. 编译Bootloader
执行idf.py bootloader,编译完成后,定制的bootloader.bin会生成在build/bootloader/目录下
4. 在Arduino中使用定制Bootloader
- Arduino IDE:上传时选择"Custom Bootloader",指定编译好的
bootloader.bin路径 - PlatformIO:在
platformio.ini中添加:board_upload.bootloader = path/to/your/custom/bootloader.bin
三、调试排查要点
- 查看COM端口的启动日志,若出现
Failed to init external flash类错误,优先检查外置Flash的SPI引脚连接(CLK、Q、D、CS)是否与原理图一致 - 使用
esptool.py读取Flash信息,确认双Flash都能被识别:esptool.py flash_id - 若启动循环仍存在,可尝试只烧录Bootloader和分区表,不烧录APP,查看Bootloader是否能正常初始化双Flash
内容的提问来源于stack exchange,提问作者Canik01
相关产品推荐
相关产品推荐

