esptool 使用教程:ESP32 固件烧录、Flash 加密与 OTP 编程,5 个命令
esptool 是乐鑫(Espressif)官方维护的 ESP32 底层命令行工具,ESP-IDF 与 Arduino 的烧录流程底层都调用它。但多数开发者只用到了它的 write_flash 烧录命令,实际上它还能完成 Flash 加密、eFuse 编程、多固件合并、读回校验等操作,覆盖从开发到量产的全流程。
本文基于 esptool 官方文档整理 5 个常用命令的用法,说明各自的适用场景与注意事项。
一、安装与环境
esptool 是一个 Python 包,通过 pip 安装即可:
pip install esptool
安装完成后可通过 esptool.py 或 esptool 命令调用。它支持 ESP8266、ESP32 以及 ESP32-S2/S3/C2/C3/C6 等全系列芯片,命令基本格式为:
esptool.py --port <串口> --chip <芯片型号> <子命令> [参数]
其中 --chip 可选,esptool 通常能自动检测芯片型号;--port 指定串口设备,Linux 下通常是 /dev/ttyUSB0。
二、工作原理
esptool 不经过操作系统或 RTOS,而是直接与芯片 ROM 中固化的 bootloader 通信。芯片上电后 ROM bootloader 最先执行,通过检测 GPIO0 电平决定进入下载模式还是正常启动。下载模式下,esptool 经串口发送 SLIP 编码的命令帧,由 bootloader 接收执行。
这意味着 esptool 运行在操作系统之前——无论 Flash 中烧录了何种固件,都无法阻止其工作。只要 ROM bootloader 完好,刷成砖的板子也能通过 esptool 恢复。
三、5 个常用命令
1. 读回校验:read_flash
esptool.py --port /dev/ttyUSB0 read_flash 0 ALL firmware_backup.bin
0 ALL 表示从地址 0 读到 Flash 末尾。烧录完成后用该命令读回内容,与本地固件执行 diff,可确认烧录是否发生静默损坏。这是量产线每批次都应执行的校验步骤。
2. Flash 加密:burn_efuse + write_flash --encrypt
# 第一步:生成 Flash 加密密钥并烧入 eFuse(一次性、不可逆)
esptool.py --port /dev/ttyUSB0 burn_efuse FLASH_CRYPT_CNT
# 第二步:以加密模式烧录,此后 Flash 内容由芯片内部透明加解密
esptool.py --port /dev/ttyUSB0 write_flash --encrypt 0x1000 firmware.bin
启用 Flash 加密后:
- Flash 中固件为密文,外部编程器无法直接读取
- ESP32 内置硬件 AES 引擎负责透明解密,运行时性能不受影响
- 该操作不可逆,
FLASH_CRYPT_CNTeFuse 一旦烧录无法回退,务必先在开发板验证流程
3. 固件合并:merge_bin
esptool.py --chip esp32 merge_bin \
--output factory.bin \
--flash_mode dio --flash_size 4MB \
0x1000 bootloader.bin \
0x8000 partition_table.bin \
0x10000 app.bin
量产线通常只需要单一固件文件。merge_bin 将 bootloader、分区表、应用固件按地址拼合为一个文件,同时固化 flash mode 与 flash size 参数,产线无需再传多组参数。
4. 读取芯片信息:chip_id / flash_id / read_mac
esptool.py --port /dev/ttyUSB0 chip_id # 芯片唯一 ID
esptool.py --port /dev/ttyUSB0 flash_id # Flash 厂商与容量
esptool.py --port /dev/ttyUSB0 read_mac # MAC 地址
这三个命令可用于来料检验,一次确认芯片是否为正品、Flash 容量是否被缩减、MAC 地址段是否符合预期。
5. 区域擦除:erase_region
# 仅擦除 OTA 数据分区(保留固件与 NVS)
esptool.py --port /dev/ttyUSB0 erase_region 0xD000 0x2000
erase_flash 为全片擦除,erase_region 为区域擦除。WiFi 连接异常时,往往是 NVS 中的配置损坏,此时仅擦除 NVS 区域即可,无需重刷固件。
四、注意事项
- esptool 不是调试器:它只能烧录与读取 Flash,无法设置断点。调试需使用 OpenOCD + GDB,或 probe-rs。
- eFuse 操作不可逆:任何
burn_efuse操作前,先执行esptool.py summary_efuse确认当前 eFuse 状态。 - Flash 加密并非银弹:它防的是"外部直接读 Flash",无法抵御物理攻击(电压毛刺、电磁分析等仍可能提取密钥)。安全敏感产品应叠加 Secure Boot 与 Flash 加密两层防护。
五、总结
esptool 是 ESP32 开发中使用频率最高、也最常被低估的工具。多数开发者仅使用 write_flash 一个子命令,而量产校验(read_flash)、固件管理(merge_bin)、来料检验(chip_id/flash_id/read_mac)、安全防护(burn_efuse + --encrypt)等场景均有对应命令支撑。项目进入量产阶段前,建议先熟悉这 5 个命令。
更多推荐



所有评论(0)