一条命令搞定芯片 ID、MAC 地址、Flash 备份与擦除,收藏这一篇就够了!
📌 前言
esptool.py 是乐鑫官方推出的 Python 工具,几乎所有玩 ESP8266 / ESP32 的朋友都离不开它。很多人只知道用 write_flash 烧录固件,却忽略了它还有一大批实用的 快捷命令:查看 Flash 型号、读取芯片 ID、备份整个 Flash、擦除指定区域......这些命令在调试、维修、数据备份时非常高效。
本文将系统介绍 esptool.py 中除 write_flash 外最常用的快捷命令,每个命令都配有实际示例和输出解读,让你快速上手。
🛠 准备工作
1. 安装 esptool.py
确保 Python 环境正常(建议 3.6+),然后执行:
pip install esptool
验证安装:
esptool.py --help
2. 连接开发板并确认串口号
将 ESP 开发板通过 USB 连接电脑,找到串口号:
- Windows :
COM3,COM4等(设备管理器查看)
注意 :执行快捷命令前,通常需要让开发板处于下载模式(按住 BOOT → 按一下 EN → 松开 BOOT)。不过大部分命令在芯片已经运行固件时也能自动复位进入下载模式,esptool 会自动处理。
📋 常用快捷命令一览表
| 命令 | 功能说明 | 典型输出 |
|---|---|---|
flash_id |
读取 Flash 芯片的制造商 ID 和型号 | Manufacturer: c8, Device: 4014 |
chip_id |
读取 ESP 芯片的唯一 ID | Chip ID: 0x12345678 |
read_mac |
读取 Wi-Fi / 蓝牙 MAC 地址 | MAC: 24:6F:28:AB:CD:EF |
read_flash |
将 Flash 内容备份到文件 | 生成 .bin 备份文件 |
erase_flash |
擦除整个 Flash 芯片 | 无输出,成功即完成 |
erase_region |
擦除 Flash 中指定地址区域 | 无输出,成功即完成 |
run |
退出下载模式,运行 Flash 中的程序 | 无输出,芯片复位运行 |
image_info |
查看固件文件内部信息(无需连接硬件) | 固件入口点、段信息等 |
read_mem |
读取指定内存地址的值(高级) | 0x3ff4404c = 0x00000001 |
dump_mem |
将一段内存内容保存为文件 | 生成内存镜像文件 |
下面我们逐一详解。
注意:如果命令不可用:
esptool.py --port COM3 flash_id
可以用这种命令:
python -m esptool --port COM3 flash_id
只需要将esptool.py替换成python -m esptool。下同。
1️⃣ flash_id -- 查看 Flash 芯片信息
用途:识别开发板上 Flash 的厂商和型号,判断容量和是否支持 Quad I/O 等。
命令:
esptool.py --port COM3 flash_id
示例输出:
Manufacturer: c8
Device: 4014
Detected flash size: 4MB
其中 Manufacturer 编码对应厂商(如 c8 = GigaDevice,ef = Winbond),Device 表示具体型号。通过查表可知道 Flash 的真实容量和性能。
常用场景 :怀疑 Flash 损坏、确认芯片是否为假冒、判断能否使用 dio/qio 模式。
2️⃣ chip_id -- 读取芯片唯一标识
用途:获取 ESP32/ESP8266 芯片的硬件 ID,常用于生成设备序列号、授权验证等。
命令:
esptool.py --port COM3 chip_id
示例输出:
Chip ID: 0x12345678
注意:ESP32 的 Chip ID 来源于 MAC 地址的哈希,ESP8266 则为芯片内部唯一 ID。
常见问题 :如果提示 Invalid chip id,可能是接线不良或芯片未进入下载模式。
3️⃣ read_mac -- 获取 MAC 地址
用途:读取 Wi-Fi 和蓝牙的 MAC 地址(ESP32 有两个 MAC,命令会一并显示)。
命令:
esptool.py --port COM3 read_mac
示例输出(ESP32):
MAC: 24:6f:28:ab:cd:ef
MAC (Bluetooth): 24:6f:28:ab:cd:f0
小技巧:很多 IoT 平台需要填入 MAC 地址进行设备注册,用此命令最准确。
4️⃣ read_flash -- 备份整个 Flash 或指定区域
用途:将 Flash 内容读取出来保存为文件,可用于备份原厂固件、分析文件系统、恢复变砖设备。
命令格式:
esptool.py --port COM3 read_flash <起始地址> <读取大小(字节)> <输出文件>
示例 1:备份整个 Flash(以 4MB 为例)
esptool.py --port COM3 read_flash 0x0 0x400000 backup_4MB.bin
-
0x0:起始地址 -
0x400000:4MB 的十六进制表示(4 * 1024 * 1024 = 4194304 = 0x400000)
示例 2:只备份分区表(通常位于 0x8000,大小 0x1000)
esptool.py --port COM3 read_flash 0x8000 0x1000 partition_table.bin
示例 3:备份 MicroPython 文件系统(例如起始 0x200000,大小 1MB)
esptool.py --port COM3 read_flash 0x200000 0x100000 filesystem.bin
注意 :读取大容量 Flash 时间较长,请耐心等待。建议用 --baud 921600 提高速度。
5️⃣ erase_flash -- 全片擦除
用途:彻底清空 Flash 所有数据。当固件出现奇怪问题、或需要刷入全新系统时,先擦除可以避免残留配置干扰。
命令:
esptool.py --port COM3 erase_flash
执行过程:
Erasing flash (this may take a while)...
Chip erase completed successfully.
⚠️ 警告:此操作不可逆!会清除校准数据、WiFi 配置、设备证书等。擦除后必须重新烧录完整固件。
6️⃣ erase_region -- 指定区域擦除
用途:只擦除 Flash 中的某一段,保留其他数据。例如只清除用户设置区,而不动引导加载程序。
命令格式:
esptool.py --port COM3 erase_region <起始地址> <大小(字节)>
示例:擦除地址 0x10000 开始的 0x20000 字节(通常为应用程序区)
.py --port COM3 erase_region 0x10000 0x20000
注意:擦除的单位必须按扇区对齐(通常 4096 字节),否则命令会报错。
7️⃣ run -- 运行 Flash 中的程序
用途:让芯片退出下载模式,复位并执行 Flash 中已有的固件。
命令:
esptool.py --port COM3 run
执行后,你会看到串口打印出固件启动日志(如果连接了串口监视器)。这个命令常用于烧录完成后验证设备是否正常启动,而不用重新上电。
8️⃣ image_info -- 查看固件文件详情(离线命令)
用途 :无需连接硬件,直接分析一个 .bin 固件文件的内部结构,比如入口地址、段大小、校验和等。
命令:
esptool.py image_info my_firmware.bin
示例输出:
Image version: 1
Entry point: 0x400800a4
Segments:
Segment 1: addr 0x1000, size 0x6a4c
Segment 2: addr 0x2000, size 0x1234
...
Checksum: 0x88 (valid)
用途:判断固件是否损坏、确认编译是否正确、检查固件类型(ESP8266 或 ESP32)。
9️⃣ read_mem & dump_mem -- 高级内存调试
这两个命令属于进阶功能,用于调试底层硬件或分析芯片运行状态。
read_mem:读取单个 32 位内存地址的值
esptool.py --port COM3 read_mem 0x3FF4404C
输出类似:0x3ff4404c = 0x00000001
dump_mem:将一段内存区域保存为文件
esptool.py --port COM3 dump_mem 0x3FF44000 0x1000 mem_dump.bin
这会把 0x3FF44000 开始的 4096 字节保存下来,可用于分析堆栈或外设寄存器。
🧰 实用技巧:批量操作与提速
1. 提高波特率
绝大多数命令都支持 -b 参数:
esptool.py --port COM3 -b 921600 flash_id
read_flash 和 erase_flash 速度也会明显提升。
2. 将常用端口设为环境变量
在命令行中设置:
- Windows (cmd) :
set ESPTOOL_PORT=COM3
之后可省略 --port 参数,直接写 esptool.py flash_id。
3. 自动进入下载模式
有些开发板不支持自动下载电路,如果连接失败,请手动操作:按住 BOOT → 短按 EN → 松开 BOOT 再运行命令。
🐛 常见错误及解决方法
| 错误信息 | 可能原因 | 解决方法 |
|---|---|---|
Failed to connect |
串口号错误、驱动未装、未进入下载模式 | 检查设备管理器,手动进入下载模式 |
Permission denied (Linux) |
当前用户无串口访问权限 | sudo usermod -a -G dialout $USER 后重启 |
Read timeout |
波特率过高或线路不稳定 | 降低波特率(如 -b 115200) |
Invalid head of packet |
芯片未正确复位 | 按一下 EN 键重试 |
Erase region not aligned |
地址未按扇区(4KB)对齐 | 起始地址和长度必须是 4096 的倍数 |
📚 总结
esptool.py 的快捷命令虽然简单,却能解决开发中的许多实际问题:
-
用
flash_id/chip_id/read_mac快速获取硬件信息; -
用
read_flash备份原厂固件,防止变砖; -
用
erase_flash/erase_region清除异常配置; -
用
run无需重新上电即可测试固件; -
用
image_info离线分析固件文件。
掌握这些命令,你在调试 ESP 设备时会更加得心应手。如果你还有想了解的命令或技巧,欢迎在评论区留言讨论!