跳转到内容

烧录工具 ​

把固件写进 ESP32 的 Flash,靠的是芯片 ROM 里内置的串口引导程序(ROM bootloader)加上主机端的烧录工具。大多数时候,开发框架会替你调用这些工具;但换固件、救砖、量产烧录时,你需要直接面对它们。

概览 ​

工具运行环境适合场景
esptool本地电脑,命令行(Python)官方底层工具,万能
ESP Web Tools / WebSerial 烧录器浏览器(Web Serial)给用户一键刷固件,免安装
Flash Download ToolWindows 图形界面厂商、量产、不想用命令行
espflash命令行(Rust)Rust 开发、嵌入 Cargo 流程
框架内置idf.py flash、Arduino IDE、PlatformIO日常开发

eFuse、Secure Boot 与 Flash 加密不可逆

eFuse 是芯片内一次性可编程的熔丝位:一旦烧写,不能改回。烧写 Secure Boot 密钥、Flash 加密密钥、禁用 UART 下载模式、写保护等,会让该芯片永久带上这些属性。操作错误可能导致这颗芯片永远无法再次烧录(变砖),没有任何软件手段可以回退。

  • 看到 espefuse 的 burn-efuse、burn-key、burn-key-digest 等命令,或在 menuconfig 里启用 Secure Boot、Flash Encryption 的 Release 模式时,先停下来,通读官方文档。
  • 在不是量产的开发板上练习,不要在唯一的一块板子或已售出设备上试验。
  • 只在你拥有的设备上操作;对别人设备烧 eFuse 属于破坏性行为。
  • 开发模式 (Development) 的 Flash 加密允许有限次数关闭(官方文档写明最多 3 次,由 FLASH_CRYPT_CNT 控制),Release 模式不可关闭,并会烧录 DISABLE_DL_ENCRYPT、DISABLE_DL_DECRYPT 等位。
  • 对已加密设备刷明文固件会让它软变砖并循环重启。
  • 首次加密过程中不要断电,否则 Flash 内容会损坏。
  • 一个主机生成的 Flash 加密密钥只能烧入一次,且必须在第一次加密启动前完成;每台设备应使用不同密钥,密钥丢失则无法再离线制作可用的加密固件。
  • 在 menuconfig 选择 Release 只改变构建配置,不会自己烧熔丝;真正烧录发生在固件运行 esp_flash_encryption_set_release_mode() 或使用 espefuse 工具时。
  • 想了解 Secure Boot 与 Flash 加密本身,请阅读 ESP-IDF 官方的 Security 章节,并推荐两者一起使用,因为只加密不防篡改不够。

关键信息 ​

esptool 与 v5 的变化 ​

esptool 是乐鑫官方的 Python 工具,包含 esptool、espefuse、espsecure 三个命令。在发布页(2026-10-14)看到:

  • 最新版本 5.5.0(2026-10-08);v4 系列仍在发版,最近的是 4.12.0。
  • 5.x 把 Linux 二进制改用 Ubuntu 22.04 构建,需要 glibc 2.35 以上。

v5 迁移指南列出的主要不兼容变化:

  • 命令不再带 .py 后缀:用 esptool、espefuse、espsecure;旧脚本名仍可用但有弃用警告,会在下个大版本移除。
  • 子命令和选项用连字符:write_flash 变为 write-flash,--flash_size 变为 --flash-size;旧写法暂时可用,会警告。
  • 部分选项改名,例如 write-flash 的 --ignore-flash-encryption-efuse-setting 变为 --ignore-flash-enc-efuse。
  • write-flash --verify 被弃用,写入后会自动校验(在 Secure Download Mode 和加密写入时跳过)。
  • espefuse 每条命令都必须带 --port(除非用 --virt),不再默认 /dev/ttyUSB0。
  • 不再支持若干 beta 版芯片(如 C5 beta3、C6 beta、H2 beta1/beta2、S3 beta2),要用 v4。
  • Python API 重构,命令函数参数从 argparse 对象改为独立带类型的参数。

常用命令(在本地电脑终端执行,端口名按实际修改):

bash
pip install esptool
esptool chip-id                              # 识别芯片
esptool flash-id                             # 查看 Flash 型号和容量
esptool --port /dev/ttyACM0 erase-flash      # 整片擦除,会清掉所有数据和 Wi-Fi 配置
esptool --port /dev/ttyACM0 write-flash 0x0 merged.bin
esptool --port /dev/ttyACM0 read-flash 0 ALL backup.bin   # 先备份再动手

不要把 erase-flash 当作解决问题的第一手段。刷机之前备份整片 Flash 是好习惯,尤其是刷第三方设备的原厂固件前。

进入下载模式 ​

esptool 只能在芯片被复位并选择了串口引导模式时通信。

  • 很多开发板有自动复位电路,由 DTR / RTS 驱动,esptool 能自己进入下载模式。
  • 否则需要手动:按住 BOOT(接 GPIO0 拉低),点按一下 RESET / EN,再松开 BOOT。具体的启动引脚(strapping pin)因芯片而异,ESP32-C3、S3 等也是 GPIO0 控制,其他型号以数据手册为准。
  • 带原生 USB 的芯片(S2、S3、C3、C6 等)可以通过 USB-Serial-JTAG 或 USB OTG 烧录,不需要外部串口芯片。如果固件占用了这些引脚,或程序让 USB 反复重启,设备可能从电脑上消失;这时需要手动进入下载模式才能重新烧录。
  • 原版 ESP32 需要外接 USB 转串口芯片(CP210x、CH340 等),部分廉价板自动复位不稳定,要手动按键。

ESP Web Tools ​

ESP Web Tools 是 ESPHome 团队维护的网页烧录组件,Apache-2.0 许可。你在网页里放一个 <esp-web-install-button> 元素并指向 manifest.json:

html
<!-- 放在你自己的网页里;用户用支持 Web Serial 的浏览器打开 -->
<script type="module" src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"></script>
<esp-web-install-button manifest="firmware/manifest.json"></esp-web-install-button>

manifest.json 按 chipFamily 列出各芯片的 parts(文件路径与偏移地址),也可以用 serialType 区分原生 USB 与 USB 转串口的两种固件。浏览器要求:仅限实现了 Web Serial 的 Chromium 系浏览器,Firefox 与 Safari 不支持。上面脚本版本号只是格式示例,请到项目页确认。

Tasmota、ESPHome、WLED、MicroPython 等都提供基于它或类似机制的网页安装。网页烧录前,确认该页面来源可信,因为它能向你的设备写入任意固件。

Flash Download Tool ​

乐鑫官方的 Windows 图形烧录工具,选择芯片、固件文件和偏移地址即可。适合在工厂批量烧录。具体当前版本与功能请到乐鑫下载中心确认,我没有逐项核对。

espflash ​

espflash 是用 Rust 写的串口烧录工具(含 cargo-espflash),受 esptool 启发,Apache-2.0 / MIT 双许可。仓库列出的支持芯片包含 ESP32、C2、C3、C5、C6、C61、H2、H4、P4、S2、S3、S31。适合 Rust 项目,见 Rust 开发。

与各框架的关系 ​

ESP-IDF、Arduino-ESP32、PlatformIO、MicroPython 都最终用 esptool 或同类工具写入。看到烧录失败时,先看串口、数据线(有些线只充电)、驱动和下载模式,而不是怀疑固件。

适合谁 / 不适合谁 ​

适合需要换固件、救砖、批量烧录或自动化发布固件的读者。普通开发者平时只用框架自带的 flash 命令即可;与安全启动、熔丝相关的内容请在完全理解后再动手。

参考资料 ​

ESP32 非官方中文调查手册,与乐鑫科技(Espressif Systems)无隶属关系。