XIAO ESP32-C3 Arduino Setup and Pinout
Share
Quick answer
For the XIAO ESP32-C3, install Espressif’s esp32 Arduino board package and select XIAO_ESP32C3. Use a USB-C data cable, not a charge-only lead. Its D0–D10 labels do not match the GPIO numbers: D10 is GPIO10, but D0 is GPIO2. Check the map before connecting anything.
This guide covers the Seeed XIAO ESP32C3, not the nRF52840, C6 or S3. Start with USB power and Seeed’s external-LED Blink example; leave batteries and extra peripherals until uploads work.

What you need before opening Arduino IDE
- A XIAO ESP32-C3 and its supplied external antenna. The UMT listing is not a pre-soldered-header version.
- A computer, Arduino IDE and a USB-C cable that carries data. A lit indicator is not proof that the cable can upload sketches.
- For Seeed’s first example: an external LED, an approximately 150Ω series resistor, and suitable connections. Breadboard use requires fitted headers, a breadboard and jumper wires.
Use 3.3V logic on the GPIO pins. The USB/5V power connection does not make signal pins 5V-tolerant. Do not connect a 5V sensor output directly to a GPIO; use a suitable level interface. Connect signal grounds, and disconnect power before changing wiring. Espressif’s ESP32-C3 datasheet gives the electrical limits; the 3V3 pin is a regulated output, not a spare 5V input.
For radio use, Seeed’s C3 Wi-Fi guide starts by connecting the included antenna to the board’s IPEX connector. With power disconnected, align the tiny connector carefully and seat it without pulling on the coax. Our XIAO antenna comparison explains replacement choices; you do not need to buy another antenna to start.
Install the Arduino board package and select the C3
- Install Arduino IDE. Open Preferences, then add the following stable package index to Additional Boards Manager URLs, keeping any existing entries:
https://espressif.github.io/arduino-esp32/package_esp32_index.json. - Open Boards Manager, search for esp32 and install the package maintained by Espressif Systems.
- Under Tools → Board, choose the esp32 package’s XIAO_ESP32C3 entry. Do not select a generic ESP32 board or a similarly named XIAO.
- Keep USB CDC On Boot: Enabled for Serial Monitor through USB-C. CDC means Communications Device Class, the USB serial connection; D6/TX and D7/RX are a separate UART connection.
- Connect the board with the data cable and select the port that appears under Tools → Port. Windows uses COM names; macOS and Linux use different device names. Your port need not be COM3.
This package URL comes from Espressif’s installation instructions. Its stable package index listed 3.3.12 at our 15 October 2026 source check; that is a package-version reference, not a claim that UMT tested this setup. Seeed’s getting-started page specifies the same board selection but does not pin a core version.
XIAO ESP32C3 pinout: D0–D10 to GPIO
GPIO means general-purpose input/output. ADC is the analogue-to-digital converter; PWM is pulse-width modulation. I²C uses SDA (data) and SCL (clock); SPI uses SCK (clock), MOSI (data out), MISO (data in) and SS (chip select). UART is the serial interface with TX (transmit) and RX (receive). These bus functions share the GPIO pins below.
The table combines Seeed’s C3 pin map and pin-allocation notes with Espressif’s 3.3.12 board definitions. Every row is a digital I/O/PWM-capable pin, but its analogue or bus role shares that same physical connection. These are not extra pins hiding under the table.
| Board label / GPIO | Analogue and shared functions | Practical restriction |
|---|---|---|
| D0 / GPIO2 | A0; ADC1_CH2 | Strapping pin: external circuitry can affect boot. |
| D1 / GPIO3 | A1; ADC1_CH3 | One of Seeed’s preferred ADC1 inputs. |
| D2 / GPIO4 | A2; ADC1_CH4; JTAG MTMS | ADC1 input; shares the JTAG function. |
| D3 / GPIO5 | ADC2_CH0; labelled A3 in Seeed hardware documentation; JTAG MTDI | ADC2 reliability warning. Core 3.3.12 does not define an A3 alias; prefer A0–A2. |
| D4 / GPIO6 | I²C SDA; JTAG MTCK | Shared data line when using I²C. |
| D5 / GPIO7 | I²C SCL; JTAG MTDO | Shared clock line when using I²C. |
| D6 / GPIO21 | UART TX / U0TXD | Boot messages drive this pin at startup; Seeed recommends output-only use. |
| D7 / GPIO20 | UART RX / U0RXD; default SPI SS alias in this core | Do not allocate UART RX and SPI chip select to it simultaneously. |
| D8 / GPIO8 | SPI SCK | Strapping pin; must be HIGH for download boot. |
| D9 / GPIO9 | SPI MISO; BOOT button | Strapping pin, pulled to ground by BOOT. Avoid a conflicting external driver. |
| D10 / GPIO10 | SPI MOSI | Seeed’s external Blink LED uses this pin; disconnect the LED when reallocating it to SPI. |
Start analogue work on A0, A1 or A2. Seeed warns that A3/ADC2 can suffer false sampling signals. An ADC label is not permission to apply any sensor voltage: keep signals within the chip’s documented analogue limits and chosen attenuation settings.
Keep boot-sensitive wiring simple. GPIO2, GPIO8 and GPIO9 are strapping pins sampled during boot. Seeed specifically warns that GPIO8 LOW together with GPIO9 LOW is an invalid download-boot combination. Its pin-multiplexing guide credits SeeedJP’s matsujirushi for testing and contributing the D6/D8/D9 allocation notes. It also explains D6’s startup output pulses: avoid using it for something that must remain quiet during reset.
For physical orientation, use Seeed’s original pinout sheet alongside its hardware overview. Read the board’s printed labels rather than counting contacts from a rotated photograph.
First upload: use Seeed’s external-LED Blink example
The C3 is not the nRF52840 with a different name. Seeed explicitly says there is no LED_BUILTIN available for its C3 Blink example. Its charge indicator is not a substitute for a sketch-controlled LED.
- With power disconnected, connect D10 through an approximately 150Ω series resistor to the LED anode; connect the LED cathode to GND. Follow the manufacturer’s wiring illustration and check LED polarity.
- Reconnect USB, select XIAO_ESP32C3 and the correct port, then open Seeed’s first Blink program. Use its D10 example rather than an unchanged generic built-in-LED sketch.
- Upload. Seeed describes the external LED switching on for one second and off for one second. That is the manufacturer’s documented result; UMT has not reproduced the hardware test.
Upload stuck or no serial port? Recover in this order
- Check the data cable, selected board and selected port first. A charge-only lead cannot be fixed in software.
- While connected to the computer, press RESET once. Retry the upload.
- If that fails, disconnect USB. Hold BOOT, reconnect USB while still holding it, then release BOOT. This is Seeed’s documented bootloader-entry sequence.
- Check the port menu again, select the connected board’s port and retry uploading. If attached peripherals affect D0, D8 or D9, disconnect power and remove that circuitry before another recovery attempt.
- After a manual download-mode upload, press and release RESET if the sketch does not start; reselect its port if it changes. Espressif’s USB CDC instructions document a manual reset after the first CDC flash.
These recovery steps are from Seeed’s getting-started troubleshooting section, not a UMT bench test. Do not borrow the nRF52840 guide’s double-reset/USB-drive procedure: that is a different board and bootloader. Seeed also notes that deep-sleep firmware can make the C3’s serial port disappear until the board wakes.
A documented Wi-Fi example: scan nearby networks
Once Blink works, use the station-mode network scanner in Seeed Studio’s C3 Wi-Fi guide. It lists nearby Wi-Fi access points through Serial Monitor, so you can check the upload and radio path before adding sensors or a cloud service. It does not create a hotspot or share an internet connection.
The documented hardware is a XIAO ESP32-C3, its included Wi-Fi/Bluetooth antenna, a USB-C data cable and a computer. No sensor, expansion board or battery is required. UMT carries the linked C3 board with antenna; the cable and computer are still needed.
Open Seeed Studio’s original Wi-Fi instructions and code and choose “Scan Wi-Fi access points” under Station Mode. Use its basic scan sketch with the Arduino ESP32 package’s WiFi library. Select XIAO_ESP32C3, keep USB CDC On Boot: Enabled, upload, then open Serial Monitor on the board’s port at 115200 baud.
Seeed describes scanning nearby networks; its sketch prints the count, network names and signal values, or “no networks found”. A zero count is a possible result, not proof of an upload failure. The page’s last-update credit is Spencer, 26 July 2024. It does not pin the exact IDE or core release used for this scan. This is a manufacturer example, not a UMT-tested build or a range benchmark.
The same source has a separate access-point example with an explicit overheating and burns warning. Use the station-mode scan for this first wireless exercise, not that hotspot example. We link to Seeed’s original instructions rather than republishing its complete tutorial, diagrams or code.
Still choosing a board? Read our XIAO ESP32-C3 vs ESP32-S3 comparison, including when C6 makes sense before wiring your project.
FAQ
Is D0 the same as GPIO0?
No. On this board D0 is GPIO2. Use the board aliases or the correct GPIO number consistently, and check whether a library expects one or the other.
Can I reuse an nRF52840 XIAO setup guide?
Not for package installation, LED assumptions or upload recovery. Our XIAO family overview explains the wider range; this page is the C3-specific route from installation to a first wireless example.