The Seeed Studio XIAO ESP32-S3 is one of the most capable boards in the 21 × 17.8 mm XIAO format. It combines a dual-core 240 MHz ESP32-S3, 8 MB PSRAM, 8 MB flash, native USB, Wi-Fi, Bluetooth LE and lithium-battery charging while still exposing a practical D0–D10 header layout.
It is a much more powerful board than the XIAO ESP32-C3/C6 when you need memory, USB OTG, displays, cameras or heavier firmware. The trade-off is that the ESP32-S3 has a few important pin restrictions, and the XIAO battery circuit has some details that are easy to miss: the normal board cannot read its own battery voltage without extra wiring, battery-only operation does not power the 5 V pin, and the supplied external antenna should be installed for good Wi-Fi/Bluetooth performance.
This guide covers the standard Seeed Studio XIAO ESP32-S3. The XIAO ESP32-S3 Sense uses the same core board but adds a camera/microphone/SD expansion board. The newer XIAO ESP32-S3 Plus exposes more pins and has a different battery-monitoring arrangement, so do not blindly copy Plus-specific pinouts onto the original XIAO ESP32-S3.
XIAO ESP32-S3 Specifications
| Feature | Seeed XIAO ESP32-S3 |
|---|---|
| Processor | ESP32-S3R8, dual-core Xtensa LX7 |
| Maximum CPU clock | 240 MHz |
| PSRAM | 8 MB |
| Flash | 8 MB |
| Wi-Fi | 2.4 GHz 802.11 b/g/n |
| Bluetooth | Bluetooth Low Energy 5.0 / Bluetooth Mesh |
| Main header GPIO | 11 × D0–D10 |
| ADC-capable main pins | 9 |
| I²C | D4 SDA / D5 SCL by default |
| SPI | D8 SCK / D9 MISO / D10 MOSI by default |
| UART | D6 TX / D7 RX |
| USB | USB-C, native ESP32-S3 USB |
| Battery | 3.7 V Li-ion/LiPo pads with onboard charging |
| Typical deep sleep | 14 µA at 3.8 V in Seeed’s board test |
| Dimensions | 21 × 17.8 mm |
| Antenna | U.FL external Wi-Fi/BLE antenna connector |
The 8 MB PSRAM is a major reason to choose this board over C3/C6 XIAO variants. It gives the S3 enough memory for image buffers, larger displays, web interfaces and other projects that quickly exhaust internal SRAM.
For the wider S3 family, see our ESP32-S3 Boards, Modules & Variants Compared.
XIAO ESP32-S3 Pinout
The normal XIAO side headers expose D0 through D10. The labels are Arduino-style aliases; the actual ESP32-S3 GPIO numbers are:
| XIAO pin | ESP32-S3 GPIO | Default / useful functions | Notes |
|---|---|---|---|
| D0 / A0 | GPIO1 | GPIO, ADC, touch | Good general-purpose pin |
| D1 / A1 | GPIO2 | GPIO, ADC, touch | Good general-purpose pin |
| D2 / A2 | GPIO3 | GPIO, ADC, touch | ESP32-S3 strapping pin |
| D3 / A3 | GPIO4 | GPIO, ADC, touch | Good general-purpose pin |
| D4 / A4 | GPIO5 | I²C SDA, ADC, touch | Default SDA |
| D5 / A5 | GPIO6 | I²C SCL, ADC, touch | Default SCL |
| D6 | GPIO43 | UART TX, GPIO | Default TX |
| D7 | GPIO44 | UART RX, GPIO | Default RX |
| D8 / A8 | GPIO7 | SPI SCK, ADC, touch | Default SPI clock |
| D9 / A9 | GPIO8 | SPI MISO, ADC, touch | Default SPI MISO |
| D10 / A10 | GPIO9 | SPI MOSI, ADC, touch | Default SPI MOSI |
Seeed’s documentation also identifies underside/test/JTAG pads including GPIO39–GPIO42. For most projects, the standard D0–D10 footprint is what matters.
Which Pins Are Safest to Use?
The XIAO layout is unusually convenient because Seeed keeps many awkward S3 pins away from the normal side headers.
A good everyday starting group is:
D0 / GPIO1
D1 / GPIO2
D3 / GPIO4
D4 / GPIO5
D5 / GPIO6
D8 / GPIO7
D9 / GPIO8
D10 / GPIO9
D6/GPIO43 and D7/GPIO44 are also usable, but they are the default UART TX/RX pair, so avoid assigning them to permanent hardware if you need that serial port.
D2/GPIO3 deserves extra caution. GPIO3 is one of the ESP32-S3 strapping pins. It can operate normally after boot, but an external circuit forcing the wrong logic state during reset can affect startup behaviour. Use another GPIO first if the project does not need D2 specifically.
Where Are the Native USB Pins?
The ESP32-S3 native USB signals are fixed at:
GPIO19 = USB D-
GPIO20 = USB D+
On the XIAO ESP32-S3 these are already routed to the USB-C connector and are not part of the normal D0–D10 side-header assignment. That is a practical advantage over some larger S3 boards where GPIO19/20 are physically exposed and users accidentally reuse them.
The S3 contains both a USB Serial/JTAG controller and a USB OTG peripheral. They share the same internal USB PHY, so a project using TinyUSB/USB OTG can change how the USB connector behaves compared with the normal programming/serial configuration.
If USB disappears after a bad sketch, our ESP32-S3 USB Not Detected: Boot Mode and Upload Recovery guide covers the recovery process.
BOOT and RESET
The XIAO includes both BOOT and RESET buttons.
The BOOT button uses GPIO0, the standard ESP32-S3 boot strap. Holding GPIO0 low during reset enters the ROM download bootloader.
If an upload fails or the USB port disappears:
- Hold BOOT.
- Press and release RESET while BOOT remains held.
- Release BOOT.
- Select the new USB/serial port.
- Upload a simple Blink sketch.
Seeed also documents entering bootloader mode by holding BOOT while connecting the USB cable.
Onboard User LED
The onboard user LED is connected to GPIO21 and is active-low.
That means:
LOW = LED ON
HIGH = LED OFF
A simple Arduino test is:
const int LED_PIN = 21;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, LOW);
delay(500);
digitalWrite(LED_PIN, HIGH);
delay(500);
}
GPIO21 is therefore not part of the normal external D0–D10 pin set on the standard board—it is already serving the user LED.
I²C Pins
The standard XIAO mapping uses:
D4 = GPIO5 = SDA
D5 = GPIO6 = SCL
For most Arduino libraries, simply using Wire.begin() with the XIAO board profile will select the normal board mapping. You can also set the pins explicitly:
#include <Wire.h>
void setup() {
Wire.begin(5, 6); // SDA, SCL
}
void loop() {
}
This pair is suitable for sensors such as SHT40, BME280/BME688, BH1750 and ADS1115.
SPI Pins
The default XIAO SPI header assignment is:
D8 = GPIO7 = SCK
D9 = GPIO8 = MISO
D10 = GPIO9 = MOSI
Chip select is chosen separately from another available GPIO. For example:
#include <SPI.h>
const int CS_PIN = D3;
void setup() {
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);
SPI.begin(D8, D9, D10, CS_PIN);
}
void loop() {
}
The ESP32 GPIO matrix allows flexible routing, so these are convenient defaults rather than the only possible SPI pins.
UART Pins
Seeed assigns:
D6 = GPIO43 = TX
D7 = GPIO44 = RX
Because USB provides the normal development console, this hardware UART remains available for external devices such as GPS modules, Modbus/RS-485 transceivers and serial sensors.
ADC and Touch Pins
The standard board exposes nine convenient analogue/touch-capable pins:
D0 / GPIO1
D1 / GPIO2
D2 / GPIO3
D3 / GPIO4
D4 / GPIO5
D5 / GPIO6
D8 / GPIO7
D9 / GPIO8
D10 / GPIO9
This is significantly more analogue flexibility than a D1 Mini or many smaller boards.
As with every ESP32 ADC project, do not feed 5 V into a GPIO. The XIAO logic domain is 3.3 V.
Power Pins
| Pin | Function | Important note |
|---|---|---|
| 5V | USB VBUS / power input-output | No 5 V here when running only from battery |
| 3V3 | Regulated 3.3 V output | Seeed specifies up to 700 mA regulator output capability |
| GND | Common ground | Connect all external logic grounds here |
| BAT pads | 3.7 V rechargeable lithium cell | Observe polarity carefully |
Seeed states that the 5 V pin is USB VBUS. It can also be used as an external 5 V input, but Seeed recommends adding a diode between an external supply and this pin to avoid back-feeding the USB source.
Battery Power
The XIAO ESP32-S3 includes a power-management/charging circuit for a single-cell 3.7 V rechargeable Li-ion or LiPo battery.
The battery pads are on the rear of the board. According to Seeed:
- The negative battery pad is closest to the USB connector.
- The positive pad is farther from the USB connector.
- USB-C can power the board and charge the connected battery.
- The charge LED indicates charging state.
For the standard XIAO ESP32-S3, Seeed’s specification table lists approximately 50 mA fast charge and 3.8 mA trickle charge.
This is a relatively gentle charge rate. It is suitable for small cells, but a large 1000–2000 mAh battery will charge slowly.
Battery-Only Operation Does Not Provide 5 V
This is one of the most useful board-specific details.
When the XIAO is powered only from the battery, the 5 V/VBUS pin has no voltage.
So a project like this will fail on battery if the sensor is powered from 5 V:
USB connected:
XIAO works
5V sensor works
Battery only:
XIAO works
5V pin = off
5V sensor stops
Use 3.3 V-compatible sensors from the 3V3 rail or provide a separate boost converter if a peripheral genuinely requires 5 V.
Can the XIAO ESP32-S3 Read Its Own Battery Voltage?
Not directly on the standard XIAO ESP32-S3.
Seeed explicitly notes that the original XIAO ESP32-S3 does not dedicate a GPIO to battery-voltage measurement. There is no built-in divider routed from BAT to an ADC pin.
If you want battery percentage, add an external high-value divider from BAT to an ADC pin—or use a dedicated fuel-gauge IC.
Do not connect the battery directly to an ADC pin without a divider. A fully charged single-cell lithium battery can reach about 4.2 V, which is above the safe 3.3 V GPIO domain.
The newer XIAO ESP32-S3 Plus is different: Seeed exposes a dedicated ADC_BAT path on that board. That Plus-specific feature does not apply to the standard XIAO ESP32-S3 covered here.
Deep Sleep
Seeed publishes typical board-level power figures at a 3.8 V supply of approximately:
| Mode | Typical XIAO ESP32-S3 current |
|---|---|
| Modem sleep | 27 mA |
| Light sleep | 2 mA |
| Deep sleep | 14 µA |
That 14 µA value is very good for a development board, but it is a board-only baseline under Seeed’s test conditions. A finished sensor also includes pull-ups, regulator losses and the sleep current of every attached peripheral.
A simple timed deep-sleep example is:
#include "esp_sleep.h"
void setup() {
Serial.begin(115200);
delay(1000);
// Read sensors and transmit data here.
esp_sleep_enable_timer_wakeup(10ULL * 60ULL * 1000000ULL);
Serial.println("Sleeping for 10 minutes");
delay(100);
esp_deep_sleep_start();
}
void loop() {
}
For a long-runtime node, switch off or isolate sensors that draw current while the S3 sleeps.
External Antenna
The XIAO ESP32-S3 uses a small U.FL/IPEX-style external antenna connector. Seeed supplies an antenna and recommends installing it for good Wi-Fi/Bluetooth signal.
To fit the antenna, align one side of the tiny connector first and press the other side gently into place. Do not push sideways or pull the coax cable itself when removing it.
Seeed reports more than 100 m communication range under suitable conditions with the external antenna, but real Wi-Fi/BLE range depends heavily on antenna orientation, enclosure material, access point and local interference.
Arduino IDE Setup
Seeed uses Espressif’s official Arduino-ESP32 board package.
In Arduino IDE:
- Open File → Preferences.
- Add Espressif’s Arduino-ESP32 Boards Manager URL if it is not already installed.
- Open Tools → Board → Boards Manager.
- Install the latest stable esp32 by Espressif Systems package.
- Search the board list for XIAO.
- Select XIAO_ESP32S3.
- Select the USB port that appears when the board is connected.
Seeed states that XIAO ESP32-S3 board support requires Arduino-ESP32 2.0.8 or newer. In 2026 there is no reason to install such an old version for a new setup—use the current stable Espressif core unless an older project has a specific compatibility requirement.
Use the XIAO Board Profile Instead of Guessing S3 Memory Settings
The standard XIAO contains 8 MB flash and 8 MB PSRAM. Selecting the dedicated XIAO_ESP32S3 board profile is preferable to selecting a generic ESP32-S3 board and guessing the flash/PSRAM configuration.
Incorrect S3 memory settings can produce exactly the kind of faults that waste hours:
- PSRAM reports 0 bytes.
- Board resets during startup.
- Large camera/display allocations fail.
- USB disappears after boot.
- Only part of flash is available to partitions.
For generic S3 module memory configuration, see our ESP32-S3 Flash and PSRAM: N8R8 vs N16R8 guide.
Check That PSRAM Is Working
After the first upload, it is useful to verify the board sees the expected memory:
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("Flash: %u MB\n",
ESP.getFlashChipSize() / (1024 * 1024));
Serial.printf("PSRAM: %u MB\n",
ESP.getPsramSize() / (1024 * 1024));
Serial.printf("Free PSRAM: %u bytes\n",
ESP.getFreePsram());
}
void loop() {
}
A normal standard XIAO ESP32-S3 should report approximately 8 MB flash and 8 MB PSRAM, allowing for the way memory sizes are reported by the framework.
Simple I²C Sensor Example
This I²C scanner confirms the normal D4/D5 bus:
#include <Wire.h>
void setup() {
Serial.begin(115200);
delay(1000);
Wire.begin(D4, D5);
Serial.println("I2C scan");
for (uint8_t address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.printf("Found device at 0x%02X\n", address);
}
}
}
void loop() {
}
This is a useful first hardware test before adding a BME280, SHT40, BH1750 or other I²C sensor library.
XIAO ESP32-S3 vs XIAO ESP32-S3 Sense
The Sense uses the same 21 × 17.8 mm XIAO core footprint but adds a detachable expansion board containing camera, digital microphone and microSD support.
On the Sense expansion board:
- The microSD interface shares GPIO7/8/9 with the standard D8/D9/D10 SPI pins.
- The digital microphone uses GPIO41/42.
- The camera consumes a large group of internal GPIOs.
This matters when copying a standard XIAO pin example onto a Sense board with the expansion board installed: pins that look “available” on the ESP32-S3 datasheet may already be occupied internally.
XIAO ESP32-S3 vs XIAO ESP32-S3 Plus
The newer Plus version keeps the same 21 × 17.8 mm outline but exposes many more GPIOs through a bottom board-to-board connector and increases flash to 16 MB while retaining 8 MB PSRAM.
It also adds a dedicated ADC_BAT battery-voltage path, something the original XIAO ESP32-S3 lacks.
If you need significantly more pins or direct battery monitoring, the Plus deserves consideration. If you need the simplest established XIAO S3 board, the standard version remains excellent.
Common Problems
| Symptom | Likely cause / first check |
|---|---|
| No Wi-Fi or very poor BLE range | Install/check the external U.FL antenna |
| No serial/USB port after uploading | Bad firmware or USB configuration; enter BOOT mode |
| Board boots only when D2 circuit is disconnected | GPIO3 strapping level is being disturbed |
| Sensor works on USB but not battery | Peripheral is powered from the 5 V/VBUS pin |
| Battery percentage cannot be read | Standard XIAO S3 has no built-in BAT-to-ADC path |
| PSRAM reports 0 MB | Wrong board/memory settings or incorrect board selection |
| I²C device not detected | Check D4/GPIO5 SDA and D5/GPIO6 SCL plus pull-ups |
| UART peripheral conflicts with project | D6/D7 are default GPIO43/44 UART pins |
| Onboard LED logic seems backwards | GPIO21 user LED is active-low |
| Large camera workload resets board | Check power supply, PSRAM and peak current demand |
When Should You Choose XIAO ESP32-S3?
The XIAO S3 is an excellent choice for:
- Compact displays and LVGL interfaces.
- Camera and computer-vision experiments.
- USB HID/MIDI/custom USB devices.
- Wearables with significant local processing.
- Memory-heavy web applications.
- Rechargeable battery prototypes.
- Projects that need many analogue inputs in a tiny board.
If you specifically need Thread or Zigbee, choose the XIAO ESP32-C6 instead. The S3 has more CPU and memory, but it does not contain an IEEE 802.15.4 radio.
Final Pin Recommendations
| Need | Recommended XIAO pins |
|---|---|
| Simple digital I/O | D0, D1, D3, D4, D5, D8, D9, D10 |
| I²C | D4 SDA / D5 SCL |
| SPI | D8 SCK / D9 MISO / D10 MOSI + separate CS |
| UART | D6 TX / D7 RX |
| ADC | D0–D5 and D8–D10; avoid D2 if boot-state interaction matters |
| Touch | D0–D5 and D8–D10 |
| Avoid when possible | D2/GPIO3 for boot-sensitive external circuits |
The XIAO ESP32-S3’s pinout is one of its strengths: Seeed has put I²C, SPI, UART and nine analogue-capable pins onto a tiny but logical header layout while keeping native USB away from the normal side pins.
Related ESP32-S3 and XIAO Guides
- Seeed XIAO ESP32-C6: Pinout, Battery Power and ESPHome — the Thread/Zigbee-focused XIAO alternative.
- ESP32-S3 Boards, Modules & Variants Compared — full S3 board and memory comparison.
- ESP32-S3 Flash and PSRAM Settings — avoiding S3 flash/PSRAM configuration mistakes.
- ESP32-S3 USB Not Detected — BOOT mode and native USB recovery.
- ESP32-S3 DevKitC-1 Pinout & Safe GPIOs — full-size official S3 development board reference.
Official Resources
- Seeed Studio XIAO ESP32-S3 Getting Started — current pinout, battery, power and Arduino setup.
- Espressif ESP32-S3 GPIO documentation — strapping pins, ADC and USB pin restrictions.
- ESP32-S3 USB Device Stack — GPIO19/20 and USB OTG architecture.
- ESP32-S3 Serial/USB Connection Guide — native USB flashing and download mode.