Welcome to ESP32 Core Board repository
3. Dev Board Introduction
Dev Board Introduction
Dev Board Introduction1. Development Board Overview1.1 Core Board Photo1.2 Core Specifications at a Glance2. Module Details — ESP32-S3-WROOM-1-N16R82.1 Model Decoding2.2 Module Internal Structure3. Complete Pin Mapping3.1 Fixed-Function Pins (Cannot Be Repurposed)3.2 Available GPIOs (Allocate as Needed)3.3 I2C Device Address Table4. Peripheral Details4.1 Hardware Distribution Diagram4.2 Power System4.3 USB Interfaces4.4 CH340K USB-to-Serial4.5 WS2812 RGB LED4.6 Audio SystemES8311 Audio CodecNS4150 Amplifier4.7 SSD1306 OLED Display4.8 Buttons5. PSRAM and Flash Usage Notes5.1 Flash Partition Layout (MicroPython Firmware Example)5.2 PSRAM Memory Mapping6. Typical Development Wiring6.1 Basic Debugging Wiring6.2 Using USB OTG6.3 Connecting External I2C Devices
1. Development Board Overview
The core board used in this tutorial is the ESP32-S3 full-featured development board, equipped with the official Espressif module ESP32-S3-WROOM-1-N16R8 (16 MB Flash + 8 MB Octal PSRAM). It features an on-board ES8311 audio codec + MEMS microphone + NS4150 amplifier + speaker connector + SSD1306 OLED display + WS2812 RGB LED, making it a full-featured teaching platform covering GPIO, audio, display, USB, and wireless communication.
1.1 Core Board Photo

1.2 Core Specifications at a Glance
| Item | Specification |
|---|---|
| Main control module | ESP32-S3-WROOM-1-N16R8 |
| Flash | 16 MB (Octal SPI, N stands for Octal) |
| PSRAM | 8 MB (Octal SPI) |
| PCB antenna | On-board ceramic / PCB antenna (built into WROOM-1) |
| USB-to-serial | CH340K (USB-C connector), auto-download circuit |
| Native USB OTG | USB-C connector (GPIO19 / GPIO20), supports Device / Host |
| Audio codec | ES8311 (I2S full duplex + I2C control) |
| Amplifier | NS4150 (3W Class D, enabled by GPIO7) |
| Microphone | On-board MEMS analog microphone (sampled through the ES8311 ADC) |
| Speaker connector | 2-pin PH socket / solder pads |
| Display | SSD1306 128×32 monochrome OLED (I2C) |
| RGB LED | WS2812 × 1 (GPIO48, on-board LED) |
| Buttons | BOOT (GPIO0) + RST (EN) |
| Power supply | USB-C 5V → 3.3V LDO |
| Pin headers | 2.54 mm standard spacing, dual-row, breadboard compatible |
| Dimensions | Approx. 55 × 28 mm |
2. Module Details — ESP32-S3-WROOM-1-N16R8
2.1 Model Decoding
ESP32-S3-WROOM-1-N16R8│ ││ │││ ││ │└── R8: 8 MB Octal PSRAM│ ││ └──── R: with PSRAM│ │└──────16: 16 MB Flash│ └─────── N: Octal SPI Flash└──────── WROOM-1: built-in PCB antenna module
| Designator | Options | Meaning |
|---|---|---|
| Flash interface | N (Octal), Q (Quad) | N is faster and is the standard configuration for N16R8 |
| Flash capacity | 4 / 8 / 16 (MB) | N16 = 16 MB |
| PSRAM capacity | 2 / 8 (MB) | R8 = 8 MB |
| Antenna | WROOM-1 (on-board) / WROOM-1U (IPEX external) | This board uses WROOM-1 |
2.2 Module Internal Structure
xxxxxxxxxx┌─────────────────────────────────────────┐│ ESP32-S3-WROOM-1 module ││ ││ ┌──────────────┐ ┌──────────────┐ ││ │ ESP32-S3 │ │ Octal Flash │ ││ │ QFN56 chip │◄──►│ 16 MB │ ││ │ │ └──────────────┘ ││ │ │ ┌──────────────┐ ││ │ │◄──►│ Octal PSRAM │ ││ │ │ │ 8 MB │ ││ └──────┬───────┘ └──────────────┘ ││ │ ││ ┌──────┴───────────────────────────┐ ││ │ RF matching network + PCB antenna│ ││ └──────────────────────────────────┘ ││ ││ Dimensions: 18.0 × 25.5 × 3.1 mm ││ Operating temp: -40°C ~ +85°C │└─────────────────────────────────────────┘
Flash and PSRAM are connected to the ESP32-S3 through independent Octal SPI buses. PSRAM occupies GPIO33 ~ GPIO37 (internal connections), and these 5 GPIOs cannot be used for external wiring.
3. Complete Pin Mapping
3.1 Fixed-Function Pins (Cannot Be Repurposed)
| GPIO | Function | Description |
|---|---|---|
| 0 | BOOT button | Internal pull-up; pressed = 0; low at power-up enters download mode |
| 3 | JTAG TMS | USB Serial/JTAG controller |
| 7 | NS4150 PA enable | High level = amplifier on |
| 8 | I2S DOUT | ES8311 DAC data input (playback path) |
| 15 | I2S MCLK | ES8311 master clock (4.096 MHz @ 16 kHz sample rate) |
| 16 | I2S BCLK | I2S bit clock |
| 17 | I2S DIN | ES8311 ADC data output (recording path) |
| 18 | I2S WS | I2S word select (left/right channel switching) |
| 19 | USB OTG D- | Native USB OTG data line D- |
| 20 | USB OTG D+ | Native USB OTG data line D+ |
| 33 ~ 37 | PSRAM (Octal) | Internally connected to PSRAM in the module, not usable externally |
| 41 | I2C SDA | Shared I2C data line for ES8311 + SSD1306 |
| 42 | I2C SCL | Shared I2C clock line for ES8311 + SSD1306 |
| 43 | UART0 TX | Connected to CH340K RX, used for serial print output |
| 44 | UART0 RX | Connected to CH340K TX, used for serial input reception |
| 48 | WS2812 RGB LED | Single-wire data pin (RMT driven) |

Conflict warning: GPIO43/44 double as UART0 TX/RX. When using
printf()/ESP_LOGI(), these two pins cannot be used for other peripherals at the same time (PWM on GPIO43 will corrupt the serial output).
3.2 Available GPIOs (Allocate as Needed)
The following GPIOs are brought out to the pin headers and do not conflict with on-board peripherals, so they can be freely used in experiments:
| GPIO | Special function (optional) | Notes |
|---|---|---|
| 1 | ADC1_CH0 | Can be used as ADC / normal IO |
| 2 | ADC1_CH1 | Can be used as ADC / normal IO |
| 4 | ADC1_CH3 | Can be used as ADC / normal IO |
| 5 | ADC1_CH4 | Can be used as ADC / normal IO |
| 6 | ADC1_CH5 | Can be used as ADC / normal IO |
| 9 | — | Normal IO |
| 10 | FSPICS0 | Can be used as normal IO / SPI CS |
| 11 | FSPID | SPI MOSI / normal IO |
| 12 | FSPICLK | SPI CLK / normal IO |
| 13 | FSPIQ | SPI MISO / normal IO |
| 14 | — | Normal IO |
| 21 | — | Normal IO |
| 38 | — | Normal IO |
| 39 | — | Normal IO |
| 40 | — | Normal IO |
| 45 | — | Normal IO (Strapping pin: internal pull-down at power-up) |
| 46 | — | Normal IO (Strapping pin: internal pull-down at power-up) |
| 47 | — | Normal IO |
Strapping pin reminder: GPIO0, GPIO45, and GPIO46 latch their levels at chip power-up to determine the boot mode. GPIO0 is connected to the BOOT button; GPIO45/46 have internal pull-downs. If external pull-up resistors are added, evaluate whether they affect the boot process.
3.3 I2C Device Address Table
ES8311 and SSD1306 share the same I2C bus formed by GPIO41/42:
| Device | I2C address | Description |
|---|---|---|
| ES8311 audio codec | 0x18 | 7-bit address |
| SSD1306 OLED display | 0x3C | 128×32 monochrome |
4. Peripheral Details
4.1 Hardware Distribution Diagram

4.2 Power System
xxxxxxxxxxUSB-C (5V) ──→ resettable fuse ──→ Schottky diode ──→ 5V bus ──→ 3.3V LDO ──→ ESP32-S3 + peripherals│└──→ NS4150 amplifier (direct 5V)
| Power parameter | Specification |
|---|---|
| Input voltage | USB-C 5V (typical) |
| LDO output | 3.3V / approx. 800 mA |
| Amplifier power | Direct 5V (NS4150 supports up to 5.5V) |
| Resettable fuse | 500 mA (auto-disconnects on overcurrent, recovers when cooled) |
| Reverse polarity protection | Schottky diode (blocks reverse current) |
4.3 USB Interfaces
The board has two USB-C receptacles with independent functions:

| USB port | Function | Connection |
|---|---|---|
| USB-UART | Serial debugging + flashing + 5V power | CH340K → ESP32-S3 UART0 (GPIO43/44), with RTS/DTR auto-download circuit |
| USB OTG | Native USB OTG (Device / Host) | ESP32-S3 built-in USB Serial/JTAG controller (GPIO19 = D-, GPIO20 = D+), 3.3V power |
The USB OTG port connects directly to the ESP32-S3's built-in USB controller and does not supply power. This port can be used for USB applications such as USB microphone, USB MIDI, USB serial passthrough, and USB drive read/write. It is also the JTAG debug interface; hardware breakpoint debugging can be performed via
idf.py openocd.
4.4 CH340K USB-to-Serial
| Parameter | Description |
|---|---|
| Chip model | CH340K (by WCH) |
| Connection | USB-C ↔ UART0 (GPIO43=TX, GPIO44=RX) |
| Baud rate | Up to 2 Mbps (115200 / 921600 recommended for stability) |
| Auto-download | Supported (RTS → EN, DTR → BOOT, automatically triggers download mode via transistor circuit) |
| Drivers | Windows needs the CH340 driver; Linux kernel ≥ 3.x is driver-free; macOS needs a driver |
CH340K is a small-package variant of the CH340 series (10×10 mm), functionally identical to CH340G/C.
4.5 WS2812 RGB LED
| Parameter | Description |
|---|---|
| Model | WS2812-2020 (or compatible SK6812) |
| Quantity | 1 (on-board LED) |
| Data pin | GPIO48 |
| Power | 3.3V (from the LDO, not direct 5V) |
| Driving method | RMT peripheral (led_strip component) or bit-banged GPIO |
| Color format | GRB (green-red-blue), 8-bit each, 24-bit total |
| Reset code | ≥ 50 μs low level (T0H/T1H timing generated by the RMT hardware) |
The standard WS2812 power supply is 5V, but on this board it still lights up normally at 3.3V (slightly dimmer). For full brightness, use an external LED strip with its own 5V supply.
4.6 Audio System
A complete audio capture and playback chain centered on the ES8311:
x┌────────────── Recording path (MIC → ESP32) ──────────────┐│ ││ MEMS mic ──→ ES8311 ADC ──→ I2S DIN (GPIO17) ──→ ESP32 ││ │└──────────────────────────────────────────────────────────┘┌──────────── Playback path (ESP32 → SPK) ─────────────────────────┐│ ││ ESP32 ──→ I2S DOUT (GPIO8) ──→ ES8311 DAC ──→ NS4150 PA ──→ SPK ││ (GPIO7 enable) │└──────────────────────────────────────────────────────────────────┘┌────────────────── Control path (I2C) ──────────────────────────┐│ ││ ESP32 I2C (GPIO41/42) ──→ ES8311 (0x18) register config ││ ──→ SSD1306 (0x3C) display content ││ │└────────────────────────────────────────────────────────────────┘
ES8311 Audio Codec
| Parameter | Specification |
|---|---|
| Model | ES8311 (Everest) |
| Resolution | 24-bit ADC / DAC |
| Sample rate | 8 kHz ~ 96 kHz (16 kHz commonly used in this tutorial) |
| Interface | I2S (Philips standard format, 16-bit) + I2C control |
| Operating mode | Slave mode (MCLK / BCLK / WS provided by ESP32) |
| Analog input | MEMS microphone (single-ended / differential) |
| Analog output | Headphone / Line-out (connected to NS4150 amplifier) |
| MCLK | 4.096 MHz = 256 × 16 kHz (sample rate × 256) |
| I2C address | 0x18 (7-bit) |
NS4150 Amplifier
| Parameter | Specification |
|---|---|
| Model | NS4150 (Class D audio amplifier) |
| Output power | 3W @ 5V / 4Ω (typical) |
| Enable pin | GPIO7 (high level to enable) |
| Power supply | Direct 5V (not through the LDO) |
| Speaker connector | 2-pin 1.25 mm PH socket |
Power-on/off timing note: keep the PA off (GPIO7=0) before initializing the ES8311, then pull it high after initialization to avoid pop noise.
4.7 SSD1306 OLED Display
| Parameter | Specification |
|---|---|
| Driver IC | SSD1306 |
| Resolution | 128 × 32 pixels (monochrome white) |
| Interface | I2C (SDA=GPIO41, SCL=GPIO42) |
| I2C address | 0x3C (7-bit) |
| Size | Approx. 0.91 inch |
| Power | 3.3V |
SSD1306 and ES8311 share the same I2C bus (GPIO41/42). During initialization, create one
i2c_bus_handle and pass it to both.
4.8 Buttons
| Button | GPIO | Default state | Pressed level | Function |
|---|---|---|---|---|
| BOOT | GPIO0 | Pulled high | Low (0) | At runtime = user button; low at power-up = enter download mode |
| RST | EN (CHIP_PU) | Pulled high | Low (0) | Hardware reset (bypasses the program, directly pulls the chip EN pin low) |
Manual download mode: hold BOOT → tap RST → release BOOT. The auto-download circuit triggers this sequence automatically via RTS/DTR signals, so manual operation is generally unnecessary.

5. PSRAM and Flash Usage Notes
5.1 Flash Partition Layout (MicroPython Firmware Example)
The MicroPython firmware has a built-in partition table. After flashing, the remaining space is automatically used as the /flash file system. Typical layout:
xxxxxxxxxx0x000000 ┌──────────────────┐│ Bootloader │ ~ 16 KB0x008000 ├──────────────────┤│ Partition Table │ ~ 4 KB0x009000 ├──────────────────┤│ MicroPython │ ~ 1.5 MB (Python interpreter + hardware drivers)│ firmware │├──────────────────┤ ← firmware end address ≈ 0x1A0000│ LittleFS │ ~ 14 MB (/flash file system, stores .py scripts)│ file system │0x1000000└──────────────────┘ ← end of 16 MB Flash
5.2 PSRAM Memory Mapping
The 8 MB Octal PSRAM is mapped into the ESP32-S3's external address space. After enabling CONFIG_SPIRAM, it can be dynamically allocated in FreeRTOS with the MALLOC_CAP_SPIRAM flag. After flashing the MicroPython firmware, PSRAM is automatically available (enabled in the GENERIC_S3_SPIRAM_OCT firmware). At the Python level, use gc.mem_free() to view remaining memory (SRAM only); PSRAM is managed automatically by the interpreter internally.
6. Typical Development Wiring
6.1 Basic Debugging Wiring
xxxxxxxxxxESP32-S3 dev board ── USB-C cable ──→ PC USB port (UART port)
No external wiring needed; one USB cable handles power + serial print + flashing.
6.2 Using USB OTG

xxxxxxxxxxESP32-S3 dev board ── USB-C cable ──→ PC USB port (OTG port)↑enable USB Device feature in code
The OTG port does not supply power; the board must be powered simultaneously through the UART port (or via 5V/GND on the pin headers).
6.3 Connecting External I2C Devices
The on-board I2C bus already has ES8311 + SSD1306 attached. External devices can be connected in parallel to GPIO41 (SDA) and GPIO42 (SCL) on the pin headers. Note the following:
The external device's I2C address must not conflict with
0x18(ES8311) or0x3C(SSD1306)Pull-up resistors are provided by the on-board devices; no additional pull-ups are needed for external devices
Bus speed recommended ≤ 400 kHz (Fast Mode)