ESP32, ESP32-S3, C3, C6 khác nhau thế nào: so sánh thông số, chọn chip theo việc, lưu ý chuyển code
So sánh ESP32, ESP32-S3, ESP32-C3, ESP32-C6 về nhân CPU, Wi-Fi, Bluetooth, USB, chân, DAC; gợi ý chọn chip theo việc, những điểm dễ vấp khi chuyển code, chương trình in thông tin chip.
"ESP32" ngày nay là cả một họ chip: ESP32 đời đầu, ESP32-S3, ESP32-C3, ESP32-C6 và vài dòng mới hơn. Chúng dùng chung công cụ lập trình (Arduino, ESP-IDF, MicroPython), nhưng khác nhau về nhân CPU, Wi-Fi, Bluetooth, USB, số chân và các khối ngoại vi. Bài này so sánh bốn dòng phổ biến nhất, chỉ ra những điểm dễ vấp khi chuyển chương trình từ dòng này sang dòng khác, gợi ý cách chọn theo việc, và một chương trình in thông tin chip chạy được trên cả bốn.
1. So sánh bốn dòng

- ESP32 (đời đầu): hai nhân 240 MHz, là dòng duy nhất trong bốn dòng có Bluetooth Classic (dùng cho tai nghe, loa, cổng Serial Bluetooth) và DAC 8 bit. Nhiều tài liệu, ví dụ nhất; bo DevKit V1 rẻ, dễ mua. Không có USB trong chip: bo phải có chip chuyển USB – Serial (CP2102, CH340).
- ESP32-S3: hai nhân 240 MHz, thêm lệnh vector giúp chạy mô hình AI nhỏ nhanh hơn, có giao tiếp camera và màn hình song song, USB OTG (làm bàn phím, chuột, ổ nhớ USB). Nhiều module kèm PSRAM 8 MB. Chỉ có BLE, không có Bluetooth Classic.
- ESP32-C3: một nhân RISC-V 160 MHz, ít chân (22 GPIO), nhỏ, rẻ, tiết kiệm điện. Có USB để nạp và gỡ lỗi ngay trong chip. Đủ cho cảm biến, relay, gửi dữ liệu.
- ESP32-C6: một nhân RISC-V 160 MHz kèm một nhân phụ tiết kiệm điện, Wi-Fi 6 (2,4 GHz) và 802.15.4 cho Thread, Zigbee. Hợp với thiết bị nhà thông minh chuẩn Matter.
Ngoài ra còn ESP32-S2 (một nhân, có USB, không Bluetooth), ESP32-H2 (không Wi-Fi, chỉ BLE và 802.15.4), ESP32-C5 (Wi-Fi 6 hai băng tần 2,4 và 5 GHz) và ESP32-P4 (hiệu năng cao, không có vô tuyến). Với người mới và phần lớn dự án học tập, bốn dòng trong bảng là đủ.
2. Chọn chip theo việc

Đừng chọn theo con số lớn nhất: chip mạnh hơn thường đắt hơn, ít ví dụ hơn và bo mạch khó mua hơn. Một dự án đọc cảm biến, đóng relay, gửi dữ liệu lên điện thoại chạy tốt trên ESP32 đời đầu hoặc ESP32-C3. Chỉ chuyển sang S3 hay C6 khi thật sự cần thứ mà chúng có.
3. Những điểm dễ vấp khi chuyển dòng
| Thứ đang dùng trên ESP32 | Trên S3, C3, C6 |
|---|---|
dacWrite(), GPIO25/26 làm DAC | Không có DAC: dùng PWM có lọc, hoặc I2S tới chip DAC/khuếch đại |
BluetoothSerial (Bluetooth Classic) | Không có: chuyển sang BLE (ví dụ dịch vụ UART qua BLE) |
touchRead() | S3 có (thang số khác); C3, C6 không có |
| Số chân GPIO, chân ADC | Khác hoàn toàn: đọc lại sơ đồ chân của bo mới |
Serial qua chip USB – Serial | Bo dùng USB của chip: bật "USB CDC On Boot" để Serial đi qua cổng USB, và chờ máy tính nhận cổng sau khi khởi động |
xTaskCreatePinnedToCore(…, 1) | C3, C6 chỉ có một nhân: dùng nhân 0 hoặc tskNO_AFFINITY |
4. Chương trình in thông tin chip
Chương trình dùng esp_chip_info() của ESP-IDF và các hàm ESP.get…() của Arduino để in dòng chip, phiên bản, số nhân, tần số, các loại vô tuyến có trong chip, dung lượng flash, PSRAM, địa chỉ MAC. Chọn đúng bo trong Arduino IDE (ESP32 Dev Module, ESP32S3 Dev Module, ESP32C3 Dev Module, ESP32C6 Dev Module…) rồi nạp; mã nguồn không cần sửa.
// PYWORLD.VN - In thông tin chip ESP32 đang cắm: dòng chip, số nhân, tần số, Wi-Fi, Bluetooth, Thread/Zigbee, flash, PSRAM, địa chỉ MAC
// Cùng một chương trình chạy được trên ESP32, ESP32-S3, ESP32-C3, ESP32-C6: chỉ cần chọn đúng bo trước khi nạp
// Không cần thư viện ngoài
#include <esp_chip_info.h>
void setup() {
Serial.begin(115200);
delay(1500); // ESP32-S3, C3, C6 dùng cổng USB của chip: chờ máy tính nhận cổng
esp_chip_info_t chip;
esp_chip_info(&chip);
Serial.printf("Chip: %s, ban %u.%u\n", ESP.getChipModel(), chip.revision / 100, chip.revision % 100);
Serial.printf("Nhan: %u, tan so %lu MHz\n", chip.cores, (unsigned long)ESP.getCpuFreqMHz());
Serial.printf("Wi-Fi 2.4 GHz: %s | Bluetooth LE: %s | Bluetooth Classic: %s | 802.15.4 (Thread, Zigbee): %s\n",
chip.features & CHIP_FEATURE_WIFI_BGN ? "co" : "khong", chip.features & CHIP_FEATURE_BLE ? "co" : "khong",
chip.features & CHIP_FEATURE_BT ? "co" : "khong", chip.features & CHIP_FEATURE_IEEE802154 ? "co" : "khong");
Serial.printf("Flash: %lu MB%s | PSRAM: %s\n", (unsigned long)(ESP.getFlashChipSize() >> 20),
chip.features & CHIP_FEATURE_EMB_FLASH ? " (trong chip)" : "",
psramFound() ? String(String(ESP.getPsramSize() >> 20) + " MB").c_str() : "khong co");
uint64_t mac = ESP.getEfuseMac();
Serial.printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", (uint8_t)mac, (uint8_t)(mac >> 8), (uint8_t)(mac >> 16), (uint8_t)(mac >> 24),
(uint8_t)(mac >> 32), (uint8_t)(mac >> 40));
Serial.printf("Heap trong: %lu byte | Chuong trinh: %lu byte\n", (unsigned long)ESP.getFreeHeap(), (unsigned long)ESP.getSketchSize());
}
void loop() {}
5. Kết quả mong đợi

Chương trình hữu ích khi mua bo về mà không chắc chip bên trong là gì, hoặc để biết bo có PSRAM không trước khi làm dự án camera, màn hình. Địa chỉ MAC in ra là duy nhất cho mỗi chip, dùng được để phân biệt nhiều thiết bị trong cùng một hệ thống.
6. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Serial Monitor trống trên bo S3, C3, C6 | Bo dùng USB của chip, chưa bật USB CDC On Boot | Bật USB CDC On Boot; hoặc cắm cổng USB-UART nếu bo có hai cổng |
| Nạp báo "This chip is ESP32-S3, not ESP32" | Chọn sai loại bo trong Arduino IDE | Chọn bo đúng dòng chip |
Lỗi biên dịch dacWrite, BluetoothSerial | Chip mới không có DAC, Bluetooth Classic | Đổi cách làm như bảng ở mục 3 |
| Bo S3, C3 không vào chế độ nạp | Chương trình cũ chiếm cổng USB hoặc treo | Giữ nút BOOT, nhấn RESET, thả BOOT rồi nạp |
| Chương trình chạy khác trên C3 | Gán task vào nhân 1, dùng chân không tồn tại | Sửa nhân, sửa số chân theo bo mới |
7. Xem thêm
- ESP32 DevKit V1 30 chân và 38 chân: bo ESP32 đời đầu dễ học nhất.
- Điều khiển relay bằng điện thoại qua Bluetooth: ví dụ dùng Bluetooth của ESP32.
- Các bài FreeRTOS, PSRAM, bảng phân vùng trong cùng loạt ESP32 nâng cao.
Xem thêm