XIAO ESP32C5

Thumb-sized ESP32-C5 board by Seeed Studio with dual-band 2.4/5 GHz Wi-Fi 6, BLE 5, 8 MB PSRAM, USB-C and LiPo charging.

USB-C Native USB
XIAO ESP32C5 board
21 × 17.8 mm
ESP32-C5
RISC-V MCU
240MHz
clock
8MB
flash
384KB
SRAM
11· 1 ADC
GPIO
BLE 5.0+ WiFi
radio
On this page

Pinout

14 pins · 2.54 mm pitch
View:
XIAO ESP32C5 pinout diagram
PinGPIOLabelsStatusCapabilitiesNotes
11D0A0GPIO1LP_GPIO1safeadc · pwm
20D1GPIO0LP_GPIO0safepwm
325D2GPIO25strappingpwm
47D3SSGPIO7SDIO_DATA1strappingpwm
523D4SDAGPIO23safei2c · pwm
624D5SCLGPIO24safei2c · pwm
711D6TXGPIO11uartuart · pwm
8-5Vpower-5V power input/output
9-GNDground-
10-3V3power-3.3V output
1110D10MOSIGPIO10safespi · pwm
129D9MISOGPIO9safespi · pwm
138D8SCKGPIO8safespi · pwm
1412D7RXGPIO12uartuart · pwm

Start with these

9 pins with no boot or system involvement
D0A0D1GPIO0D4SDAD5SCLD6TXD10MOSID9MISOD8SCKD7RX

Freely assignable - no strapping, flash, USB or JTAG duties. Ideal first picks for buttons, sensors and LEDs.

Fine - with a little care

sampled at boot or shared with debug/serial
PinLabelWhat to knowRole
D2GPIO25Latched at reset to set SDIO clock-edge behaviour; avoid driving at boot unless configuring SDIO timing. Free as GPIO after reset.Strapping
D3GPIO7 (JTAG_SEL)Must be driven to a defined level by external circuitry at reset (never left floating) to select the JTAG source; free as GPIO afterwards.JTAG
These are recommendations, not hard rules - with the right pull-ups, timing and boot-state awareness most pins can be made to work. When in doubt, start green.
Pinout notes Across 14 pins (2.54 mm pitch), the XIAO ESP32C5 exposes 11 GPIO plus 5V, GND and 3V3 for power. Peripheral wiring is straightforward: I²C is mapped to SDA on…

Across 14 pins (2.54 mm pitch), the XIAO ESP32C5 exposes 11 GPIO plus 5V, GND and 3V3 for power.

Peripheral wiring is straightforward: I²C is mapped to SDA on GPIO23 and SCL on GPIO24; the SPI bus (MOSI, MISO, SCK, SS) is broken out in full; TX/RX on GPIO11 and GPIO12 cover serial logging and flashing.

Beyond plain digital I/O you get 1 ADC-capable pin for sensors and battery monitoring and PWM on every GPIO.

2 of the exposed pins carry boot-time or system duties on the ESP32-C5 (D2 and D3) - check the guidance above before wiring anything to them. D0, D1, D4, D5 and 5 more are free of any such role - the safest first picks.

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Native USB - shows up as a port right away, no driver needed. Not detected? Hold BOOT while plugging in.
2
Match & flash
Set the Tools options shown, then click Upload.
3
Verify it runs
The onboard user LED on GPIO27 blinks.
Set these in Tools · leave everything else at default
Arduino IDE 2.x - Tools Copy
Board: "XIAO_ESP32C5"
USB CDC On Boot: "Enabled"
Flash Size: "8MB (64Mb)"
Flash Mode: "QIO"
PSRAM: "QSPI PSRAM"
Partition Scheme: "8M with spiffs (3MB APP/1.5MB SPIFFS)" (default)
Upload Speed: "921600"
▸ every other Tools option - leave at default
Board: XIAO_ESP32C5
USB CDC On Boot: Enabled
Flash Size: 8MB (64Mb)
Flash Mode: QIO
PSRAM: QSPI PSRAM
Partition Scheme: 8M with spiffs (3MB APP/1.5MB SPIFFS)
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ XIAO_ESP32C5
blink.ino Copy
// blink the onboard user LED
void setup() {
  pinMode(27, OUTPUT);
}
void loop() {
  digitalWrite(27, HIGH); delay(500);
  digitalWrite(27, LOW);  delay(500);
}
board to selectseeed_xiao_esp32c5⧉ copy
platformio.ini Copy
[env:xiao-esp32c5]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = seeed_xiao_esp32c5
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.arduino.memory_type = qio_qspi
build_flags = -DBOARD_HAS_PSRAM
Find it: PlatformIO Home ▸ Boards, search seeed_xiao_esp32c5 - or type it after board =.
board to selectseeed_xiao_esp32c5⧉ copy
device.yaml Copy
esp32:
  board: seeed_xiao_esp32c5
  variant: esp32c5
  framework:
    type: esp-idf
psram:
  mode: quad
  speed: 80MHz

# blink - GPIO27
output:
  - platform: gpio
    pin: 27
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
Find it: search ESPHome's board list for seeed_xiao_esp32c5 (same ids as PlatformIO).
esptool doesn't pick board settings - a prebuilt .bin already has them baked in. This is just the raw flash command.
terminal Copy
esptool.py --chip esp32c5 --port /dev/ttyACM0 \
  --baud 921600 write_flash 0x2000 firmware.bin
--port = your /dev/tty* (macOS/Linux) or COMx (Windows).
Build details: sketch space 3342336 B · data 327680 B · QIO

Good to know

board-specific quirks worth 60 seconds
Checked on our board - September 2026 illustration
Checked on our board - September 2026
We ran a XIAO ESP32C5 on the bench with arduino-esp32 3.3.11 and read everything back over its native USB serial port. The serial monitor works with the Arduino menu left at its defaults: USB CDC On Boot ships Enabled. The user LED is GPIO27 and lights when the pin is driven LOW. Flash reports 8388608 bytes. PSRAM reports 0 bytes on the default menu and 8388608 bytes with Tools > PSRAM > Enabled. Battery sense: with…

We ran a XIAO ESP32C5 on the bench with arduino-esp32 3.3.11 and read everything back over its native USB serial port.

  • The serial monitor works with the Arduino menu left at its defaults: USB CDC On Boot ships Enabled.
  • The user LED is GPIO27 and lights when the pin is driven LOW.
  • Flash reports 8388608 bytes. PSRAM reports 0 bytes on the default menu and 8388608 bytes with Tools > PSRAM > Enabled.
  • Battery sense: with GPIO26 LOW the ADC on GPIO6 reads 0 mV; with it HIGH it reads half the BAT+ voltage.
  • Without an antenna a Wi-Fi scan found 3 networks, all around -93 dBm. With the bundled FPC antenna it found 20, and our router's 5 GHz SSID came in within a few dB of its 2.4 GHz signal.

Not tested here: 5 GHz range through walls, deep-sleep current, Zigbee and Thread. Those figures come from Seeed's and Espressif's documentation.

5 GHz Wi-Fi - what you gain and what it needs illustration
5 GHz Wi-Fi - what you gain and what it needs
The ESP32-C5 is the first Espressif chip that can join a 5 GHz network. The practical win is not speed - it is a clean channel. In a building where every neighbour's router sits on 2.4 GHz, a 5 GHz link drops far fewer packets and keeps latency steady. The trade-off is range: 5 GHz does not pass through walls as well, so a device two rooms away may still be better off on 2.4 GHz. Two things to get right: the…

The ESP32-C5 is the first Espressif chip that can join a 5 GHz network. The practical win is not speed - it is a clean channel. In a building where every neighbour's router sits on 2.4 GHz, a 5 GHz link drops far fewer packets and keeps latency steady. The trade-off is range: 5 GHz does not pass through walls as well, so a device two rooms away may still be better off on 2.4 GHz.

Two things to get right: the external antenna you attach must be dual-band (a 2.4 GHz-only antenna will connect on 2.4 GHz and struggle on 5 GHz), and your access point must broadcast the same SSID on both bands or you pick the band by SSID. One thing to check before judging 5 GHz range: Seeed's C5 spec table lists the bundled FPC antenna as a 2.4 GHz (2.9 dBi) part, while Seeed's listing for that same antenna (FPC Antenna A-01 for XIAO ESP32C3/C5, SKU 318020748) calls it a 2.4 GHz/5 GHz combo. If 5 GHz is weak, the antenna is the first thing to swap.

In arduino-esp32 3.3 the sketch code is unchanged - WiFi.begin() picks the band - and WiFi.setBandMode() lets you pin it to 5 GHz or 2.4 GHz only.

Reading the battery voltage illustration
Reading the battery voltage
A 3.7 V lithium cell solders to the pads on the back, and the board can measure it. Seeed's wiki: the XIAO ESP32C5 carries the SGM40567 charging chip plus a TPS22916CYFPR load switch for voltage acquisition, so the divider only draws current when you ask it to. BAT_VOLT_PIN is GPIO6 - the ADC input that sees the divided cell voltage. BAT_VOLT_PIN_EN is GPIO26 - drive it HIGH to switch the measurement circuit on. The…

A 3.7 V lithium cell solders to the pads on the back, and the board can measure it. Seeed's wiki: the XIAO ESP32C5 carries the SGM40567 charging chip plus a TPS22916CYFPR load switch for voltage acquisition, so the divider only draws current when you ask it to.

  • BAT_VOLT_PIN is GPIO6 - the ADC input that sees the divided cell voltage.
  • BAT_VOLT_PIN_EN is GPIO26 - drive it HIGH to switch the measurement circuit on.
  • The divider is two 100K resistors, so the reading is half the cell voltage - multiply by 2.
Arduino Example (from Seeed's wiki):
#include <Arduino.h>

void setup() {
  Serial.begin(115200);
  pinMode(BAT_VOLT_PIN, INPUT);           // ADC input
  pinMode(BAT_VOLT_PIN_EN, OUTPUT);
  digitalWrite(BAT_VOLT_PIN_EN, HIGH);    // enable the measurement circuit
}

void loop() {
  uint32_t Vbatt = 0;
  for (int i = 0; i < 16; i++) {
    Vbatt += analogReadMilliVolts(BAT_VOLT_PIN);   // read and accumulate
  }
  float Vbattf = 2 * Vbatt / 16 / 1000.0;   // 1:2 divider, mV to V
  Serial.println(Vbattf, 3);
  delay(1000);
}

analogReadMilliVolts() applies the chip's factory ADC calibration, so you skip the raw-count-to-volts maths. Seeed averages 16 samples to settle the noise; the C5's ADC range is 0~3300 mV, which is why the 1:2 divider is there.

8 MB PSRAM - off by default in Arduino IDE illustration
8 MB PSRAM - off by default in Arduino IDE
The module's 8 MB of PSRAM is disabled in arduino-esp32's default menu for this board. Set Tools → PSRAM → "Enabled" or ESP.getPsramSize() reports 0 and any large allocation fails. We measured it on a board here with arduino-esp32 3.3.11: 0 bytes on the default menu, 8388608 bytes once enabled. With PSRAM disabled the sketch still builds and runs, so check ESP.getPsramSize() at boot before you allocate a big…

The module's 8 MB of PSRAM is disabled in arduino-esp32's default menu for this board. Set Tools → PSRAM → "Enabled" or ESP.getPsramSize() reports 0 and any large allocation fails. We measured it on a board here with arduino-esp32 3.3.11: 0 bytes on the default menu, 8388608 bytes once enabled.

With PSRAM disabled the sketch still builds and runs, so check ESP.getPsramSize() at boot before you allocate a big buffer.

Specifications

ESP32-C5 · 21 × 17.8 mm · vs other ESP32 chips →
Compute
MCU
ESP32-C5 · RISC-V
Clock
240 MHz
SRAM · Flash
384 KB · 8MB · 8MB PSRAM
Radio
Wi-Fi
802.11 ax b/g/n
Bluetooth
5.0 LE
Antenna
u.FL
I/O
GPIO · ADC
11 · 1
UART · I²C · SPI
2 +1 LP · 1 +1 LP · 1
PWM
6 channels
Power
USB
USB-C
Serial
Native (CDC)
Boot address
0x2000
Electrical
Input
5V USB-C · 3.7V LiPo
Consumption
15µA sleep
Regulator
-
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
QIO · QIO
Sketch · Data
3.19 MB · 320 KB
17.8 mm21 mm
21 × 17.8 mm · pin pitch 2.54 mm
The XIAO ESP32C5 uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates. Flash mode is QIO with QIO boot mode. The maximum sketch size is 3.19 MB with 320 KB available for data.

About this board

At 21 × 17.8 mm it's among the smallest boards in the whole ESP32 family.

Inside sits the ESP32-C5 - a RISC-V part with dual-band 2.4/5 GHz Wi-Fi 6 plus Thread/Zigbee radios.

Around the module: 8MB PSRAM, Zigbee, battery charging (SGM40567) via Solder pads, status LEDs (User, Charge) and Reset/Boot buttons.

It flashes over native USB - no serial-converter driver needed.


The XIAO ESP32C5 is Seeed Studio's thumb-sized (21 x 17.8 mm) board for the ESP32-C5, Espressif's first chip with dual-band Wi-Fi 6. It joins 5 GHz networks as well as 2.4 GHz, which matters in flats and offices where the 2.4 GHz band is saturated, and it keeps Bluetooth 5 LE alongside. The C5 also carries an 802.15.4 radio for Zigbee and Thread.

Inside is a 240 MHz RISC-V core with 8 MB of flash and 8 MB of PSRAM. There is no antenna on the board: a u.FL connector takes an external one. Power comes over USB-C or from a 3.7 V lithium cell on the solder pads, with an SGM40567 charger and a charge LED; a user LED sits on GPIO27 and lights when the pin is driven LOW.

Programming runs through the C5's native USB - there is no separate serial chip - and arduino-esp32 3.3 lists the board as XIAO_ESP32C5 with USB CDC On Boot already Enabled, so Serial.print() reaches the serial monitor out of the box (set it to Disabled and Serial moves to the UART pins D6/D7). A crashed or deep-sleeping sketch takes the USB port down with it; holding BOOT while plugging in always brings it back. Seeed also sells a pre-soldered variant with the headers already fitted.
  • Dual-band Wi-Fi 6 (2.4 GHz and 5 GHz, 802.11 a/b/g/n/ac/ax) and Bluetooth 5 LE
  • 8 MB flash plus 8 MB PSRAM
  • Ultra-small XIAO footprint (21 x 17.8 mm), 11 GPIO on the headers
  • Ships with an external antenna for the u.FL connector
  • LiPo charging via the SGM40567 with a charge LED; battery voltage readable on GPIO6
  • [object Object]

Where to buy

prices are typical street prices
XIAO ESP32C5
XIAO ESP32C5
$6.90per unit, typical
As an Amazon Associate, ESPboards earns from qualifying purchases.
The Seeed Studio store link is an affiliate link - ESPboards may earn a commission on purchases, at no extra cost to you.

Resources