10 lỗi nạp code ESP32 thường gặp và cách sửa dứt điểm

Tổng hợp lỗi nạp code ESP32 - Failed to connect, không thấy cổng COM, brownout, boot loop - kèm nguyên nhân và cách sửa theo thứ tự kiểm tra. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.
Cách đọc bài này
Lỗi nạp code là rào cản đầu tiên và gây nản nhất khi học ESP32. Tin tốt: hơn 90% trường hợp rơi vào 10 lỗi dưới đây, mỗi lỗi có dấu hiệu nhận biết rõ ràng. Tìm thông báo lỗi của bạn trong các tiêu đề, làm theo các bước xếp theo xác suất từ cao xuống thấp.
Quy tắc chung trước khi sửa bất kỳ lỗi nào: rút hết dây cắm vào các chân GPIO (đặc biệt GPIO 0, 2, 12) rồi thử nạp lại — dây cắm sai chân strapping là thủ phạm giấu mặt của vô số lỗi kỳ lạ.
1. Không thấy cổng COM / Port bị xám
Máy tính không nhận ra bo. Kiểm tra theo thứ tự:
- Đổi cáp USB — cáp chỉ sạc (thiếu dây data) là nguyên nhân số một, chiếm quá nửa số ca
- Cài driver đúng chip: nhìn chip gần cổng USB — CP2102 cài driver Silicon Labs, CH340 cài driver WCH
- Windows: mở Device Manager, cắm bo, xem mục Ports (COM) có thiết bị mới hiện không; nếu hiện dấu chấm than vàng là driver lỗi
- Cắm thẳng vào máy, bỏ qua USB hub
- Thử cổng USB khác hoặc máy khác để loại trừ bo hỏng
2. "Failed to connect to ESP32: Timed out waiting for packet header"
Bo không vào chế độ nạp. Cách sửa:
- Khi IDE hiện "Connecting....", nhấn giữ nút BOOT trên bo đến khi bắt đầu chạy phần trăm
- Không được: giữ BOOT, nhấn thả EN, thả BOOT, rồi mới Upload
- Giảm Upload Speed xuống 115200 (Tools - Upload Speed)
- Rút mọi dây khỏi GPIO 0 và GPIO 2
- Bo thiếu tụ auto-reset (thường gặp bo giá rẻ): hàn thêm tụ 1-10 µF giữa EN và GND sẽ hết vĩnh viễn
3. "A fatal error occurred: MD5 of file does not match data in flash"
Dữ liệu nạp bị lỗi trên đường truyền:
- Đổi cáp USB ngắn hơn, chất lượng tốt hơn
- Giảm Upload Speed xuống 115200
- Rút các module đang ăn nguồn 3V3 của bo trong lúc nạp
- Nếu vẫn lỗi: flash có block hỏng — chạy erase flash bằng esptool rồi nạp lại
4. "Brownout detector was triggered" lặp vô hạn
Nguồn cấp không đủ — điện áp tụt dưới ngưỡng khiến chip tự reset:
- Đổi sang cổng USB khỏe hơn (cổng sau thùng máy thay vì cổng trước, bỏ hub)
- Đổi cáp ngắn và dày hơn (cáp dài mảnh gây sụt áp)
- Rút bớt module đang ăn nguồn từ bo, đặc biệt servo và còi — chúng phải có nguồn riêng
- Khi chạy pin: kiểm tra pin còn đủ áp, mạch ổn áp đủ dòng (ESP32 cần đỉnh ~500 mA lúc bật WiFi)
5. Boot loop - "rst:0x10 (RTCWDT_RTC_RESET)" lặp liên tục
Bo khởi động lại vòng vô hạn, Serial Monitor tràn thông báo reset:
- Rút hết dây GPIO — dây trên chân strapping (0, 2, 12, 15) làm hỏng trình tự boot; đặc biệt GPIO 12 bị kéo CAO là kinh điển
- Xem dòng lỗi ngay trước khi reset trong Serial Monitor: nếu là "Guru Meditation Error" thì lỗi nằm trong code (xem mục 8)
- Nguồn yếu cũng gây boot loop — làm các bước ở mục 4
6. "Sketch too big" hoặc tràn bộ nhớ khi biên dịch
Chương trình vượt kích thước phân vùng mặc định:
- Tools - Partition Scheme: chọn "Huge APP (3MB No OTA)" — hầu hết dự án học tập không cần OTA
- Xóa thư viện include thừa, tránh dùng đồng thời nhiều thư viện lớn (camera + web server + Bluetooth Classic)
- Chuỗi văn bản dài nên bọc trong F() hoặc chuyển vào PROGMEM
7. Nạp thành công nhưng Serial Monitor in ký tự loạn
Ký tự lạ dạng ô vuông hoặc dấu hỏi tràn màn hình:
- Chỉnh baud rate của Serial Monitor khớp với code — code
Serial.begin(115200)thì Monitor phải chọn 115200 - Vài dòng loạn ngay lúc nhấn reset là bình thường (log bootloader chạy ở 74880 baud), sau đó phải in đúng
- Loạn liên tục kèm reset: quay lại mục 4 và 5 — dấu hiệu nguồn yếu
8. "Guru Meditation Error: Core 1 panic'ed (LoadProhibited)"
Đây là lỗi runtime trong code, không phải lỗi nạp: chương trình truy cập vùng nhớ không hợp lệ.
- Đọc dòng "Backtrace" trong Serial Monitor, dùng ESP Exception Decoder xác định dòng code gây lỗi
- Thủ phạm quen thuộc: con trỏ NULL, truy cập mảng vượt biên, gọi hàm thư viện trước khi init (ví dụ dùng WiFi trước WiFi.begin)
- Chia nhỏ code, thêm Serial.println đánh dấu từng đoạn để khoanh vùng — kỹ thuật chi tiết trong bài Debug bằng Serial Monitor ở mục Kiến thức
9. Nạp được nhưng chương trình cũ vẫn chạy
- Nhấn nút EN (reset) — một số bo không tự reset sau nạp
- Kiểm tra Tools - Port: máy có nhiều cổng COM, có thể vừa nạp nhầm vào bo khác
- Kiểm tra dòng "Hash of data verified" trong log nạp — không có nghĩa là nạp chưa thành công
10. IDE báo "exec: esptool: not found" hoặc lỗi Python
Cài đặt gói board ESP32 bị hỏng giữa chừng:
- Boards Manager: gỡ gói esp32, khởi động lại IDE, cài lại
- Windows: kiểm tra antivirus có cách ly file esptool.exe không
- Xóa thư mục cache Arduino15 (giữ lại preferences.txt) rồi cài lại gói board
Bảng tra nhanh theo thông báo lỗi
| Thông báo | Nhóm nguyên nhân | Mục |
|---|---|---|
| No serial port / Port xám | Cáp, driver | 1 |
| Failed to connect... Timed out | Chế độ nạp | 2 |
| MD5 of file does not match | Đường truyền | 3 |
| Brownout detector was triggered | Nguồn yếu | 4 |
| rst:0x10 lặp liên tục | Chân strapping, nguồn | 5 |
| Sketch too big | Phân vùng flash | 6 |
| Ký tự loạn trên Monitor | Baud rate | 7 |
| Guru Meditation Error | Bug trong code | 8 |
Mẹo phòng lỗi từ đầu
- Mua cáp USB tốt ngay từ đầu và dán nhãn "cáp data OK" — tiết kiệm hàng giờ debug
- Tập thói quen rút dây GPIO 0, 2, 12 trước khi nạp, hoặc thiết kế mạch tránh hẳn các chân strapping (xem bài Sơ đồ chân ESP32 ở mục Kiến thức)
- Nạp thử chương trình Blink ngay khi mua bo mới để xác nhận bo và môi trường hoạt động
- Lớp học nên chuẩn hóa một loại bo (cùng chip USB) để driver và thao tác nạp thống nhất
Câu hỏi thường gặp
Phải giữ nút BOOT mỗi lần nạp có bình thường không?
Không hỏng gì nhưng bất tiện. Nguyên nhân là mạch auto-reset thiếu hoặc yếu trên bo giá rẻ. Sửa dứt điểm bằng tụ 1-10 µF giữa chân EN và GND, hoặc chọn bo chất lượng hơn cho lớp học.
Nạp code làm hỏng ESP32 được không?
Bản thân việc nạp không làm hỏng chip. Flash có tuổi thọ ~100.000 lần ghi — học sinh nạp 50 lần mỗi buổi cũng mất hàng chục năm mới chạm giới hạn. Hỏng bo chủ yếu do cấp sai nguồn hoặc chập mạch, không phải do nạp nhiều.
Vì sao bo chạy tốt bằng USB nhưng lỗi khi chạy pin?
Ba nghi phạm: nguồn pin sụt áp khi động cơ khởi động (bổ sung tụ, tách nguồn); mạch ổn áp không đủ dòng cho ESP32 lúc bật WiFi; hoặc module nào đó kéo chân strapping sai mức lúc cấp nguồn — thứ không xảy ra khi bo được reset qua USB.
Có công cụ nào kiểm tra bo ESP32 sống hay chết không?
Cắm USB: đèn nguồn đỏ phải sáng; sờ chip ESP32 không được nóng rát. Chạy esptool lệnh chip_id — nhận diện được chip nghĩa là phần lõi còn sống, vấn đề nằm ở driver/cáp/chế độ nạp. Không nhận kèm chip nóng rát: bo đã hỏng phần nguồn hoặc chip.
Tài nguyên tải về
Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.


