esptool trên Windows: sao lưu firmware ESP32 ra file .bin, xóa flash và nạp lại khi bị lỗi
Dùng esptool trên Windows cho ESP32: kiểm tra chip, sao lưu toàn bộ firmware ra file .bin, xóa flash, nạp lại file .bin ở đúng địa chỉ và bảng tra lỗi thường gặp.
Flash Download Tool có giao diện dễ dùng, nhưng khi báo lỗi thì thông báo rất ít, khó biết sai ở đâu. esptool là công cụ dòng lệnh chính thức của Espressif; Arduino IDE cũng dùng chính esptool mỗi lần bấm Upload cho ESP32. Bài này hướng dẫn dùng esptool trên Windows để kiểm tra chip, sao lưu toàn bộ firmware ESP32 ra file .bin, xóa flash, nạp lại file .bin và đối chiếu kết quả, kèm bảng tra lỗi thường gặp.
1. esptool có sẵn trên máy bạn
Nếu đã cài ESP32 vào Arduino IDE, esptool đã nằm sẵn trong thư mục:
%LOCALAPPDATA%\Arduino15\packages\esp32\tools\esptool_py\5.3.0\esptool.exe
Số 5.3.0 là phiên bản esptool đi kèm gói esp32 bản 3.3.10; máy bạn có thể là số khác, mở thư mục esptool_py để xem. Bản 5.x viết lệnh có dấu gạch nối (read-flash, write-flash); bản 4.x đi kèm gói esp32 cũ hơn viết bằng dấu gạch dưới (read_flash, write_flash). Chưa cài Arduino IDE thì có thể tải bản esptool cho Windows trên trang phát hành của Espressif, hoặc cài bằng Python với lệnh pip install esptool.
Mở Command Prompt (gõ cmd ở ô tìm kiếm của Windows), chuyển vào thư mục esptool:
cd /d "%LOCALAPPDATA%\Arduino15\packages\esp32\tools\esptool_py\5.3.0"
Đóng Serial Monitor của Arduino IDE và Flash Download Tool trước khi chạy esptool, vì một cổng COM chỉ một phần mềm mở được.
2. Bên trong bộ nhớ flash 4 MB của ESP32

Mạch ESP32 DevKit V1 có bộ nhớ flash 4 MB, chia thành các vùng theo bảng phân vùng. Với bảng mặc định của Arduino ESP32: bootloader ở 0x1000, bảng phân vùng ở 0x8000, vùng nvs ở 0x9000 lưu cấu hình Wi-Fi và dữ liệu của thư viện Preferences, chương trình chính ở 0x10000, vùng spiffs ở 0x290000 chứa file của SPIFFS hoặc LittleFS. Biết bản đồ này sẽ hiểu vì sao nạp đè một file có thể làm mất cấu hình Wi-Fi, còn nạp file khác thì không.
3. Năm bước làm việc với flash

Các lệnh dưới đây dùng cổng COM5 và thư mục D:\esp32 làm ví dụ; thay bằng cổng COM và thư mục trên máy bạn.
Bước 1. Kiểm tra kết nối và đọc thông tin chip, dung lượng flash:
esptool --port COM5 flash-id
Kết quả in ra loại chip, địa chỉ MAC và dòng Detected flash size (mạch DevKit V1 là 4MB). Báo Failed to connect thì giữ nút BOOT trên mạch trong lúc chạy lệnh, kiểm tra cáp và cổng COM như bài ESP32 không nhận cổng COM, lỗi Failed to connect.
Bước 2. Sao lưu toàn bộ flash ra một file:
esptool --port COM5 --baud 921600 read-flash 0 0x400000 D:\esp32\sao_luu.bin
0x400000 là 4 MB; mạch có flash 8 MB thì thay bằng 0x800000. Đọc 4 MB mất vài phút. File sao lưu chứa cả vùng nvs, nên có thể chứa tên và mật khẩu Wi-Fi mà chương trình đã lưu: giữ file ở nơi an toàn. Chỉ sao lưu firmware của chính bạn.
Bước 3. Xóa flash (chỉ khi cần):
esptool --port COM5 erase-flash
Lệnh đưa toàn bộ 4 MB về trạng thái trống. Dùng khi firmware lỗi làm mạch khởi động lại liên tục, khi đổi bảng phân vùng, khi chuyển từ MicroPython về Arduino. Sau khi xóa, cấu hình Wi-Fi và file trong SPIFFS, LittleFS đều mất.
Bước 4. Nạp lại. Có ba trường hợp:
- Nạp lại bản sao lưu:
esptool --port COM5 --baud 921600 write-flash 0x0 D:\esp32\sao_luu.bin - Nạp file gộp do Arduino IDE xuất (Sketch > Export Compiled Binary, file tên
ten-sketch.ino.merged.bin):esptool --port COM5 --baud 921600 write-flash 0x0 ten-sketch.ino.merged.bin. Với gói esp32 3.3.10, file gộp dài đúng 4 MB nên ghi đè cả vùng nvs và spiffs. - Chỉ thay chương trình, giữ nguyên cấu hình Wi-Fi và dữ liệu:
esptool --port COM5 --baud 921600 write-flash 0x10000 ten-sketch.ino.bin
Nạp đủ các file rời giống Arduino IDE thì dùng bốn cặp địa chỉ, file: 0x1000 ten-sketch.ino.bootloader.bin, 0x8000 ten-sketch.ino.partitions.bin, 0xe000 boot_app0.bin (nằm trong thư mục tools\partitions của gói esp32), 0x10000 ten-sketch.ino.bin. Đây cũng là các địa chỉ dùng trong bài nạp file .bin vào ESP32 bằng Flash Download Tool.
Bước 5. Đối chiếu flash với file vừa nạp:
esptool --port COM5 verify-flash 0x0 D:\esp32\sao_luu.bin

4. Bảng tra lỗi khi dùng esptool
| Thông báo có chứa | Nguyên nhân hay gặp | Cách sửa |
|---|---|---|
Failed to connect | Mạch không vào chế độ nạp, cáp chỉ sạc, sai cổng COM | Giữ nút BOOT khi chạy lệnh, đổi cáp, kiểm tra cổng COM |
could not open port, Access is denied, PermissionError | Cổng COM đang bị Serial Monitor, Flash Download Tool giữ | Đóng các phần mềm đó rồi chạy lại |
| Đứt kết nối giữa chừng, lỗi đọc ghi khi dùng 921600 | Cáp dài, cáp kém, cổng USB qua hub | Giảm --baud 460800 hoặc 115200, cáp ngắn, cắm thẳng vào máy |
will not fit | File lớn hơn flash hoặc đặt sai địa chỉ | Kiểm tra dung lượng flash, địa chỉ nạp |
Nạp xong, Serial Monitor báo invalid header: 0xffffffff và khởi động lại liên tục | Thiếu bootloader hoặc bảng phân vùng sau khi xóa flash | Nạp file gộp ở 0x0, hoặc đủ bốn file rời |
| Nạp xong mất cấu hình Wi-Fi | Đã xóa flash hoặc nạp file gộp 4 MB | Chỉ nạp file .ino.bin ở 0x10000 khi muốn giữ cấu hình |
5. Xem thêm
- Nạp file .bin vào ESP32 bằng Flash Download Tool.
- Cài ESP32 vào Arduino IDE 2, chọn ESP32 Dev Module.
- Sản phẩm: ESP32 DevKit V1 30 chân, ESP32 DevKit V1 38 chân, dây USB nạp code.
Cần hỗ trợ khi nạp firmware cho ESP32, liên hệ PYWORLD qua số 0915703319.
Xem thêm