IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32-S3 Dual-Core – Bài 1: ESP32-S3 Là Gì? Nền Tảng AIoT & Firmware Hiện Đại

Vấn Đề Bạn Sẽ Gặp Nếu Dùng ESP32 Thông Thường Quá Lâu

Bạn đã làm được nhiều project với ESP32: đọc cảm biến, gửi MQTT, kết nối WiFi, điều khiển relay. Nhưng khi project lớn hơn, một số vấn đề bắt đầu xuất hiện:

  • loop() bị nghẽn: WiFi reconnect làm LCD giật, cảm biến bị delay
  • Không đủ RAM để chạy LVGL hoặc buffer camera
  • Muốn thêm USB CDC để debug nhưng board không hỗ trợ native
  • Cần chạy một mô hình AI nhỏ nhưng không biết chip hiện tại có vector instructions không
  • Firmware ngày càng phức tạp, khó tổ chức và khó debug

ESP32-S3 ra đời để giải quyết đúng những vấn đề này. Không phải ESP32-S3 là chip tốt hơn hoàn toàn, mà nó được thiết kế đúng cho các bài toán firmware hiện đại: đa nhiệm, hiển thị, xử lý tín hiệu và production-ready.

ESP32-S3 Là Gì?

ESP32-S3 là SoC (System on Chip) do Espressif sản xuất, ra mắt năm 2021. Điểm nổi bật so với dòng ESP32 gốc:

Thông sốESP32 (gốc)ESP32-S3
CPUXtensa LX6, 240 MHzXtensa LX7, 240 MHz
Số core22
Vector instructionsKhôngCó (SIMD cho AI/DSP)
SRAM tích hợp520 KB512 KB
PSRAM hỗ trợSPI PSRAMOctal SPI PSRAM (tốc độ cao hơn)
USBKhông nativeUSB OTG Full Speed native
BluetoothBLE 4.2BLE 5.0, Bluetooth Mesh
GPIO3445

Về mặt WiFi và BLE cơ bản, ESP32 và ESP32-S3 tương đương. Sự khác biệt lớn nằm ở CPU core thế hệ mới, USB nativekhả năng AI/DSP.

Tại Sao Dual-Core Quan Trọng?

Cả ESP32 và ESP32-S3 đều có 2 core, nhưng nhiều người dùng không khai thác được lợi thế này. Vấn đề không phải là có 2 core hay không — mà là bạn có tổ chức firmware để dùng được 2 core không.

Trong firmware Arduino đơn giản, mọi thứ chạy trên Core 1 và loop() xử lý tuần tự. Core 0 dành cho WiFi stack của Espressif. Khi bạn bắt đầu thêm LCD, camera, OTA, health monitoring… tất cả vẫn dồn vào Core 1 → nghẽn.

ESP32-S3 với Xtensa LX7 nhanh hơn LX6 khoảng 40% trên cùng tần số nhờ pipeline cải tiến và instruction cache 16 KB. Kết hợp với kiến trúc FreeRTOS đúng cách, 2 core có thể xử lý song song:

  • Core 0: WiFi stack, MQTT, sensor polling, health check
  • Core 1: LCD render, camera pipeline, UI, OTA

Bài 3 và Bài 4 sẽ đi sâu vào cách thiết kế điều này. Hiện tại, điều cần nhớ là: Dual-Core chỉ có giá trị khi firmware được thiết kế đúng.

PSRAM: Tại Sao Cần Và Khi Nào Không Cần

SRAM tích hợp của ESP32-S3 là 512 KB. Nghe nhiều, nhưng trong thực tế:

  • Một frame buffer 320×240 RGB565 = 150 KB
  • LVGL với font + widget tầm trung = 100–200 KB
  • WiFi stack + TLS buffer = 80–120 KB
  • Còn lại cho code = không nhiều

Board có PSRAM 8 MB giải quyết hoàn toàn bài toán này. Bạn có thể:

// Cấp phát bộ nhớ lớn từ PSRAM thay vì SRAM nội
uint8_t* framebuffer = (uint8_t*)ps_malloc(320 * 240 * 2);  // 150 KB từ PSRAM
if (!framebuffer) {
    Serial.println("Lỗi: không đủ PSRAM!");
    return;
}

Khi nào cần PSRAM:

  • LCD + LVGL
  • Camera frame buffer
  • Audio buffer lớn
  • AI model input buffer
  • Bất kỳ buffer nào > 50 KB

Khi nào không cần:

  • Project chỉ đọc sensor + MQTT
  • Không có LCD, camera, audio
  • ESP32-C3 hoặc ESP8266 đủ dùng

Khi mua board ESP32-S3 để học series này, hãy chọn board có 8 MB PSRAM và 16 MB Flash như ESP32-S3-DevKitC-1.

USB Native: Ứng Dụng Thực Tế

ESP32-S3 có USB OTG Full Speed (12 Mbps) tích hợp ngay trong chip. Đây không phải USB-UART bridge như CH340 hay CP2102 — đây là USB thực sự do ESP32-S3 xử lý.

Điều này mở ra các ứng dụng:

Mode USBỨng dụng
CDC (Serial)Debug qua USB không cần chip bridge
HID KeyboardMacro pad, shortcut controller
HID MouseCustom input device
MSC (Storage)Xuất file từ SD card qua USB
HostKết nối USB keyboard, mouse vào ESP32-S3
#include "USB.h"
#include "USBCDC.h"

USBCDC USBSerial;

void setup() {
    USB.begin();
    USBSerial.begin();
}

void loop() {
    // Gửi dữ liệu qua USB CDC thay vì UART thông thường
    USBSerial.println("Hello from ESP32-S3 USB CDC!");
    delay(1000);
}

Lưu ý: USB native chỉ hoạt động khi board dẫn chân D+ và D- ra connector USB đúng cách. Bài 7 sẽ đi sâu về USB OTG.

Vector Instructions Cho AI/DSP

Xtensa LX7 trong ESP32-S3 có thêm PIE (Processor Instruction Extensions) — về cơ bản là SIMD instructions cho phép xử lý nhiều phần tử vector trong một lệnh.

Espressif cung cấp 2 thư viện tận dụng điều này:

  • ESP-DSP: xử lý tín hiệu số — FFT, filter, dot product, convolution
  • ESP-NN: inference neural network nhỏ — classification, detection
#include "esp_dsp.h"

// FFT 512 điểm trên ESP32-S3 với SIMD
dsps_fft2r_fc32(fft_buffer, 512);
dsps_bit_rev_fc32(fft_buffer, 512);
dsps_cplx2reC_fc32(fft_buffer, 512);

Không nên kỳ vọng ESP32-S3 chạy model AI lớn. Giá trị thực nằm ở các tác vụ nhỏ: wake word, phát hiện anomaly cảm biến, phân loại đơn giản. Bài 8 sẽ benchmark và phân tích rõ giới hạn thực tế.

Kiểm Tra Board Của Bạn

Chạy đoạn code sau để xác nhận board ESP32-S3 đang hoạt động đúng:

#include <Arduino.h>
#include "esp_chip_info.h"
#include "esp_flash.h"

void setup() {
    Serial.begin(115200);
    delay(1000);

    // Thông tin chip
    esp_chip_info_t chipInfo;
    esp_chip_info(&chipInfo);
    Serial.printf("Chip: ESP32-S3, %d cores, WiFi%s%s\n",
        chipInfo.cores,
        (chipInfo.features & CHIP_FEATURE_BT) ? "+BT" : "",
        (chipInfo.features & CHIP_FEATURE_IEEE802154) ? "+802.15.4" : "");

    // Flash size
    uint32_t flashSize = 0;
    esp_flash_get_size(NULL, &flashSize);
    Serial.printf("Flash: %lu MB\n", flashSize / (1024 * 1024));

    // Heap và PSRAM
    Serial.printf("Free heap: %lu KB\n", ESP.getFreeHeap() / 1024);
    if (psramFound()) {
        Serial.printf("PSRAM: %lu MB tổng, %lu KB free\n",
            ESP.getPsramSize() / (1024 * 1024),
            ESP.getFreePsram() / 1024);
    } else {
        Serial.println("Cảnh báo: Không tìm thấy PSRAM!");
    }

    // Core đang chạy
    Serial.printf("Đang chạy trên Core %d\n", xPortGetCoreID());
    Serial.printf("Tần số CPU: %d MHz\n", getCpuFrequencyMhz());
}

void loop() {}

Output kỳ vọng trên ESP32-S3-DevKitC-1:

Chip: ESP32-S3, 2 cores, WiFi+BT
Flash: 16 MB
Free heap: 380 KB
PSRAM: 8 MB tổng, 8192 KB free
Đang chạy trên Core 1
Tần số CPU: 240 MHz

Khi Nào Chọn ESP32-S3?

Tình huốngChip phù hợp
LED blink, relay, MQTT đơn giảnESP32 hoặc ESP32-C3
LCD, LVGL, giao diện phức tạpESP32-S3
Camera (OV2640, OV5640)ESP32-S3
USB HID, CDC không cần chip bridgeESP32-S3
AI nhỏ: wake word, phân loạiESP32-S3
Audio processing, FFTESP32-S3
Firmware production, multi-taskESP32-S3
Chi phí thấp nhấtESP32-C3, ESP8266

Tổng Kết

Tính năngGiá trị thực tế
Dual-Core Xtensa LX7Phân tách task Network/UI, tránh blocking
PSRAM 8 MBFrame buffer, audio buffer, AI input
USB OTG nativeCDC, HID không cần chip bridge
Vector instructionsFFT, signal processing, AI nhỏ
GPIO 45 chânNhiều peripheral đồng thời

ESP32-S3 không phải chip tốt nhất cho mọi project. Nhưng nếu bạn cần LCD, camera, USB, đa nhiệm FreeRTOS hoặc xử lý tín hiệu — đây là lựa chọn phù hợp trong hệ sinh thái Arduino/IDF.

Bài tiếp theo: Bài 2 — Hiểu Đúng Kiến Trúc Dual-Core Xtensa LX7 Trên ESP32-S3 — đi sâu vào cách 2 core hoạt động, cache, pipeline và cách pinToCore() thực sự làm việc.


ESP32-S3 còn được dùng để xây dựng hệ thống nhận diện giọng nói offline. Xem thêm: Hướng dẫn wake word detection với ESP32-S3, WakeNet và ESP-SR.