ESP32-C6-DevKitC-1 v1.2 Pinout & GPIO Reference

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

The ESP32-C6-DevKitC-1 v1.2 is Espressif’s entry-level board for the ESP32-C6-WROOM-1/1U module – a Wi-Fi 6 + BLE 5 + 802.15.4 (Thread/Zigbee) SoC with RISC-V core and 8 MB flash.

This guide is a pinout and GPIO cheat-sheet: which pins are safe, which are boot/USB/flash, and how to pick pins for ADC, I²C, SPI, UART, and the RGB LED.


ESP32-C6-DevKitM-1 - front

1. Board overview (DevKitC-1 v1.2)

Key hardware bits:

  • Module: ESP32-C6-WROOM-1 or -1U (8 MB SPI flash, PCB or external antenna)
  • USB:
    • USB-to-UART Type-C port (left)
    • Native ESP32-C6 USB Type-C port (right – USB 2.0 FS, USB-Serial/JTAG)
  • Power regulation: 5 V → 3.3 V LDO
  • J1/J3 pin headers: all GPIOs except internal flash bus broken out
  • BOOT button (enter download mode)
  • RESET (RST/EN) button
  • RGB WS2812 LED on GPIO8
  • J5 jumper for current measurement

All GPIOs are 3.3 V only (not 5-V tolerant). Use level shifting for 5-V peripherals.


2. Header pinout (J1 and J3)

From Espressif’s v1.2 user guide:

ESP32-C6-DevKitM-1 Pin Layout (click to enlarge)

J1 (left header, top→bottom as in docs)

J1 No.NameMain functions (short list)
13V33.3 V supply
2RSTEN / CHIP_PU – high = enable, low = reset
3(reserved in table, no pin name)
44MTMS, GPIO4, LP_GPIO4, ADC1_CH4, FSPIHD
55MTDI, GPIO5, LP_GPIO5, ADC1_CH5, FSPIWP
66MTCK, GPIO6, LP_GPIO6, LP_I2C_SDA, ADC1_CH6, FSPICLK
77MTDO, GPIO7, LP_GPIO7, LP_I2C_SCL, FSPID
80GPIO0, XTAL_32K_P, LP_GPIO0, ADC1_CH0
91GPIO1, XTAL_32K_N, LP_GPIO1, ADC1_CH1
108GPIO8 – drives RGB LED
1110GPIO10
1211GPIO11
132GPIO2, LP_GPIO2, ADC1_CH2, FSPIQ
143GPIO3, LP_GPIO3, ADC1_CH3
155V5 V supply (from USB or external)
16GGround
17NCNot connected

J3 (right header, top→bottom)

J3 No.NameMain functions
1GGround
2TXU0TXD, GPIO16, FSPICS0
3RXU0RXD, GPIO17, FSPICS1
415GPIO15
523GPIO23, SDIO_DATA3
622GPIO22, SDIO_DATA2
721GPIO21, SDIO_DATA1, FSPICS5
820GPIO20, SDIO_DATA0, FSPICS4
919GPIO19, SDIO_CLK, FSPICS3
1018GPIO18, SDIO_CMD, FSPICS2
119GPIO9
12GGround
1313GPIO13, USB_D+
1412GPIO12, USB_D−
15GGround
16NCNot connected

Strapping and special roles are described below.


3. Strapping pins – affect boot

ESP32-C6 uses several pins as strapping pins, sampled at reset to decide boot config. On this board:

Strapping pins: GPIO4 (MTMS), GPIO5 (MTDI), GPIO8, GPIO9, GPIO15

These control things like:

  • boot mode (flash vs UART download)
  • ROM log output
  • internal regulator/flash options

Practical rules:

  • Don’t hard-pull these pins low or high with strong external circuits at reset.
  • Avoid big capacitors, low-value resistors to GND, or weird level shifters on them.
  • You can use them after boot for normal I/O, but for beginners it’s simpler to avoid 4, 5, 8, 9, 15 for critical sensors/relays.

GPIO8 drives the RGB LED; the board’s resistor network is already designed not to break boot.


4. Safe GPIOs for everyday use

From the header tables plus strapping notes, a nice “safe pool” of GPIOs for digital I/O is:

0, 1, 2, 3, 6, 7, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23

These:

  • have no boot-strapping side effects (except 6/7 are fine in normal use)
  • aren’t tied to USB D± (12/13)
  • aren’t hard-wired to the RGB LED (8)

Notes:

  • GPIO16/17 (TX/RX) are used by the USB-to-UART bridge; best to keep them for Serial console/flashing.
  • GPIO18–23 double as SDIO / extra SPI CS pins, but for most projects they’re just perfectly good GPIOs.

5. ADC pins

ESP32-C6 has a 12-bit ADC with 8 channels. According to Espressif + community pinouts:

  • ADC1 channels:
    • GPIO0 → ADC1_CH0
    • GPIO1 → ADC1_CH1
    • GPIO2 → ADC1_CH2
    • GPIO3 → ADC1_CH3
    • GPIO4 → ADC1_CH4
    • GPIO5 → ADC1_CH5
    • GPIO6 → ADC1_CH6
    • (GPIO7 is often used as digital only in docs; check your SDK’s mapping if you need all 8)

Some third-party guides also list GPIO9 as ADC2, but Espressif’s official docs focus on ADC1 on 0–6.

Best practice:

  • For simple sensors, stick to GPIO0–3, 4, 6.
  • Avoid GPIO4 & 5 if you don’t like touching strapping pins; or use them only with high-value resistor dividers that don’t “fight” the boot levels.
  • Keep input voltage ≤ 3.3 V (or less, depending on attenuation you configure).

Example (Arduino-style):

const int ADC_PIN = 3; // GPIO3

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
}

void loop() {
  int raw = analogRead(ADC_PIN);
  float volts = raw * 3.3f / 4095.0f;
  Serial.printf("ADC raw=%d  V=%.2f\n", raw, volts);
  delay(500);
}

6. RGB LED on GPIO8

The DevKitC-1 includes a WS2812 addressable RGB LED connected to GPIO8.

  • Use Adafruit_NeoPixel or FastLED with data pin = 8.
  • It’s great for Wi-Fi status, errors, etc.
  • GPIO8 is a strapping pin, but the onboard circuit is already tuned; you just shouldn’t hang extra heavy loads on that pin.

Minimal example:

#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(); // off
}

void loop() {
  rgb.setPixelColor(0, rgb.Color(255, 0, 0)); // red
  rgb.show();
  delay(300);
  rgb.setPixelColor(0, rgb.Color(0, 255, 0)); // green
  rgb.show();
  delay(300);
  rgb.setPixelColor(0, rgb.Color(0, 0, 255)); // blue
  rgb.show();
  delay(300);
}

7. USB (native) vs USB-UART

This board is slightly unusual: it has two USB-C ports.

  1. USB-to-UART Type-C (“UART”)
    • Uses a USB-UART bridge chip.
    • Connected to GPIO16 (TX) and GPIO17 (RX).
    • Ideal for classic Serial flashing (esptool.py, Arduino) and Serial Monitor.
  2. ESP32-C6 native USB Type-C (“USB”)
    • Connected directly to GPIO12 (USB_D−) and GPIO13 (USB_D+).
    • Supports USB-Serial/JTAG, CDC, HID, etc.
    • When using native USB, treat GPIO12/13 as dedicated USB pins – don’t connect other circuitry.

DON’T use GPIO12/13 for anything except USB if you rely on native USB.


8. I²C pins

ESP32-C6’s I²C is fully routed via the GPIO matrix, so you can choose almost any free GPIO.

Nice, conflict-free combos on this board:

  • Option A (recommended):
    • SDA = GPIO6 (J1-6)
    • SCL = GPIO7 (J1-7)
  • Option B (if 6/7 are busy):
    • SDA = GPIO0
    • SCL = GPIO1

Avoid using strapping pins (4, 5, 8, 9, 15) or USB D± (12, 13) for I²C unless you know exactly what you’re doing.

Example (Arduino):

#include <Wire.h>

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

9. SPI pins

ESP32-C6 has multiple SPI controllers; the internal flash bus is separate. User SPI can be mapped to most GPIOs, but the FSPI-labeled pins are convenient:

Good SPI mapping on ESP32-C6-DevKitC-1:

  • SCLK = GPIO6 (FSPICLK, J1-6)
  • MOSI = GPIO7 (FSPID, J1-7)
  • MISO = GPIO2 or GPIO4 (FSPIQ / FSPIHD, J1-13 or J1-4)
  • CS = GPIO10 (FSPICS0 equivalent, J1-11 or alternative CS on 16–23)

Typical example:

// Example DC/CS assignments for a display or SPI sensor
#define PIN_SPI_SCLK  6
#define PIN_SPI_MOSI  7
#define PIN_SPI_MISO  2
#define PIN_SPI_CS    10

Because C6’s SPI is IO-matrixed, you can move these around if needed – just avoid USB D± and be cautious with strapping pins.


10. UART / Serial ports

  • UART0 is connected via the USB-UART bridge to GPIO16 (TX) / GPIO17 (RX) on J3.
    • This is the default Serial in Arduino / ESP-IDF logging.
  • Additional UARTs can be mapped to other GPIOs (e.g., 18/19 for RS-485 or GPS).

Example second UART:

HardwareSerial Serial1(1);

void setup() {
  Serial.begin(115200);                      // USB-UART on 16/17
  Serial1.begin(9600, SERIAL_8N1, 19, 18);  // RX=19, TX=18
}

11. Quick pin recipes

11.1 Classic Wi-Fi sensor node (I²C + ADC + RGB status)

Suggested mapping:

FunctionGPIONotes
I²C SDA6J1-6, safe, also ADC1_CH6
I²C SCL7J1-7
Analog sensor0ADC1_CH0
Extra digital in2Button / reed switch
Extra digital out10Relay / MOSFET
RGB LED8On-board WS2812

All of these avoid USB D± and keep strapping pins mostly untouched during boot.

11.2 Thread/Zigbee border router base

If you mostly care about radio + status LED:

  • Leave most GPIOs free.
  • Use GPIO8 for RGB, GPIO6/7 if you add I²C sensors later.
  • Keep UART on 16/17 for logs.

12. Cheat-sheet summary

  • Safest digital GPIOs:
    0, 1, 2, 3, 6, 7, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23
  • Avoid (boot / special):
    4, 5, 8, 9, 15 are strapping pins – only use if you know the boot implications.
  • USB pins:
    12 (USB_D−), 13 (USB_D+) – keep for native USB only.
  • ADC:
    Best on 0–3, 4, 5, 6 (ADC1 channels).
  • I²C default:
    SDA = 6, SCL = 7
  • SPI default:
    SCLK = 6, MOSI = 7, MISO = 2/4, CS = 10
  • Onboard RGB LED:
    GPIO8 (WS2812).

Follow this map and the ESP32-C6-DevKitC-1 v1.2 becomes a very predictable board for Wi-Fi 6 / BLE / Thread projects, without the usual “why won’t it boot / flash / show up on USB?” headaches.

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 *