Files
esp32-dev/platforms_esp32-pins.md
2026-08-05 17:25:09 +08:00

14 KiB
Raw Permalink Blame History

ESP32 GPIO Pin Reference

类别:reference | 主题:ESP32 GPIO 引脚完整参考 | 信源: Espressif 官方文档

Table of Contents


ESP32 GPIO Model Overview

The ESP32 GPIO system differs fundamentally from Raspberry Pi:

  • GPIO Matrix: Most peripherals can be routed to any GPIO through the GPIO matrix, providing flexible pin assignment (unlike RPi's fixed ALT functions)
  • Special Pin Categories: Certain pins have hardware restrictions — strapping pins affect boot behavior, flash pins are never usable, input-only pins cannot drive outputs
  • Variable Capabilities: Not all GPIOs have the same features — ADC, touch sensing, DAC, and RTC wake capabilities vary by pin
  • Variant Differences: ESP32 variants (S2, S3, C3, C6) have different GPIO counts, capabilities, and restrictions

Default Reference: This document uses ESP32-WROOM-32 as the primary reference module unless otherwise noted.


Pin Categories Summary

  • Freely UsableGPIOs=4, 13, 14, 16*, 17*, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33, Count=15, Usage=No restrictions, safe for any purpose
  • Strapping (use with caution)GPIOs=0, 2, 5, 12, 15, Count=5, Usage=Affect boot behavior — safe after boot
  • Flash ReservedGPIOs=6, 7, 8, 9, 10, 11, Count=6, Usage=NEVER use — connected to SPI flash
  • PSRAM ReservedGPIOs=16, 17, Count=2, Usage=Reserved on WROVER, free on WROOM
  • Input OnlyGPIOs=34, 35, 36, 39, Count=4, Usage=Cannot output, no internal pulls
  • Not ExposedGPIOs=20, 24, 28-31, 37, 38, Count=8, Usage=Not available on WROOM-32 module

*GPIO16/17 are usable on WROOM but reserved for PSRAM on WROVER modules.


Complete GPIO Pin Table

Reference for ESP32-WROOM-32 module, GPIOs 0-39:

  • 0Strapping=YES (boot mode), Reserved=No, I/O=I/O, ADC=ADC2_CH1, Touch=TOUCH1, RTC=RTC_GPIO11, Notes=LOW=download mode; safe after boot
  • 1Strapping=No, Reserved=No*, I/O=I/O, Notes=UART0 TX — avoid (USB serial)
  • 2Strapping=YES (boot mode), Reserved=No, I/O=I/O, ADC=ADC2_CH2, Touch=TOUCH2, RTC=RTC_GPIO12, Notes=Often onboard LED; safe after boot
  • 3Strapping=No, Reserved=No*, I/O=I/O, Notes=UART0 RX — avoid (USB serial)
  • 4Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH0, Touch=TOUCH0, RTC=RTC_GPIO10, Notes=Clean — commonly used for 1-Wire
  • 5Strapping=YES (SDIO timing), Reserved=No, I/O=I/O, Notes=Internal pull-up; VSPI CS default
  • 6Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash CLK
  • 7Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash D0
  • 8Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash D1
  • 9Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash D2
  • 10Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash D3
  • 11Strapping=No, Reserved=FLASH, I/O=I/O, Notes=NEVER USE — SPI flash CMD
  • 12Strapping=YES (MTDI), Reserved=No, I/O=I/O, ADC=ADC2_CH5, Touch=TOUCH5, RTC=RTC_GPIO15, Notes=DANGER: flash voltage select — see esp32-specifics.md
  • 13Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH4, Touch=TOUCH4, RTC=RTC_GPIO14, Notes=HSPI MOSI default
  • 14Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH6, Touch=TOUCH6, RTC=RTC_GPIO16, Notes=HSPI CLK default
  • 15Strapping=YES (MTDO), Reserved=No, I/O=I/O, ADC=ADC2_CH3, Touch=TOUCH3, RTC=RTC_GPIO13, Notes=Debug log control; HSPI CS default
  • 16Strapping=No, Reserved=PSRAM*, I/O=I/O, Notes=Free on WROOM; reserved on WROVER
  • 17Strapping=No, Reserved=PSRAM*, I/O=I/O, Notes=Free on WROOM; reserved on WROVER
  • 18Strapping=No, Reserved=No, I/O=I/O, Notes=VSPI CLK default
  • 19Strapping=No, Reserved=No, I/O=I/O, Notes=VSPI MISO default
  • 20Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 21Strapping=No, Reserved=No, I/O=I/O, Notes=I2C SDA default
  • 22Strapping=No, Reserved=No, I/O=I/O, Notes=I2C SCL default
  • 23Strapping=No, Reserved=No, I/O=I/O, Notes=VSPI MOSI default
  • 24Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 25Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH8, RTC=RTC_GPIO6, Notes=DAC1 output
  • 26Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH9, RTC=RTC_GPIO7, Notes=DAC2 output
  • 27Strapping=No, Reserved=No, I/O=I/O, ADC=ADC2_CH7, Touch=TOUCH7, RTC=RTC_GPIO17, Notes=Clean GPIO
  • 28Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 29Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 30Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 31Strapping=No, Reserved=Not exposed, I/O=I/O, Notes=Not available on WROOM-32
  • 32Strapping=No, Reserved=No, I/O=I/O, ADC=ADC1_CH4, Touch=TOUCH9, RTC=RTC_GPIO9, Notes=ADC1 — works with WiFi
  • 33Strapping=No, Reserved=No, I/O=I/O, ADC=ADC1_CH5, Touch=TOUCH8, RTC=RTC_GPIO8, Notes=ADC1 — works with WiFi
  • 34Strapping=No, Reserved=No, I/O=INPUT, ADC=ADC1_CH6, RTC=RTC_GPIO4, Notes=Input only, no internal pulls
  • 35Strapping=No, Reserved=No, I/O=INPUT, ADC=ADC1_CH7, RTC=RTC_GPIO5, Notes=Input only, no internal pulls
  • 36Strapping=No, Reserved=No, I/O=INPUT, ADC=ADC1_CH0, RTC=RTC_GPIO0, Notes=Input only (SENSOR_VP)
  • 37Strapping=No, Reserved=Not exposed, I/O=INPUT, ADC=ADC1_CH1, RTC=RTC_GPIO1, Notes=Not available on WROOM-32
  • 38Strapping=No, Reserved=Not exposed, I/O=INPUT, ADC=ADC1_CH2, RTC=RTC_GPIO2, Notes=Not available on WROOM-32
  • 39Strapping=No, Reserved=No, I/O=INPUT, ADC=ADC1_CH3, RTC=RTC_GPIO3, Notes=Input only (SENSOR_VN)

Flash and PSRAM Reservations

GPIO6-11: SPI Flash (NEVER USE)

These pins are hardwired to the SPI flash chip on all ESP32 modules:

  • GPIO6Flash Function=SPICLK, Result if Used=Chip crash/hang
  • GPIO7Flash Function=SPIQ (D0), Result if Used=Chip crash/hang
  • GPIO8Flash Function=SPID (D1), Result if Used=Chip crash/hang
  • GPIO9Flash Function=SPIHD (D2), Result if Used=Chip crash/hang
  • GPIO10Flash Function=SPIWP (D3), Result if Used=Chip crash/hang
  • GPIO11Flash Function=SPICS0 (CMD), Result if Used=Chip crash/hang

Rule: Never assign GPIO6-11 for any purpose. Attempting to use them will crash the chip immediately.

GPIO16-17: PSRAM (WROVER Only)

  • WROOM-32GPIO16=Usable, GPIO17=Usable, Reason=No PSRAM on module
  • WROVERGPIO16=Reserved, GPIO17=Reserved, Reason=Connected to PSRAM
  • WROVER-BGPIO16=Reserved, GPIO17=Reserved, Reason=Connected to PSRAM
  • WROOM-32EGPIO16=Usable, GPIO17=Usable, Reason=No PSRAM on module

Rule: Always check module type. If using WROVER, avoid GPIO16/17.


Protocol Pin Groups

I2C (Conventional Defaults)

Unlike Raspberry Pi, ESP32 I2C can use any GPIO via the GPIO matrix:

  • SDADefault GPIO=GPIO21, Notes=Convention only — any GPIO works
  • SCLDefault GPIO=GPIO22, Notes=Convention only — any GPIO works

Usage:

// Arduino
Wire.begin(21, 22);  // SDA, SCL

// ESP-IDF
i2c_config_t conf = {
    .sda_io_num = 21,
    .scl_io_num = 22,
    // ...
};

Note: Do not use input-only pins (34-39) for I2C — they cannot drive the bus.

SPI Buses

ESP32 has two user-accessible SPI buses:

VSPI (SPI3) — Recommended:

  • MOSIGPIO=GPIO23
  • MISOGPIO=GPIO19
  • SCLKGPIO=GPIO18
  • CSGPIO=GPIO5, Notes=Strapping pin — safe after boot

HSPI (SPI2) — Use with caution:

  • MOSIGPIO=GPIO13
  • MISOGPIO=GPIO12, Notes=DANGER: Strapping pin — see esp32-specifics.md
  • SCLKGPIO=GPIO14
  • CSGPIO=GPIO15, Notes=Strapping pin — safe after boot

Warning: HSPI uses GPIO12 which is a dangerous strapping pin. Prefer VSPI unless you specifically need both SPI buses.

UARTs

  • UART0TX=GPIO1, RX=GPIO3, Notes=USB serial — avoid unless needed
  • UART1TX=Any, RX=Any, Notes=Fully remappable via GPIO matrix
  • UART2TX=Any, RX=Any, Notes=Fully remappable via GPIO matrix

Common UART1/UART2 assignments:

  • UART1: GPIO4 (TX), GPIO5 (RX)
  • UART2: GPIO16 (TX), GPIO17 (RX) — if not WROVER

PWM (LEDC)

ESP32 PWM uses the LEDC peripheral, which can output to any GPIO:

  • Channels: 16 (8 high-speed, 8 low-speed)
  • Resolution: 1-16 bits
  • Frequency: Up to 40MHz (hardware dependent on duty resolution)
  • Any output-capable GPIO works — no fixed PWM pins like RPi

Rule: Cannot use input-only pins (34-39) for PWM output.

1-Wire

  • Common Pin: GPIO4 (by convention)
  • Flexibility: Any GPIO with output capability
  • Pull-up: Requires 4.7kΩ external pull-up to 3.3V

DAC (Digital-to-Analog)

  • DAC1GPIO=GPIO25, Notes=8-bit resolution
  • DAC2GPIO=GPIO26, Notes=8-bit resolution

Note: DAC is only available on original ESP32 and ESP32-S2. Not available on S3, C3, or C6.


ADC Channel Mapping

ADC1 (Always Available — Even with WiFi)

  • ADC1_CH0GPIO=GPIO36, Notes=Input only (SENSOR_VP)
  • ADC1_CH1GPIO=GPIO37, Notes=Not on WROOM-32
  • ADC1_CH2GPIO=GPIO38, Notes=Not on WROOM-32
  • ADC1_CH3GPIO=GPIO39, Notes=Input only (SENSOR_VN)
  • ADC1_CH4GPIO=GPIO32, Notes=Full I/O
  • ADC1_CH5GPIO=GPIO33, Notes=Full I/O
  • ADC1_CH6GPIO=GPIO34, Notes=Input only
  • ADC1_CH7GPIO=GPIO35, Notes=Input only

Design Rule: Use ADC1 channels for analog inputs in WiFi projects.

ADC2 (UNAVAILABLE When WiFi Active)

  • ADC2_CH0GPIO=GPIO4
  • ADC2_CH1GPIO=GPIO0, Notes=Strapping pin
  • ADC2_CH2GPIO=GPIO2, Notes=Strapping pin
  • ADC2_CH3GPIO=GPIO15, Notes=Strapping pin
  • ADC2_CH4GPIO=GPIO13
  • ADC2_CH5GPIO=GPIO12, Notes=DANGER: Strapping pin
  • ADC2_CH6GPIO=GPIO14
  • ADC2_CH7GPIO=GPIO27
  • ADC2_CH8GPIO=GPIO25, Notes=Also DAC1
  • ADC2_CH9GPIO=GPIO26, Notes=Also DAC2

Warning: ADC2 returns invalid readings when WiFi or Bluetooth is active. See esp32-specifics.md for details.


Touch Channel Mapping

ESP32 has 10 capacitive touch sensing channels:

  • TOUCH0GPIO=GPIO4
  • TOUCH1GPIO=GPIO0, Notes=Strapping pin
  • TOUCH2GPIO=GPIO2, Notes=Strapping pin
  • TOUCH3GPIO=GPIO15, Notes=Strapping pin
  • TOUCH4GPIO=GPIO13
  • TOUCH5GPIO=GPIO12, Notes=DANGER: Strapping pin
  • TOUCH6GPIO=GPIO14
  • TOUCH7GPIO=GPIO27
  • TOUCH8GPIO=GPIO33, Notes=Also ADC1
  • TOUCH9GPIO=GPIO32, Notes=Also ADC1

Notes:

  • Touch sensing works in deep sleep via ULP coprocessor
  • ESP32-C3 and C6 do NOT have touch sensing capability
  • External components on touch pins affect sensitivity

RTC GPIO Mapping

RTC GPIOs can wake the ESP32 from deep sleep and be controlled by the ULP coprocessor:

  • RTC_GPIO0GPIO=GPIO36, ADC=ADC1_CH0, Notes=Input only (SENSOR_VP)
  • RTC_GPIO1GPIO=GPIO37, ADC=ADC1_CH1, Notes=Not on WROOM-32
  • RTC_GPIO2GPIO=GPIO38, ADC=ADC1_CH2, Notes=Not on WROOM-32
  • RTC_GPIO3GPIO=GPIO39, ADC=ADC1_CH3, Notes=Input only (SENSOR_VN)
  • RTC_GPIO4GPIO=GPIO34, ADC=ADC1_CH6, Notes=Input only
  • RTC_GPIO5GPIO=GPIO35, ADC=ADC1_CH7, Notes=Input only
  • RTC_GPIO6GPIO=GPIO25, ADC=ADC2_CH8, Notes=DAC1
  • RTC_GPIO7GPIO=GPIO26, ADC=ADC2_CH9, Notes=DAC2
  • RTC_GPIO8GPIO=GPIO33, ADC=ADC1_CH5, Touch=TOUCH8
  • RTC_GPIO9GPIO=GPIO32, ADC=ADC1_CH4, Touch=TOUCH9
  • RTC_GPIO10GPIO=GPIO4, ADC=ADC2_CH0, Touch=TOUCH0
  • RTC_GPIO11GPIO=GPIO0, ADC=ADC2_CH1, Touch=TOUCH1, Notes=Strapping
  • RTC_GPIO12GPIO=GPIO2, ADC=ADC2_CH2, Touch=TOUCH2, Notes=Strapping
  • RTC_GPIO13GPIO=GPIO15, ADC=ADC2_CH3, Touch=TOUCH3, Notes=Strapping
  • RTC_GPIO14GPIO=GPIO13, ADC=ADC2_CH4, Touch=TOUCH4
  • RTC_GPIO15GPIO=GPIO12, ADC=ADC2_CH5, Touch=TOUCH5, Notes=DANGER: Strapping
  • RTC_GPIO16GPIO=GPIO14, ADC=ADC2_CH6, Touch=TOUCH6
  • RTC_GPIO17GPIO=GPIO27, ADC=ADC2_CH7, Touch=TOUCH7

Deep Sleep Wake Sources:

  • EXT0: Single RTC GPIO, level-triggered
  • EXT1: Multiple RTC GPIOs, any-high or all-low trigger
  • Touch pad wake: Any touch channel
  • ULP coprocessor: Programmable wake conditions

Variant Comparison Table

  • CPU ArchitectureESP32=Xtensa LX6, ESP32-S2=Xtensa LX7, ESP32-S3=Xtensa LX7, ESP32-C3=RISC-V, ESP32-C6=RISC-V
  • CPU CoresESP32=2, ESP32-S2=1, ESP32-S3=2, ESP32-C3=1, ESP32-C6=1
  • GPIO CountESP32=34 (0-39), ESP32-S2=43, ESP32-S3=45, ESP32-C3=22 (0-21), ESP32-C6=30
  • ADC ChannelsESP32=18, ESP32-S2=20, ESP32-S3=20, ESP32-C3=6, ESP32-C6=7
  • ADC2/WiFi ConflictESP32=Yes, ESP32-S2=Yes, ESP32-S3=Yes, ESP32-C3=No, ESP32-C6=No
  • Touch ChannelsESP32=10, ESP32-S2=14, ESP32-S3=14, ESP32-C3=None, ESP32-C6=None
  • DAC ChannelsESP32=2, ESP32-S2=2, ESP32-S3=None, ESP32-C3=None, ESP32-C6=None
  • USB OTGESP32=No, ESP32-S2=Yes (GPIO19/20), ESP32-S3=Yes (GPIO19/20), ESP32-C3=No, ESP32-C6=No
  • BluetoothESP32=Classic + BLE, ESP32-S2=None, ESP32-S3=BLE 5.0, ESP32-C3=BLE 5.0, ESP32-C6=BLE 5.0
  • WiFiESP32=802.11 b/g/n, ESP32-S2=802.11 b/g/n, ESP32-S3=802.11 b/g/n, ESP32-C3=802.11 b/g/n, ESP32-C6=802.11ax (WiFi 6)
  • Thread/ZigbeeESP32=No, ESP32-S2=No, ESP32-S3=No, ESP32-C3=No, ESP32-C6=Yes
  • Flash PinsESP32=GPIO6-11, ESP32-S2=GPIO26-32, ESP32-S3=GPIO26-32, ESP32-C3=GPIO12-17, ESP32-C6=GPIO24-29
  • Strapping PinsESP32=0, 2, 5, 12, 15, ESP32-S2=0, 45, 46, ESP32-S3=0, 3, 45, 46, ESP32-C3=2, 8, 9, ESP32-C6=8, 9, 15

Key Variant Notes

  • ESP32-C3/C6: No ADC2/WiFi conflict — all ADC channels work with WiFi
  • ESP32-S2/S3: USB OTG requires GPIO19/20 — reserve if using native USB
  • ESP32-C6: Only variant with WiFi 6 and Thread/Zigbee support
  • Touch sensing: Only original ESP32, S2, and S3 have capacitive touch
  • DAC: Only original ESP32 and S2 have analog output capability