首页 / 工具 / 报错急救箱
ESP32 报错急救箱
把串口监视器里那段红字复制下来扔进去,它到底在说什么、大概是哪儿的毛病、先试哪一步,这里直接告诉你。不用注册,日志不出你的浏览器。
① 你是谁?(选一个,诊断会带上你的场景)
② 或者直接点你的症状,会自动填入一段对应日志
③ 把报错贴进来
试过的步骤打上勾,会变成 [x] 一起复制出去。群里回你的人能少问你三句话。
带走一份离线版
下载单个 HTML 文件,双击即用、完全断网也能诊断。车间、实验室、没外网的工位都能跑;也能直接把这个文件发给同学和同事,他不用装任何东西。
下载单个 HTML 文件,双击即用、完全断网也能诊断。车间、实验室、没外网的工位都能跑;也能直接把这个文件发给同学和同事,他不用装任何东西。
为什么要做这个
ESP32 的报错向来不说人话。「Timed out waiting for packet header」不会告诉你该按 BOOT 键;「LoadProhibited」不会提醒你去查空指针;「Brownout detector was triggered」更不会说其实是你那根 USB 线不行。官方文档写得准,但散在几十个页面里;搜索出来的又大多是五年前的论坛帖,最后一句话是「后来怎么解决的?楼主呢?」。
所以这里把它做成了翻译器:贴日志,出答案。原因按真实命中率排序,每条都链回 Espressif 官方文档,方便你自己复核。
错误速查表
目前已收录 34 类错误。工具里显示的概率来自经验排序,不是精确统计。
⬇ 烧录 / 下载
| 连不上芯片:esptool 在等一个永远不来的回应 | 电脑能看见串口,但芯片当时没处在「下载模式」,所以烧录软件敲门没人应。这是 ESP32 排名第一的报错,九成不是芯片坏了。… |
| 芯片启动模式不对(Wrong boot mode) | 芯片上电时被采样到的 strapping 电平组合不是下载模式。本质是 GPIO0 在复位瞬间没有被稳定拉低。… |
| 端口打不开:找不到、被占用、或没权限 | 操作系统层面就没连上,跟芯片无关。Windows 通常是驱动/占用,Linux 是权限,macOS 是驱动冲突。… |
| 写到一半失败:能连上但烧不进 | 握手成功了,但真正写 Flash 时断掉。写 Flash 瞬间电流最大,几乎都是供电或线材扛不住。… |
| 校验失败:烧进去的和文件对不上 | 写完后回读比对,内容不一致。说明写入过程受到了干扰,或者 Flash 地址/模式不对。… |
| 固件太大,Flash / 分区装不下 | 编译出来的体积超过了分区表给 app 留的空间。开 OTA 时尤其常见——两个 app 槽位会把可用空间砍掉近一半。… |
⚡ 供电 / 复位
| 掉电检测触发(Brownout) | 芯片检测到自己的电压掉到阈值以下,为了不出乱子直接把自个儿复位了。Wi-Fi 发射瞬间电流最大,最容易踩到。这不是代码的问题。… |
| 看门狗复位:rst:0x10 / 0x7 / 0x8 | 芯片认为程序「卡死了」,于是自己重启。0x10 是开机阶段就卡住(bootloader 级),0x7/0x8 是某个任务长时间没喂狗(FreeRTOS 任务看门狗)。… |
| 串口一堆乱码:多半只是波特率不对 | ESP32 开机时 bootloader 会以 74880 波特率打一行信息,如果你的监视器设成 9600 或 115200,看到的就会是乱码——这是正常的,不是板子坏了。… |
💥 运行崩溃
| LoadProhibited:读了不该读的内存 | 程序去读了一块无效地址。最常见的是空指针、野指针、或者对象已经被释放还在用。看 EXCVADDR:如果是 0x00000000,基本就是解引用了 NULL。… |
| StoreProhibited:写了不该写的内存 | 往一个无效地址写数据。典型是往只读区域写、往 NULL 指针指向的成员写、或者数组越界写。… |
| IllegalInstruction:CPU 执行了一条不是指令的东西 | 程序计数器跳到了不该执行的地方。常见原因是函数指针坏了、栈被踩坏、或者把 Flash 引脚当成 GPIO 用了导致读不出指令。… |
| InstrFetchProhibited:取指令失败 | CPU 想执行某个地址的指令,但那个地址不在有效的代码区里。PC 寄存器如果是 0 或一堆乱码,说明函数指针坏了。… |
| 栈溢出:任务栈不够用了 | 这个任务用的栈超过了分配给它的大小,越界写把「金丝雀」踩了,系统立刻报出来。比起莫名其妙的崩溃,这其实是个好消息——它直接告诉你是哪个任务。… |
| 任务看门狗:某个任务卡住不喂狗 | 空闲任务长时间没得到 CPU,说明有任务占着不放。日志会直接点名是哪个任务。… |
| abort / assert failed:代码主动调用异常中止 | 不是硬件问题,是代码或库主动抛出的中止。assert 后面那一行会写明文件名、行号和判断条件,这是最好查的一类崩溃。… |
| Cache disabled:在 Flash 操作期间访问了需要缓存的代码 | 擦写 Flash 或操作 SPI 时,Cache 会被临时关掉,这时候调用存放在 Flash 里的函数或中断就会崩。ESP-IDF 用 IRAM_ATTR 解决。… |
📶 Wi-Fi / 联网
| 搜不到热点 / 连不上 Wi-Fi | ESP32 只支持 2.4 GHz,不支持 5 GHz。如果路由器开了「双频合一」,或者你用的是手机 5G 热点,它根本看不见这个网络。… |
| Wi-Fi 密码对了但认证失败 | 密码正确但握手没过。常见于 WPA2/WPA3 混合模式、加密方式不兼容,或者信号质量差导致握手超时。… |
| MQTT 连不上 / 反复重连 | 网络通了但 MQTT 握手没过。看返回码:rc=-2 是超时(网络层),rc=4/5 是用户名密码错,rc=2 是 client id 被拒。… |
| TLS / HTTPS 握手失败 | HTTPS 连接建立不起来。最常见的原因是设备系统时间不对导致证书「尚未生效」,其次是根证书缺失或过期。… |
📷 摄像头
| 摄像头初始化失败(Camera probe failed) | ESP32 通过 SCCB(类 I2C)跟摄像头握手,没握上。排第一的原因永远是排线没插好,第二是代码里选错了板子型号。… |
| 取帧失败 / 画面花屏绿屏 | 帧缓冲分配不出来,或者 DMA 搬运跟不上导致数据错位。花屏绿屏基本就是 PSRAM 没开或分辨率设太高。… |
🧠 内存 / PSRAM
| 内存不足:分配失败 | 堆不够了。经典 ESP32 只有约 300 KB 可用 DRAM,开 Wi-Fi + TLS + 摄像头很容易见底。… |
| PSRAM 初始化失败 | 芯片没找到外挂的 PSRAM。可能是模组本来就没有 PSRAM,也可能是配置开了但硬件不支持,或者引脚被占用。… |
| DRAM 溢出:全局变量/static 太多 | 链接阶段就失败了,说明全局变量和 static 变量加起来超过了可用 DRAM。这类错误在编译时就暴露,比运行时崩溃好处理。… |
🔄 OTA 升级
| OTA 升级失败或回滚 | 新固件写进去了但校验没过、或启动后没有确认「我活了」,芯片就会回滚到旧版本。这是设计上的保护机制,不是 bug。… |
🔌 硬件 / 外设
| ADC2 与 Wi-Fi 冲突:读数全是错的 | ESP32 经典款的 ADC2 通道被 Wi-Fi 驱动占用,Wi-Fi 一开 ADC2 就读不准。这不是代码 bug,是硬件架构决定的。… |
| I²C 通信失败:设备不应答 | 主机发了地址但从机没拉低 SDA 应答。多半是地址不对、没接上拉电阻、或者设备根本没上电。… |
| Strapping 脚电平不对:板子起不来或反复重启 | 上电瞬间被采样的那几个脚(GPIO0/2/5/12/15)决定了芯片怎么启动。外接电路如果把它们拉成了错误电平,板子就会表现出各种诡异症状——最典型的是 GPIO12 被拉高导… |
| 深度睡眠叫不醒 / 立刻醒来 | 进深睡后要么醒不来,要么刚睡就醒。前者通常是唤醒源没配对,后者通常是唤醒引脚当前就处在触发电平上。… |
🛠 编译 / 环境
| 头文件找不到:库没装或路径不对 | 编译器找不到 #include 的那个头文件。Arduino 里是库没装,ESP-IDF 里是组件没加进 CMakeLists。… |
| API 变了:示例代码和新版库对不上 | 这是「网上抄的代码跑不起来」最常见的原因。ESP32 Arduino core 从 2.x 升到 3.x 时改了不少 API,旧示例直接编译不过。… |
| ESP-IDF 工具链没配好 | 环境变量和 Python 虚拟环境没生效,命令行找不到 idf.py / cmake / python。… |