You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3双Flash配置启动循环问题:分区表与Bootloader定制求助

问题描述

我们设计并制造了一款新板卡,核心采用ESP32-S3(FN8型号),该型号内置8MB Flash,同时板载额外配备了16MB的WINBOND W25Q128JVSIQ外置Flash。

目前遇到的问题:使用Arduino烧录简单的"Hello"程序后,程序无法正常运行,设备持续进入启动循环。我们怀疑当前的分区表配置存在问题,已尝试多个不同的bootloader.bin文件,但均未解决问题。

现求助两个核心问题:

  1. 如何为ESP32-S3内置8MB+外置16MB的双Flash配置正确的分区表?
  2. 如何针对该双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14