外观
烧录工具
把固件写进 ESP32 的 Flash,靠的是芯片 ROM 里内置的串口引导程序(ROM bootloader)加上主机端的烧录工具。大多数时候,开发框架会替你调用这些工具;但换固件、救砖、量产烧录时,你需要直接面对它们。
概览
| 工具 | 运行环境 | 适合场景 |
|---|---|---|
| esptool | 本地电脑,命令行(Python) | 官方底层工具,万能 |
| ESP Web Tools / WebSerial 烧录器 | 浏览器(Web Serial) | 给用户一键刷固件,免安装 |
| Flash Download Tool | Windows 图形界面 | 厂商、量产、不想用命令行 |
| 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 命令即可;与安全启动、熔丝相关的内容请在完全理解后再动手。
参考资料
- esptool 文档:https://docs.espressif.com/projects/esptool/en/latest/
- esptool v5 迁移指南:https://docs.espressif.com/projects/esptool/en/latest/esp32/migration-guide.html
- esptool 发布页:https://github.com/espressif/esptool/releases
- esptool 进入引导程序:https://docs.espressif.com/projects/esptool/en/latest/esp32/esptool/entering-bootloader.html
- Flash 加密(ESP-IDF):https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/flash-encryption.html
- ESP Web Tools:https://github.com/esphome/esp-web-tools
- espflash:https://github.com/esp-rs/espflash