The ESP32-S3 DevKitC is a powerful development board designed specifically to handle the heavy processing demands of today’s Artificial Intelligence of Things (AIoT) applications. At its heart lies a powerful dual-core Xtensa 32-bit LX7 microprocessor that can run up to 240 MHz. It also introduces specialized vector instructions to accelerate machine learning tasks and advanced signal processing, making it a powerhouse for creative engineering.
However, to truly harness the capabilities of the ESP32-S3 DevKitC, you must first understand its pinout. Each pin has a specific role, and knowing what each one does will help you build circuits more confidently, avoid costly mistakes, and get the most out of this incredible piece of technology.
ESP32-S3 DevKitC Pinout
The ESP32-S3 DevKitC is designed to be incredibly easy to use for prototyping. It features two rows of 22 pins along its sides, giving you 44 main connection points in total. These pins are spaced at the standard 2.54 mm distance, which means the board will snap perfectly into a standard breadboard or fit seamlessly onto a custom circuit board using regular headers.
The pinout is shown below:

Let’s take a closer look at these pins and their functions, starting with the GPIO pins.
ESP32-S3 DevKitC GPIO Pins
The ESP32-S3 DevKitC exposes 36 GPIO pins on its headers: GPIO 0 through GPIO 21, as well as GPIO 35 through GPIO 48.

The most important rule to remember when using this board is that the ESP32-S3 operates strictly on 3.3V logic. This means you must never expose the GPIO pins to a 5V source. Doing so can permanently damage the board.
The GPIO Matrix and the IO MUX
One of the most powerful features of the ESP32-S3 is its GPIO Matrix. You can think of it as an internal routing system inside the chip. It allows you to assign almost any digital functions, such as PWM, I2C, SPI, UART, I2S or TWAI, to almost any physical pin simply by changing your code.
However, this flexibility does have a minor limitation. Because signals have to travel through the GPIO Matrix, a tiny delay is introduced. For the vast majority of projects, this delay is completely unnoticeable. But when you are dealing with extremely fast signals or highly sensitive analog readings, that tiny delay becomes a problem.
To handle those demanding tasks, the ESP32-S3 bypasses the GPIO Matrix and uses something called the IO MUX.
The IO MUX connects specific physical pins directly to the dedicated hardware inside the chip. Some of these connections are fixed and cannot be moved in software, while others have default pin assignments but they can still be moved by using the GPIO Matrix. Functions that strictly depend on the IO MUX include ADC channels, the internal JTAG debugging interface, the USB Serial/JTAG controller, and the high-speed SPI connections used for the built-in flash memory.
So, while you have the freedom to route signals like I2C or PWM to almost any pin on the DevKitC, you cannot freely move every function. Some features, especially analog or high-speed ones, must stay on their assigned pins because they rely on the IO MUX.
In simple terms, the ESP32-S3’s peripheral signals can be grouped like this:
| Routing type | Peripheral examples | What it means |
| Fixed to specific pins through the IO MUX | ADC1, ADC2, Touch | These functions must use their assigned pins and cannot be moved in software. |
| Connected to default IO MUX pins, but can also be rerouted through the GPIO Matrix | UART0, UART1, SPI2 | These functions have standard pin locations, but they can be moved to other GPIO pins if needed. |
| Not assigned to fixed pins by default and routed through the GPIO Matrix | UART2, SPI3, I2C, I2S, TWAI, LED PWM, LCD and Camera, SD/MMC, MCPWM | These functions are flexible and can be assigned to different GPIO pins in software. |
Which ESP32-S3 DevKitC GPIOs are safe to use?
Although the ESP32-S3 DevKitC has a lot of pins with various functions, some of them may not be suitable for your projects. The table below shows which pins are safe to use and which pins should be used with caution.
- – Your top priority pins. They are perfectly safe to use.
- – Pay close attention because their behavior, particularly during boot, can be unpredictable. Use them with caution.
| GPIO | Safe to use? | Type | Notes |
| GPIO0 | Strapping Pin | Determines the primary boot mode (HIGH for normal flash boot, LOW enters serial download mode); Default state: HIGH (Pull-up) | |
| GPIO1 | |||
| GPIO2 | |||
| GPIO3 | Strapping Pin | Selects the JTAG signal source configuration; Default state: Floating | |
| GPIO4 | |||
| GPIO5 | |||
| GPIO6 | |||
| GPIO7 | |||
| GPIO8 | |||
| GPIO9 | |||
| GPIO10 | |||
| GPIO11 | |||
| GPIO12 | |||
| GPIO13 | |||
| GPIO14 | |||
| GPIO15 | |||
| GPIO16 | |||
| GPIO17 | |||
| GPIO18 | |||
| GPIO19 | USB | Permanently hardwired to high-speed differential USB signal D- | |
| GPIO20 | USB | Permanently hardwired to high-speed differential USB signal D+ | |
| GPIO21 | |||
| GPIO35 | PSRAM | Reserved for Octal Flash or Octal PSRAM on octal-equipped development boards | |
| GPIO36 | PSRAM | Reserved for Octal Flash or Octal PSRAM on octal-equipped development boards | |
| GPIO37 | PSRAM | Reserved for Octal Flash or Octal PSRAM on octal-equipped development boards | |
| GPIO38 | |||
| GPIO39 | JTAG | JTAG TCK for debugging | |
| GPIO40 | JTAG | JTAG TDO for debugging | |
| GPIO41 | JTAG | JTAG TDI for debugging | |
| GPIO42 | JTAG | JTAG TMS for debugging | |
| GPIO43 | UART-TX | Used as UART0 transmit (console/bootloader); repurposing may disable serial console output and printing | |
| GPIO44 | UART-RX | Used as UART0 receive (console/bootloader); repurposing may disable serial programming and debug logs | |
| GPIO45 | Strapping Pin | Determines the VDD_SPI voltage for external memory interfacing. A LOW state sets the bus voltage to 3.3V. A HIGH state forces the bus to 1.8V. Default state: LOW (Pull-down) | |
| GPIO46 | Strapping Pin | Controls ROM debug message printing. If pulled HIGH, diagnostic debug messages are printed to the primary serial console during the boot sequence. Default state: LOW (Pull-down) | |
| GPIO47 | |||
| GPIO48 |
The image below shows which GPIO pins can be used safely.

ESP32-S3 DevKitC Interrupt Pins
Unlike microcontrollers with dedicated, singular interrupt pins, the ESP32-S3 uses an advanced Interrupt Matrix. This matrix allows absolutely any functional GPIO pin to be configured as an external interrupt source.
The ESP32-S3 supports four different trigger modes that determine exactly when this interruption happens:
| Mode | Trigger Condition | Typical Use Cases |
RISING | Pin transitions from LOW to HIGH | Button press detection (pull-down) |
FALLING | Pin transitions from HIGH to LOW | Button press detection (pull-up) |
CHANGE | Pin changes state (either direction) | Encoder reading, pulse counting |
LOW | Pin remains at LOW level | Level-triggered events |
ESP32-S3 DevKitC RTC GPIO Pins
Some GPIO pins on the ESP32-S3 are connected to the RTC, or real-time clock, low-power system. These pins are called RTC GPIOs. On the ESP32-S3 DevKitC, these are GPIO0 through GPIO21.

These pins are especially important when the ESP32 is in deep sleep mode. They can wake the chip up when an external event happens, such as a person pressing a button, a PIR motion sensor detecting movement, or an accelerometer sending an alert signal.
ESP32-S3 DevKitC Strapping Pins
Strapping pins are a special set of highly sensitive GPIOs that determine how the microcontroller behaves when it first wakes up. At the exact millisecond the ESP32-S3 boots or resets, the chip physically checks the voltage levels on these specific pins. The voltages detected during this tiny window tell the chip how to boot, how to handle debugging, and what voltage to send to the flash memory.
The ESP32-S3 has four critical strapping pins: GPIO0, GPIO3, GPIO45, and GPIO46.

| Pin Number | Internal Default State | Core Function During Boot Sequence |
| GPIO0 | Pull-up (HIGH) | Determines the primary boot mode. If allowed to remain HIGH, the chip boots normally from its memory. If pulled LOW during reset, it enters Download Mode, allowing you to flash new firmware via USB or UART. |
| GPIO3 | Floating | Selects the configuration for the JTAG signal source, which is used for advanced debugging. |
| GPIO45 | Pull-down (LOW) | Sets the voltage for external memory. A LOW state sets the memory bus voltage to 3.3V, while a HIGH state forces it to 1.8V. |
| GPIO46 | Pull-down (LOW) | Controls diagnostic messages. If pulled HIGH, the chip prints helpful debug messages to your computer screen during the boot sequence. |
Each of these pins has a weak internal pull-up or pull-down resistor. These resistors set a default state for the pin if nothing else is connected to it. So, you do not need to worry about these pins, as the board has already correctly configured them for normal use.
Warning:
Strapping pins should always be used with extra care. Before connecting sensors, or modules to them, you should make sure they will not force the wrong logic level during startup.
For instance, if you attach a sensor or switch that accidentally holds GPIO 0 LOW when you turn the power on, the ESP32-S3 will silently enter Download Mode and completely refuse to run your code.
GPIO45 can cause an even more serious problem. If an external module forces GPIO 45 HIGH during boot, the chip will configure its memory regulator to supply only 1.8V. If the actual flash memory on the board is designed to work at 3.3V, the system will immediately experience a brownout and fail to boot.
ESP32-S3 DevKitC SPI Flash and PSRAM Pins
To achieve extreme processing performance, the ESP32-S3 relies heavily on its built-in memory chips: SPI Flash (for storing your firmware and program data), and PSRAM (for providing extra memory for applications while they are running). Because the main processor needs to communicate with these memory chips at incredibly high speeds, the specific pins connecting them are specially reserved and should not be changed or used for other purposes.
Standard Quad-SPI Pins (GPIO26 through GPIO32)
On standard ESP32-S3 modules, GPIO26 through GPIO32 are permanently connected to the built-in SPI Flash and PSRAM chips in Quad-SPI mode. Therefore, these pins should not be used for normal user applications.
Fortunately, you do not have to worry about accidentally using these on the ESP32-S3 DevKitC, as these pins are not exposed on the board’s headers. However, it is still important to know about them, especially if you use a different ESP32-S3 board or work with a bare chip in a custom design.
Octal-SPI Expansion Pins (GPIO33 through GPIO37)
One feature that makes the ESP32-S3 different from some earlier chips is its support for ultra-fast Octal-SPI (OPI) memory. This type of memory is essential for heavy tasks like buffering Artificial Intelligence models or rendering large graphics.
If your specific board utilizes this Octal memory (which can be identified in chip versions such as ESP32-S3R8 or ESP32-S3R8V), the memory bus expands to take up five extra pins: GPIO33 through GPIO37. On these upgraded development boards, these specific pins become strictly reserved.

ESP32-S3 DevKitC ADC Pins
The ESP32-S3 integrates two separate, high-performance SAR ADCs: ADC1 and ADC2. These let the board read analog voltages from sensors such as potentiometers, light sensors, or temperature sensors. On the ESP32-S3 DevKitC board, there are 20 pins that can be used for analog input.
GPIO1 through GPIO10 belong to ADC1, while GPIO11 through GPIO20 belong to ADC2.

These ADCs have a 12-bit resolution. This means they can divide the input voltage range into 4096 separate levels (from 0 to 4095). Because of this, the board can measure analog signals with fairly good detail.
Note:
Since the ADC2 module is also used by the Wi-Fi, it cannot be used when Wi-Fi is enabled. So, if your project needs Wi-Fi and analog input at the same time, it is better to use the ADC1 pins instead.
ADC Attenuation
Inside the chip, the ADC uses a baseline internal reference voltage, known as Vref, to measure incoming analog signals. While this exact voltage varies slightly from chip to chip, the median Vref is roughly 1.1V.
To measure voltages higher than Vref safely, the ESP32-S3 uses a software-controlled feature called attenuation. Attenuation essentially scales down the incoming voltage before the ADC processes it. By increasing the attenuation level in your code, you expand the maximum measurable range of your analog pins.
There are 4 available attenuation options:
| Attenuation Configuration | Measurable Input Voltage Range |
ADC_ATTEN_DB_0 (0 dB) | 0 mV ~ 950 mV |
ADC_ATTEN_DB_2_5 (2.5 dB) | 0 mV ~ 1250 mV |
ADC_ATTEN_DB_6 (6 dB) | 0 mV ~ 1750 mV |
ADC_ATTEN_DB_11 (11 dB) | 0 mV ~ 3100 mV |
ESP32-S3 DevKitC Capacitive-Touch Pins
The ESP32-S3 has 14 capacitive touch-sensing GPIOs: GPIO 1 to GPIO 14.

These pins can detect when something conductive, like your finger, comes close to them. They work by measuring a change in capacitance. When your finger gets near the pin, it slightly changes the electrical properties of the circuit, and the board recognizes this change as a touch.
You do not have to touch the pins directly. If you attach a conductive material such as aluminum foil, conductive fabric, or conductive paint to one of these pins, you can turn that material into a touch pad. This makes it easy to build creative projects, such as custom buttons, touch lamps, or interactive art.
ESP32-S3 DevKitC I2C Pins
The ESP32-S3 features two completely independent hardware I2C controllers. These controllers can operate in standard mode (100 kbit/s), fast mode (400 kbit/s), and higher speeds depending on bus capacitance.
Unlike some other functions on the ESP32-S3, the I2C controllers are not assigned to fixed pins by default. Instead, it can be mapped to any GPIO pin through the GPIO Matrix.
Warning:
There is one crucial hardware detail you must remember when wiring your I2C devices. You must add external pull-up resistors—typically between 4.7 kΩ and 10 kΩ—to both the SDA and SCL lines. If you rely solely on the chip’s weak internal pull-up resistors, which are about 45 kΩ, your electrical signals may rise too slowly, especially on longer wires or buses with higher capacitance. This can lead to communication errors or cause the I2C bus to stop working properly.
ESP32-S3 DevKitC UART Pins
The ESP32-S3 has three hardware UART controllers: UART0, UART1, and UART2.

UART0 is mainly used for the console and debugging. By default, UART0 is assigned to GPIO43 for TX and GPIO44 for RX on ESP32-S3 modules. These pins are important because they output the ROM bootloader messages and allow you to debug your code through a serial monitor. Reassigning these pins in your software is highly discouraged because doing so will completely disable your main debugging console.
UART1 is assigned by default to GPIO17 for TX and GPIO18 for RX on ESP32-S3 modules. However, it can be moved to other GPIO pins via the GPIO Matrix.
UART2 is completely unassigned by default, which means you can map it to almost any GPIO pin through the GPIO Matrix.
The table below shows the default TX and RX pins for each UART controller on the ESP32-S3 DevKitC.
| UART controller | TX | RX | Remarks |
| UART0 | GPIO43 | GPIO44 | Primary debug console. Reassigning is highly discouraged. |
| UART1 | GPIO17 | GPIO18 | Default pins shown, but can be freely mapped to any GPIO. |
| UART2 | Unassigned | Unassigned | Completely free to be mapped to any GPIO. |
ESP32-S3 DevKitC SPI Pins
The ESP32-S3 contains four SPI controllers: SPI0, SPI1, SPI2, and SPI3.

SPI0 and SPI1 are strictly reserved for the chip’s internal Flash memory and PSRAM, which we discussed earlier. Therefore, you cannot use them. That leaves SPI2 and SPI3 fully available for your applications.
By default, SPI2 is connected directly through the IO MUX to these native pins:
| SPI Signal | SPI2 Pin Mapping |
| SCK / CLK | GPIO12 |
| MOSI | GPIO11 |
| MISO | GPIO13 |
| CS (Chip Select) | GPIO10 |
Although SPI2 can still be assigned to other GPIO pins through the GPIO Matrix, it is highly recommended to stick to these default hardware pins. Using the direct IO MUX connection bypasses the internal routing delays, allowing you to achieve blazing-fast clock speeds of up to 80 MHz.
Finally, SPI3 is completely unassigned by default. You can freely map it to any available GPIO pin using the GPIO Matrix.
ESP32-S3 DevKitC I2S Pins
The ESP32-S3 contains two I2S peripherals (I2S0 and I2S1) designed specifically for transferring high-fidelity, synchronized digital audio.
An I2S connection usually needs at least three signal lines–the Bit Clock (BCLK), the Word Select (WS), and the Serial Data line (DIN/DOUT). In some cases, a Master Clock (MCLK) is also used to keep external audio devices synchronized.
Fortunately, standard audio sample rates, such as 44.1 kHz and 48 kHz, are well within the speed that the GPIO Matrix can handle. So, I2S signals can be safely routed to almost any available GPIO pin.
ESP32-S3 DevKitC PWM Pins
Every exposed GPIO pin on the ESP32-S3 DevKitC, including GPIO0 through GPIO21 and GPIO35 through GPIO48, can output a high-resolution PWM signal.

The microcontroller offers two distinct ways to handle these signals depending on the complexity of your project.
LED PWM Controller (LEDC)
For standard, everyday tasks like fading LEDs, sweeping small servos, or controlling a simple heating element, you will use the LED PWM Controller (LEDC). This controller provides eight completely independent PWM output channels, giving you incredibly fine-tuned control over the frequency and duty cycle of your signals. Because the signals can be routed through the GPIO Matrix, they can be assigned to almost any physical pin.
Motor Control PWM (MCPWM)
For complex robotics and industrial motor control, the ESP32-S3 features a highly sophisticated dedicated MCPWM (Motor Control Pulse Width Modulator) controller. This dedicated hardware is engineered specifically to drive complex H-bridges, Brushed DC motors, and Brushless DC (BLDC) motors. It supports advanced features such as hardware dead-time insertion (to prevent H-bridge short circuits), fault handling, and carrier modulation.
ESP32-S3 DevKitC Two-Wire Automotive Interface (TWAI/CAN) Pins
The TWAI controller is the ESP32-S3’s native hardware implementation of the CAN (Controller Area Network) bus protocol. It is strictly compliant with the ISO 11898-1 specification (CAN 2.0B), supporting both standard 11-bit and extended 29-bit message identifiers.
Because standard CAN bus speeds go up to 1 Mbps, the TWAI signals (TX, RX, BUS-OFF, and CLKOUT) can be routed through the GPIO Matrix to any available pin on the board without any problem.
However, the ESP32-S3 operates strictly on 3.3V logic, meaning it cannot directly produce the differential voltage signals needed by a real CAN bus. To safely connect your DevKitC board to a CAN bus, you must use an external 3.3V CAN transceiver chip (such as the SN65HVD230 or the TJA1051T/3).
ESP32-S3 DevKitC USB-OTG Interface
One of the greatest advantages of the ESP32-S3 is its native full-speed USB 1.1 OTG (On-The-Go) controller.
However, It’s important to remember that this USB interface is permanently hardwired to GPIO19 for D- and GPIO20 for D+. These pins provide simultaneous Serial console emulation (CDC) and advanced hardware JTAG debugging through a single Type-C cable connection.

Warning:
Since GPIO19 and GPIO20 are tied directly to the built-in USB system, you should avoid using these pins for other purposes. If you accidentally reconfigure GPIO 19 or GPIO 20 to act as standard digital inputs or outputs, you will instantly sever the internal USB connection and completely lock yourself out of USB communication!
ESP32-S3 DevKitC Traditional Hardware JTAG Pins
While the built-in USB-JTAG interface is incredibly convenient, sometimes you might desperately need GPIO 19 and 20 for some other purpose. In that case, the ESP32-S3 retains support for traditional hardware JTAG debugging.
By default, this interface is connected directly through the IO MUX to these native pins:
| JTAG Signal | Default GPIO Pin |
| MTCK | GPIO39 |
| MTDO | GPIO40 |
| MTDI | GPIO41 |
| MTMS | GPIO42 |

If hardware JTAG debugging is not needed in the final project, these four pins can be used again as normal GPIO pins without restriction.
ESP32-S3 DevKitC Onboard RGB LED Pin
The DevKitC board features a built-in, addressable WS2812 RGB LED, which is fantastic for adding visual feedback to your projects.
However, the specific pin this LED connects to depends entirely on your board’s hardware version. On the DevKitC-1 v1.0, the LED is wired to GPIO 48, while the newer DevKitC-1 v1.1 routes it to GPIO 38 instead.

Because of this hardware change, you must always verify your specific board version before writing your code to ensure your LED lights up as expected.
ESP32-S3 DevKitC Power Pins
The ESP32-S3 DevKitC has several power pins. These pins are used to power the board itself and can also provide power to sensors, modules, and other external components connected to it.

Type-C USB ports (the USB-to-UART Port and the ESP32-S3 USB Port) are the primary method for powering the ESP32-S3 DevKitC development board. When you connect the board to a computer or a USB wall adapter, the USB connection supplies 5V power to an onboard Low-Dropout (LDO) voltage regulator. This regulator steps the 5V down to a stable 3.3V, which is required by the ESP32-S3 chip and the other parts on the board.
5V pin gives you another way to power the ESP32-S3 DevKitC. If you want to run your project away from a computer, you can use this pin. By connecting a battery pack or an external power adapter that supplies between 4.3V and 6.0V, you can power the board directly. Just like with USB power, the onboard regulator will step this voltage down to 3.3V for the rest of the circuit.
3V3 pin serves a dual purpose depending on your setup. In most cases, when the board is powered through USB or through the 5V pin, the 3V3 pin acts as an output. It provides a stable 3.3V supply that can be used to power small 3.3V sensors or modules connected to the board. You just need to monitor your overall current draw, as the ESP32-S3 itself can pull up to 500mA during heavy Wi-Fi transmission bursts.
Alternatively, the 3V3 pin can also be used as an input. If you already have a very stable 3.3V external battery or power supply, you can feed that power directly into the 3V3 pin. This method completely bypasses the onboard regulator and feeds power directly to the microcontroller’s logic circuits.
ESP32-S3 DevKitC Control Pins

BOOT Button (GPIO 0) is physically connected to GPIO 0. Holding this button forces the strapping logic to a physical LOW state, causing the ESP32-S3 to enter the bootloader mode.
RESET Button (CHIP_PU) is tied to the chip’s enable line (CHIP_PU). Pressing it briefly cuts power to the main digital logic, immediately halting the microcontroller and forcing it to restart.
