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

319 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ESP32 GPIO Pin Reference
> **类别:reference** | **主题:ESP32 GPIO 引脚完整参考** | **信源:** [Espressif 官方文档](https://docs.espressif.com)
## Table of Contents
- [ESP32 GPIO Model Overview](#esp32-gpio-model-overview)
- [Pin Categories Summary](#pin-categories-summary)
- [Complete GPIO Pin Table](#complete-gpio-pin-table)
- [Flash and PSRAM Reservations](#flash-and-psram-reservations)
- [GPIO6-11: SPI Flash (NEVER USE)](#gpio6-11-spi-flash-never-use)
- [GPIO16-17: PSRAM (WROVER Only)](#gpio16-17-psram-wrover-only)
- [Protocol Pin Groups](#protocol-pin-groups)
- [I2C (Conventional Defaults)](#i2c-conventional-defaults)
- [SPI Buses](#spi-buses)
- [UARTs](#uarts)
- [PWM (LEDC)](#pwm-ledc)
- [1-Wire](#1-wire)
- [DAC (Digital-to-Analog)](#dac-digital-to-analog)
- [ADC Channel Mapping](#adc-channel-mapping)
- [ADC1 (Always Available — Even with WiFi)](#adc1-always-available--even-with-wifi)
- [ADC2 (UNAVAILABLE When WiFi Active)](#adc2-unavailable-when-wifi-active)
- [Touch Channel Mapping](#touch-channel-mapping)
- [RTC GPIO Mapping](#rtc-gpio-mapping)
- [Variant Comparison Table](#variant-comparison-table)
- [Key Variant Notes](#key-variant-notes)
---
## 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 Usable**GPIOs=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 Reserved**GPIOs=6, 7, 8, 9, 10, 11, Count=6, Usage=NEVER use — connected to SPI flash
- **PSRAM Reserved**GPIOs=16, 17, Count=2, Usage=Reserved on WROVER, free on WROOM
- **Input Only**GPIOs=34, 35, 36, 39, Count=4, Usage=Cannot output, no internal pulls
- **Not Exposed**GPIOs=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:**
```cpp
// 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 Architecture**ESP32=Xtensa LX6, ESP32-S2=Xtensa LX7, ESP32-S3=Xtensa LX7, ESP32-C3=RISC-V, ESP32-C6=RISC-V
- **CPU Cores**ESP32=2, ESP32-S2=1, ESP32-S3=2, ESP32-C3=1, ESP32-C6=1
- **GPIO Count**ESP32=34 (0-39), ESP32-S2=43, ESP32-S3=45, ESP32-C3=22 (0-21), ESP32-C6=30
- **ADC Channels**ESP32=18, ESP32-S2=20, ESP32-S3=20, ESP32-C3=6, ESP32-C6=7
- **ADC2/WiFi Conflict**ESP32=Yes, ESP32-S2=Yes, ESP32-S3=Yes, ESP32-C3=**No**, ESP32-C6=**No**
- **Touch Channels**ESP32=10, ESP32-S2=14, ESP32-S3=14, ESP32-C3=**None**, ESP32-C6=**None**
- **DAC Channels**ESP32=2, ESP32-S2=2, ESP32-S3=**None**, ESP32-C3=**None**, ESP32-C6=**None**
- **USB OTG**ESP32=No, ESP32-S2=Yes (GPIO19/20), ESP32-S3=Yes (GPIO19/20), ESP32-C3=No, ESP32-C6=No
- **Bluetooth**ESP32=Classic + BLE, ESP32-S2=**None**, ESP32-S3=BLE 5.0, ESP32-C3=BLE 5.0, ESP32-C6=BLE 5.0
- **WiFi**ESP32=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/Zigbee**ESP32=No, ESP32-S2=No, ESP32-S3=No, ESP32-C3=No, ESP32-C6=**Yes**
- **Flash Pins**ESP32=GPIO6-11, ESP32-S2=GPIO26-32, ESP32-S3=GPIO26-32, ESP32-C3=GPIO12-17, ESP32-C6=GPIO24-29
- **Strapping Pins**ESP32=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
---