The ESP32-C6 is the chip Espressif built for the Matter era, and it shows the moment you look at what it packs into a $5 module. Where the original ESP32 and even the newer ESP32-S3 stop at WiFi 4 and Bluetooth, the C6 adds WiFi 6, Bluetooth 5.3 LE, and an 802.15.4 radio for Zigbee and Thread -- three wireless standards on one chip, which is exactly what a Thread border router or a Matter-certified smart-home sensor needs. It's also the chip Espressif themselves point to as the successor for new WiFi designs going forward, which means the pinout details here are worth learning properly rather than treating as a side note to the classic ESP32.
It's also a genuine architecture change from the classic ESP32. Instead of a dual-core Xtensa chip, the C6 runs a single-core RISC-V processor at 160MHz for your application, plus a second, much smaller RISC-V core dedicated to low-power tasks -- handling sensor polling or radio wake-ups while the main core stays asleep. That low-power core is a big part of why C6 boards post such good deep-sleep numbers, and it's not something a classic ESP32 or even an S3 has.
This guide walks through the ESP32-C6 DevKitC-1, Espressif's own reference board and the layout most third-party C6 boards follow closely -- GPIO numbering, ADC, PWM, the radio stack, and the strapping pins worth knowing before wiring anything permanent.
GPIO Pins and Numbering
Like every ESP32 variant, the C6 doesn't use a flat Arduino-style pin count -- everything is addressed by GPIO number, and which GPIOs actually reach a header depends on the specific devkit. Espressif's own reference board, the ESP32-C6-DevKitC-1, breaks out GPIO0 through GPIO23, giving roughly 22-23 usable pins once a few are set aside for their fixed internal roles.
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
Strapping Pins -- The Exact List
This is worth getting precisely right, since guessing wrong here is the most common reason a custom C6 board fails to boot. According to Espressif's own datasheet, the C6 has five strapping pins: GPIO4, GPIO5, GPIO8, GPIO9, and GPIO15. Of these, boot mode itself is controlled specifically by GPIO8 and GPIO9:
| GPIO8 | GPIO9 | Result |
|---|---|---|
| Any value | HIGH (default) | Normal SPI flash boot -- runs your program |
| HIGH | LOW | Joint Download Boot (USB or UART flashing mode) |
| LOW | LOW | Invalid combination -- triggers unexpected behavior |
GPIO9 carries an internal pull-up, so leaving it unconnected boots normally by default -- this is why the BOOT button on most C6 devkits wires directly to GPIO9, pulling it low only while held. GPIO8 also controls ROM message printing over the console. GPIO4, GPIO5, and GPIO15 have secondary strapping roles (JTAG-related signaling and voltage configuration) that matter far less in everyday projects, but the safest practice on a custom PCB is still to avoid loading any of the five with external circuitry that could hold them in an unexpected state during the brief power-on window.
Reserved and Special-Function Pins
A few more pins are worth flagging before treating the chip's full GPIO range as fair game. GPIO12 and GPIO13 are used by the USB-Serial-JTAG peripheral by default -- exactly the connection most devkits use for flashing and the Serial Monitor, so repurposing them removes that capability unless it's reconfigured. GPIO24 through GPIO30 are typically wired to onboard SPI flash on modules that include it, and Espressif's own guidance is not to use them for anything else.
ADC Pins
The C6 exposes analog input on GPIO0 through GPIO6, feeding a single 12-bit ADC (ADC1) -- a simpler setup than the classic ESP32's dual-ADC-with-WiFi-conflict arrangement, since the C6 doesn't have the same ADC2/radio sharing problem that plagues the older chip.
int reading = analogRead(0); // GPIO0, ADC1_CH0
That's seven ADC-capable pins in total, which comfortably covers most sensor projects without needing to fall back on an external ADC. Because GPIO0 and GPIO1 are also strapping-adjacent for related low-power functions in some board designs, double-check your specific devkit's silkscreen before committing an analog sensor to the very lowest-numbered pins on a design meant to run unattended.
PWM
PWM on the C6, like every modern ESP32 variant, isn't tied to specific pins -- the LEDC (LED Control) peripheral can route a PWM signal to essentially any GPIO in software.
ledcAttach(4, 5000, 8); // pin, frequency, resolution
ledcWrite(4, 128); // ~50% duty cycle at 8-bit resolution
This is a real departure from Arduino-style boards where PWM is hardwired to a fixed set of pins -- on the C6 (and the rest of the ESP32 family), PWM capability follows wherever you assign it, up to six independent channels active at once through the LEDC peripheral.
The Low-Power (LP) Core
This is the C6's standout feature and something no classic ESP32 or S3 has: a second, dedicated RISC-V core running at up to 20MHz that can stay active while the main HP (high-performance) core sleeps. The LP core can poll a sensor over I2C, watch a GPIO for a wake condition, or run simple logic entirely on its own -- only waking the main core when something actually needs the full application to run. For a battery-powered sensor that mostly just watches for a trigger, this is the difference between days and months of battery life, and it's programmed through ESP-IDF's ulp-lp-core component rather than the standard Arduino sketch flow, which is worth knowing before assuming it works exactly like a second main-core task.
I2C, SPI, and UART
All three standard buses are software-mapped rather than fixed to specific pins, same pattern as the rest of the ESP32 family.
I2C: Any two GPIOs can serve as SDA/SCL. The Arduino core defaults to specific pins per board definition (commonly GPIO6/GPIO7 on the DevKitC-1), but Wire.begin(sda, scl) overrides that with any free pair.
Wire.begin(6, 7); // SDA, SCL — adjust to your board's free pins
SPI: Same flexibility -- SPI.begin(sck, miso, mosi, cs) lets you assign any four free GPIOs, though most devkits ship with a conventional default set silkscreened for convenience.
UART: The C6 has multiple hardware UART controllers. One is typically wired to the onboard USB-Serial-JTAG peripheral for flashing and the Serial Monitor via GPIO12/13; the others are free to assign to any GPIOs for talking to a GPS module, another microcontroller, or a debug console independent of the USB connection.
Wireless: WiFi 6, BLE 5.3, and 802.15.4
This is what actually sets the C6 apart from every other ESP32 variant on the market. It's the first mainstream Espressif chip to combine three separate radios on one die:
| Radio | Standard | Typical Use |
|---|---|---|
| WiFi | WiFi 6 (802.11ax), 2.4GHz only | Standard IoT connectivity, faster and more efficient than WiFi 4 on congested networks |
| Bluetooth | BLE 5.3 | Sensor pairing, mobile app connections, mesh |
| 802.15.4 | Zigbee, Thread, Matter-over-Thread | Low-power mesh networking for smart-home devices |
None of these radios use GPIO pins directly -- they're internal to the chip -- but it's worth knowing the C6 is 2.4GHz-only on WiFi (no 5GHz band, unlike some newer chips such as the C5). If a project specifically needs Thread or Zigbee alongside WiFi, the C6 is currently the straightforward single-chip answer; the classic ESP32 and the S3 have no 802.15.4 radio at all, and would need a companion chip like the H2 to add one.
Coexistence Considerations
Running WiFi and 802.15.4 simultaneously on the same 2.4GHz band means the C6's radio scheduler has to time-share airtime between them -- Espressif's coexistence firmware handles this automatically, but a project pushing both a busy WiFi connection and a Thread mesh hard at the same time will see somewhat lower throughput on each than running either radio alone. For most smart-home sensor workloads, where WiFi traffic is infrequent status updates rather than continuous streaming, this rarely matters in practice.
Power Pins
| Pin | Function | Notes |
|---|---|---|
| 5V / VIN | Power input | Via USB or an external 5V supply, depending on the board |
| 3V3 | Regulated 3.3V output | Powers the chip and any 3.3V peripherals |
| GND | Ground | Multiple ground pins on most devkits |
Like every ESP32 variant, the C6 runs entirely on 3.3V logic. Any 5V sensor needs a level shifter on its data lines -- there's no partial 5V tolerance to lean on here, unlike some other microcontroller families.
Which Projects the C6 Actually Fits
A strong fit: anything genuinely needing Matter, Thread, or Zigbee alongside WiFi on a single chip -- a smart plug reporting over Matter, a Thread-connected sensor that also needs occasional WiFi-based OTA updates, or a Zigbee end device where cost matters enough that a separate radio chip isn't worth the extra BOM line. It's also a reasonable general-purpose WiFi/BLE board even without touching 802.15.4 at all, since WiFi 6's efficiency gains help on a congested 2.4GHz network regardless of whether Thread ever gets used.
A weaker fit: projects needing 5GHz WiFi (not supported at all), heavy simultaneous multitasking that benefits from a second full application core (the C6 has one HP core, not two), or anything needing more than seven ADC-capable pins without external hardware.
Common Mistakes and How to Avoid Them
Assuming this is just a faster ESP32. The C6 trades the classic ESP32's dual-core Xtensa design for a single RISC-V core plus the LP core. Code that assumes two full application cores (heavy dual-core FreeRTOS task splitting) needs rethinking, not just recompiling.
Wiring something to GPIO4, 5, 8, 9, or 15 without checking their strapping role first. These are the five confirmed strapping pins on this chip -- an external circuit that pulls one of them into an unexpected state during power-up can prevent the board from booting or force it into flashing mode unintentionally.
Repurposing GPIO12/13 without reconfiguring the console. These carry the USB-Serial-JTAG connection by default on most devkits -- reassigning them for other I/O removes flashing and Serial Monitor access unless the console is explicitly redirected elsewhere first.
Expecting 5GHz WiFi. The C6 is 2.4GHz-only. If a project genuinely needs 5GHz, that's the newer ESP32-C5, not the C6.
Not using the LP core for battery projects. It's easy to treat the C6 like a single-core chip and ignore the low-power core entirely -- which throws away the main reason to pick this chip over a plain C3 for a battery-powered sensor.
Practical Pin Usage Tips
Start with the pins your board's silkscreen marks as general-purpose. Nearly every ESP32-C6 devkit labels a subset of GPIOs as free of any strapping, flash, or JTAG role -- these are the ones to reach for first on a new project, before touching anything with a footnote on the pinout diagram.
Use the LP core for anything that needs to run while the rest of the board sleeps. A button watcher, a periodic sensor poll, or a simple wake-on-threshold routine all belong on the LP core rather than keeping the whole chip awake just to check one condition every few seconds.
Don't assume PWM and ADC share the same pin restrictions. PWM will work on almost any GPIO through the LEDC peripheral; ADC will not -- only GPIO0 through GPIO6 are wired to the analog front end at all, and no amount of software configuration changes that.
Budget pins before committing to a project, not after. With roughly 22-23 usable GPIOs and several already claimed by strapping, flash, or USB-JTAG duties, a project mixing I2C, SPI, a UART module, and a handful of digital sensors can run out of headroom faster than the chip's on-paper GPIO count suggests. Sketch out the pin assignment before wiring anything.
Test Thread or Zigbee firmware on Espressif's own DevKitC-1 first if possible. Third-party boards occasionally differ slightly in how strapping pins are pulled at boot, which can matter more for 802.15.4-based firmware (with its own radio calibration and timing requirements) than for a simple WiFi sketch.
Summary: ESP32-C6 Pin Reference at a Glance
ESP32-C6 · RISC-V HP core @ 160MHz + LP core @ 20MHz · 512KB SRAM · WiFi 6 (2.4GHz) · BLE 5.3 · 802.15.4 (Zigbee/Thread/Matter) · GPIO0-23 on the DevKitC-1 · Strapping pins: GPIO4, 5, 8, 9, 15 · Single 12-bit ADC on GPIO0-6
How the C6 Compares to Its Siblings
It's easy to get lost across Espressif's growing chip lineup, so here's where the C6 actually sits:
| Chip | Cores | WiFi | Bluetooth | 802.15.4 | Best for |
|---|---|---|---|---|---|
| ESP32 (classic) | Dual Xtensa | WiFi 4 | BLE 4.2 | No | Legacy projects, dual-core-heavy code |
| ESP32-C3 | Single RISC-V | WiFi 4 | BLE 5.0 | No | Cheapest general WiFi/BLE sensor node |
| ESP32-S3 | Dual Xtensa | WiFi 4 | BLE 5.0 | No | Camera, display, native USB, AI-adjacent work |
| ESP32-C6 | RISC-V + LP core | WiFi 6 | BLE 5.3 | Yes | Matter, Thread, Zigbee alongside WiFi |
| ESP32-H2 | Single RISC-V | None | BLE 5.3 | Yes | Dedicated Thread/Zigbee radio, no WiFi needed |
The practical decision usually comes down to one question: does this project need Thread, Zigbee, or Matter? If yes, the C6 (or the H2, if WiFi isn't needed at all) is the straightforward choice. If no, a C3 is cheaper for basic WiFi/BLE work, and an S3 is the better fit for anything camera-, display-, or USB-heavy.
Quick Answers to Common ESP32-C6 Pin Questions
Is the C6 a drop-in replacement for a classic ESP32 or an S3? Pin-for-pin, no -- the GPIO layout, strapping pins, and ADC arrangement all differ. Code written against the Arduino analogRead()/digitalWrite() API generally ports over fine; anything referencing specific classic-ESP32 GPIO numbers needs rechecking against the C6's own pinout.
Do I need the C6 if I'm just doing basic WiFi sensor projects? Not necessarily -- if a project has no Matter/Thread/Zigbee requirement, a plain ESP32-C3 is cheaper and simpler for straightforward WiFi/BLE work.
What's the LP core actually for in practice? Anything that needs to keep running while the main chip sleeps -- polling a button, watching an I2C sensor for a threshold, or handling simple wake-up logic without waking the power-hungry main core. It's programmed separately from the main Arduino sketch, through ESP-IDF's low-power core tooling.
Which exact pins are the strapping pins? GPIO4, GPIO5, GPIO8, GPIO9, and GPIO15, per Espressif's own datasheet -- with GPIO8 and GPIO9 specifically controlling boot mode.
Can I use 5V sensors directly? No -- every GPIO is 3.3V logic with no 5V tolerance. Use a level shifter for anything 5V.
Why does my board have fewer usable pins than the chip's full GPIO count? Several GPIOs (24-30) are wired internally to the onboard flash chip, and GPIO12/13 are claimed by USB-Serial-JTAG by default -- normal across the whole ESP32 family, not a defect.
Does the C6 support 5GHz WiFi? No -- 2.4GHz only. The ESP32-C5 is the chip to reach for if a project genuinely needs 5GHz.
Where to Go From Here
Once the LP core and the strapping-pin layout feel familiar, pairing a C6 with an ESP32-H2 is the natural next step for anyone building a Matter gateway -- the C6 handles WiFi 6 and the IPv6/mDNS side while a second chip runs the dedicated Thread stack without competing for radio airtime. From there, the compact XIAO ESP32C6 is worth a look for anything space-constrained, since it carries the same chip in a thumbnail-sized board with fewer exposed pins but the identical core capability.