ESP32-C3-DevKitM-1 Pinout & GPIO Reference

(Safe pins, ADC, I²C, SPI, UART, RGB LED)

The ESP32-C3-DevKitM-1 is Espressif’s tiny RISC-V dev board based on the ESP32-C3-MINI-1 / MINI-1U module – a very compact Wi-Fi + BLE module with 4 MB flash.

It’s designed to plug into a breadboard and expose almost all ESP32-C3 GPIOs on two 15-pin headers (J1 and J3). This guide focuses on which pins are safe to use, and how to wire ADC, I²C, SPI, UART and the onboard RGB LED.


ESP32-C3-DevKitM-1 (with the ESP32-C3-MINI-1 module) - front

1. Board overview

Key specs:

  • MCU: ESP32-C3 (single-core 32-bit RISC-V up to 160 MHz)
  • Wireless: 2.4 GHz Wi-Fi (802.11 b/g/n) + BLE 5 (LE)
  • Flash: 4 MB SPI flash
  • Power:
    • Micro-USB (default)
    • or 5V pin
    • or 3V3 pin
  • USB-to-UART bridge (for flashing + Serial Monitor)
  • BOOT button (enter download mode)
  • RST button (reset / EN)
  • Onboard RGB LED controlled via a single GPIO (WS2812-style)

All GPIOs are 3.3 V only (not 5 V tolerant).


ESP32-C3-DevKitM-1 (click to enlarge)

2. Power & control pins

From Espressif’s hardware reference:

  • 5V – USB 5 V rail; can be used as input if powering from an external 5 V source.
  • 3V3 – regulated 3.3 V from onboard LDO (or input if you supply your own 3.3 V).
  • GND – ground.
  • RST / EN / CHIP_PU – active-high enable; pulling LOW resets/powers down the chip.
  • BOOT – used together with reset to enter UART download mode.

You normally do not use RST or BOOT as GPIOs.


3. Pin headers J1 & J3

Espressif breaks out most GPIOs on J1 (left) and J3 (right). The exact order is given in the user guide tables.

High-level view (logical, not physical order):

  • GPIO0–GPIO10 – ADC-capable, general I/O.
  • GPIO18, 19 – USB D- / D+ (native USB) – not broken out on this board.
  • GPIO20, 21 – I/O + UART signals depending on config; at least one is usually used for the RGB LED on DevKitM-1 boards.

The ESP32-C3-MINI-1 module itself exposes 22 pads, but DevKitM-1 uses a subset to keep the board compact.


4. Safe GPIOs for general use

From the Espressif pin tables and module docs:

The following pins are good, boring choices for digital input/output, PWM, etc.:

  • GPIO0 – ADC1_CH0, also XTAL_32K_P (RTC), safe as GPIO/ADC.
  • GPIO1 – ADC1_CH1, XTAL_32K_N (RTC).
  • GPIO3 – ADC1_CH3, general purpose.
  • GPIO4 – ADC1_CH4, FSPIHD (can be used as GPIO when not re-routed).
  • GPIO6 – FSPICLK, but available as GPIO on DevKitM-1.
  • GPIO7 – FSPID, also good GPIO.
  • GPIO10 – FSPICS0, good as chip-select or general output.

These are the primary “safe” pool to start from.

Pins that need extra care

  • GPIO2 – ADC1_CH2 and strapping pin; level at reset selects boot mode.
  • GPIO8 & GPIO9 – also strapping pins (boot configuration).
  • GPIO5 – ADC2_CH0; ADC2 is shared with Wi-Fi, so reads can fail when Wi-Fi is active.

You can use these after boot, but:

  • Avoid strong pull-downs, big capacitors or heavy loads that could force them low at reset.
  • Expect ADC reads on GPIO5 to be less reliable under heavy Wi-Fi usage.

5. Boot / strapping pins

On ESP32-C3, the main strapping pins are:

  • GPIO2 – controls boot mode configuration.
  • GPIO8 – influences download-boot settings and logging.
  • GPIO9 – BOOT button is tied here; pulled up, button shorts to GND.

At reset, the ROM samples these pins to decide whether to:

  • Boot from flash (normal)
  • Enter serial download mode
  • Output boot messages, etc.

Rule of thumb:

For beginners, keep GPIO2, GPIO8, GPIO9 for internal use (BOOT button, LED) and don’t wire external circuitry that might drag them low at reset.


6. ADC pins

ESP32-C3 has ADC1 (5 channels) and ADC2 (1 channel):

  • ADC1: GPIO0, GPIO1, GPIO2, GPIO3, GPIO4
  • ADC2: GPIO5

Best practice:

  • Prefer GPIO0–4 for analog sensors (thermistor, LDR, potentiometer, etc.).
  • Use GPIO5 (ADC2) only if you understand the Wi-Fi conflict (reads can fail if Wi-Fi is busy).

Resolution is up to 12 bits (0–4095); usable voltage depends on attenuation (typically up to ~2.4–3.0 V). Keep inputs ≤ 3.3 V or use a resistor divider.


7. Onboard RGB LED

DevKitM-1 has a WS2812-style RGB LED on the board, marked “RGB”. It’s driven from a single GPIO (commonly GPIO8 or GPIO2 depending on revision/schematic).

  • It’s powered from 3.3 V.
  • To control colours you use a library like Adafruit_NeoPixel or FastLED.

Example (assuming LED on GPIO8):

#include <Adafruit_NeoPixel.h>

#define LED_PIN 8
#define LED_COUNT 1

Adafruit_NeoPixel rgb(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  rgb.begin();
  rgb.show(); // turn off
}

void loop() {
  rgb.setPixelColor(0, rgb.Color(255, 0, 0)); // red
  rgb.show();
  delay(500);

  rgb.setPixelColor(0, rgb.Color(0, 255, 0)); // green
  rgb.show();
  delay(500);

  rgb.setPixelColor(0, rgb.Color(0, 0, 255)); // blue
  rgb.show();
  delay(500);
}

Because this LED often shares a strapping GPIO, avoid adding extra external loads on that same pin.


8. I²C pins

The ESP32-C3 I²C peripheral is fully GPIO-matrixed, so you can choose almost any free GPIO.

Good default pairs on DevKitM-1:

  • Option 1 (recommended):
    • SDA = GPIO4
    • SCL = GPIO6
  • Option 2 (if 4/6 are busy):
    • SDA = GPIO1
    • SCL = GPIO3

Avoid GPIO2, 8, 9 for I²C unless you’re comfortable with strapping behaviour.

Arduino example:

#include <Wire.h>

void setup() {
  Wire.begin(4, 6);   // SDA, SCL
  Serial.begin(115200);
  Serial.println("I2C on GPIO4 (SDA), GPIO6 (SCL)");
}

void loop() {
  // read/write I2C sensors here
}

9. SPI pins

ESP32-C3’s SPI controller can route signals to most GPIOs, but the “FSPI” pins are particularly suited for high-speed SPI. On the DevKitM-1, these include:

  • GPIO6 – FSPICLK (SCLK)
  • GPIO7 – FSPID (MOSI)
  • GPIO4 – FSPIHD (can use as MISO)
  • GPIO10 – FSPICS0 (CS)

Suggested SPI mapping for user peripherals:

SignalGPIO
SCLKGPIO6
MOSIGPIO7
MISOGPIO4
CSGPIO10

This keeps everything on the same side of the board and away from the most sensitive boot pins.


10. UART / Serial

On DevKitM-1 the main USB-to-UART bridge is pre-wired to the ESP32-C3’s UART0, so you just call Serial.begin() and it “just works”. The TX/RX pads of UART0 are not meant as general GPIO on this board.

If you need an extra UART (e.g. for GPS, RS-485):

  • Map UART1 or remap UART0 to spare GPIOs such as GPIO7 (TX) and GPIO6 (RX).
  • Configure in Arduino with something like:
HardwareSerial Serial1(1);

void setup() {
  Serial.begin(115200);               // USB serial
  Serial1.begin(9600, SERIAL_8N1, 6, 7); // RX=GPIO6, TX=GPIO7
}

11. “Starter” pin recipe (safe template)

For a typical Wi-Fi sensor node with I²C sensor, ADC input and RGB status LED:

FunctionGPIONotes
I²C SDAGPIO4BME280 / SHT sensor etc.
I²C SCLGPIO6
Analog inputGPIO1ADC1_CH1
Extra digital outGPIO7Relay/MOSFET or SPI MOSI
Extra digital inGPIO3Button, reed switch
RGB LED (onboard)GPIO8With NeoPixel/FastLED

This combination:

  • Avoids heavy use of strapping pins at reset.
  • Keeps ADC on ADC1 (Wi-Fi-friendly).
  • Leaves GPIO0, 2, 5, 9, 10 available for expansion.

12. Quick cheat sheet

  • Safest general-purpose GPIOs:
    • 0, 1, 3, 4, 6, 7, 10
  • ADC inputs (ADC1):
    • 0, 1, 2, 3, 4
  • ADC2 (Wi-Fi-sensitive):
    • 5
  • Onboard RGB LED:
    • Usually GPIO8 (check silkscreen / schematic for your revision).
  • Boot-sensitive pins:
    • 2, 8, 9 – don’t pull strongly low at reset.
  • Nice I²C default:
    • SDA 4, SCL 6
  • Nice SPI default:
    • SCLK 6, MOSI 7, MISO 4, CS 10

Stick to these sets and the ESP32-C3-DevKitM-1 becomes a very predictable little board for IoT sensors, Home Assistant nodes, and BLE gadgets, without “why won’t it boot?” surprises.

Newsletter Updates

Enter your email address below and subscribe to our newsletter

Leave a Reply

Your email address will not be published. Required fields are marked *