只接桥接口,先用插拔确认端口
拔掉外设与其他供电,只用 USB 数据线接 DevKitC-1 的 USB-to-UART 插座。官方 v1.1 原理图中的 CP2102N 把 USB 数据转换成 UART0,再通过 GPIO43/44 与 S3 通信;另一个原生 USB 插座连接 GPIO19/20。不要凭插座位置猜用途,先对照板上的标识和官方图。
在系统设备列表或 IDE 端口列表中观察插入前后的变化,选择新增的目标端口。Windows 可能显示 COM7,macOS 可能是 /dev/cu.SLAB_USBtoUART,Linux 可能是 /dev/ttyUSB0,名称仅是例子。IDE 没有自动认出板名时,仍可手动选 ESP32S3 Dev Module;端口存在并不能证明芯片型号。
本例 USB CDC On Boot 必须为 Disabled,让 Serial 使用 UART0。若启用 CDC 后仍只插桥接口,可能看到上传成功却收不到应用输出;先恢复固定组合,不在第一次上传时同时切换两种串口路径。
参考:[1] 乐鑫 DevKitC-1 v1.1 用户指南:固定文档提交 927ed7e[2] DevKitC-1 v1.1 原理图,2022-11-30,第 2 页[3] Arduino-ESP32 3.3.12:Tools Menu[6] Arduino-ESP32 3.3.12:HardwareSerial
这次程序只做三件可检查的事
完整程序在 FirstUploadMonitor/FirstUploadMonitor.ino。setup() 用 115200 开启串口,等待固定 500ms 后输出 APP=F06-A、芯片型号和 reset_reason;loop() 每约一秒打印序号与运行毫秒数。它不等待电脑连接,也不调用 Wi-Fi、LED 或外设,因此不会因为设备端看不到 USB CDC 而无限卡住。
计时采用无符号差值,避免 millis() 回绕时直接比较绝对时间;delay(1) 为循环让出执行机会。序号只在内存里,复位后会从头开始。reset_reason 是 ESP-IDF v5.5.5 定义的枚举数值,POWERON、SW、PANIC、WDT、BROWNOUT 等有不同含义;不能从一个数字就断言某块电源坏了。
下面是关键常量。先保持 F06-A,完成第一次上传;第二次只改这一个字符串。完整源码比页面片段多出初始化、计时和输出,请使用下载包中的文件编译。
constexpr char BUILD_LABEL[] = "F06-A";
// 第二轮只把上面一行改成 "F06-B",重新编译并上传。参考:[5] ESP-IDF v5.5.5:esp_reset_reason_t 与 esp_reset_reason[6] Arduino-ESP32 3.3.12:HardwareSerial
先编译,再上传;自动下载失败才手动按键
打开下载包的 sketch,核对 F05 的 8MB、OPI PSRAM、QIO80MHz、8M 分区与 CDC Disabled。选择刚确认的桥接端口,关闭其他 IDE、网页烧录器或终端监视器对该端口的占用。先按 Verify;成功后把 Upload Speed 设为 115200,再按 Upload。上传速度与程序 Serial.begin 的波特率是两个独立设置,这里都选 115200 只是减少首轮变量。
正常自动复位会进入下载模式,工具识别 ESP32-S3 后写入 Flash。若日志停在 Connecting 且超时,按住 BOOT,短按并放开 RESET,然后放开 BOOT,再开始上传。该动作让复位时满足下载条件;不是应用内的配网或激活流程。
上传工具完成写入及校验后,松开 BOOT,短按 RESET 让应用正常运行。不要一直按着 BOOT 验收日志;等待下载的芯片不会运行你的 loop()。完整错误保留后再排查,避免不断点击 Upload 造成信息混杂。
- 做到这里,你应该看到
- 工具实际识别 S3,写入完成;这仍需继续读应用日志,不能在此结束。
参考:[1] 乐鑫 DevKitC-1 v1.1 用户指南:固定文档提交 927ed7e[2] DevKitC-1 v1.1 原理图,2022-11-30,第 2 页[3] Arduino-ESP32 3.3.12:Tools Menu[4] Arduino-ESP32 3.3.12:boards.txt 的 esp32s3 菜单
用 115200 读日志,并主动触发一次复位
上传结束后,在同一桥接端口打开串口监视器,选择 115200,再按一次 RESET。这可以避免监视器开得太晚而错过 setup 的第一行。应看到 APP=F06-A 与 READY,随后 sequence 逐步增加。启动 ROM 信息与应用信息可能连在一起;用自己写入的 APP 标记识别应用,不以任何一行启动文字代替程序成功。
下面仅为格式示意,实际 reset_reason 和毫秒值必须来自你的日志。连续记录至少五条周期输出,然后按 RESET,观察新一轮 READY 和 sequence 从 1 重新开始。若时间或序号不断回到起点而你没有按键,保存完整上下文并检查复位原因。
APP=F06-A chip=ESP32-S3 reset_reason=<实际枚举数值>
READY: UART0 115200; press RESET to restart the counter.
APP=F06-A sequence=1 uptime_ms=<实际值>
APP=F06-A sequence=2 uptime_ms=<实际值>- 做到这里,你应该看到
- 版本标记正确、序号持续增长、主动复位后重新开始;示例格式不填入实测记录。
把 A 改成 B,完成第二次上传
先关闭监视器,CLI 可按 Ctrl+C。仅把 BUILD_LABEL 改成 F06-B,保存、重新编译并上传。再次打开同一端口监视器、按 RESET,这次必须看到 APP=F06-B。若仍是 A,优先核对是否编辑了另一个文件、传错了端口或只编译没有上传。
拔掉 USB 再插回,重新打开端口并观察,仍应运行 B;这样能确认程序在 Flash 中,而不是误读先前终端缓存。给两轮各保留:日期、板/模组、端口、core/FQBN、编译结果、上传结果与至少五条日志。确认 A、复位 A、B、复位/断电后 B 四个观察点,才算本篇实板任务完成。
本站目前没有执行这些实板步骤。本篇交付完整程序与验收方法;页面构建栏只记录实际编译证据,两次上传、重启与断电恢复仍明确待实板验证。
- 做到这里,你应该看到
- 第二轮确实显示 B,复位与拔插后仍是 B;无硬件时保留未验证状态。
参考:[1] 乐鑫 DevKitC-1 v1.1 用户指南:固定文档提交 927ed7e[3] Arduino-ESP32 3.3.12:Tools Menu[5] ESP-IDF v5.5.5:esp_reset_reason_t 与 esp_reset_reason
按停住的阶段恢复,不反复重装全部环境
没有端口:检查数据线、USB-to-UART 插座和系统识别;需要时只从 Silicon Labs 官方安装 CP210x 驱动。端口有却打开失败:关闭占用工具,Linux 再检查设备组权限。工具 Connecting 超时:手动下载模式与 115200 速度重试。已经写入但没有 APP:先核对 CDC Disabled、桥接插座与 115200,再按 RESET。
乱码先检查监视波特率;只见旧标记先检查源码和目标端口;持续复位则保留从启动开始的完整日志,回到仅开发板 USB 供电状态。详细串口排错沿用已有文章,不在这里重复建立另一套相互矛盾的流程。
恢复最小状态的方法是重新烧入 F05 的官方 GetChipID。通常无需先擦除所有 Flash;清空会丢掉其他配置,不能当作每次上传的默认步骤。随后再烧回 B,并保存成功与失败记录。
参考:[1] 乐鑫 DevKitC-1 v1.1 用户指南:固定文档提交 927ed7e[2] DevKitC-1 v1.1 原理图,2022-11-30,第 2 页[3] Arduino-ESP32 3.3.12:Tools Menu
资料来源与版本说明
本文依据下列官方文档与上游资料独立整理,适用范围与版本以本文所列组合为准。资料核对日期:。资料核对、程序构建与实板测试分别记录,不互相替代。