ESP32-WROOM-32 is an Espressif module with the original ESP32 chip, flash memory, a crystal and an antenna under a shielding can. You will find it on ESP32 DevKit boards and in lots of finished devices, and when you design your own board, you solder it directly onto it.
The pinout applies to the WROOM-32, -32D and -32E variants as well as the -32U/-32UE versions with a connector for an external antenna.
Specifications
- ESP32: 2× Xtensa LX6 up to 240 MHz, 520 kB SRAM
- 4 MB flash (8 and 16 MB on -32E as well, R2 versions with 2 MB PSRAM)
- Wi-Fi 4 (2.4 GHz) and Bluetooth 4.2 (Classic and LE)
- 38 pads with 1.27 mm pitch, 26 usable GPIO
- 16 analog inputs (ADC1 + ADC2), 2× DAC, 10 touch inputs
- 3.0–3.6 V supply
- 18 × 25.5 × 3.1 mm (U/UE versions 18 × 19.2 mm)
For your own board, you need at least a 3.3 V regulator (500 mA or more), a pull-up with a capacitor on EN, and a button or jumper on GPIO0 for uploading. It is programmed via UART0 (GPIO1/GPIO3) with a USB-UART converter. On the -32 and -32D, pads 17–22 are connected to the flash memory; on the -32E they are not connected.
Pinout and pin table
Hover over a pin in the diagram or a table row; use the filter to highlight a bus. You can download the pinout as PNG or SVG.
| Pin | Name | Direction | UART | I2C | SPI | ADC | DAC | Touch | Note |
|---|---|---|---|---|---|---|---|---|---|
| 1 | GND | – | |||||||
| 2 | 3V3 | input | Power 3.0–3.6 V. Wi-Fi peaks above 300 mA when transmitting – size the regulator and capacitors for at least 500 mA. | ||||||
| 3 | EN | input | Chip enable (CHIP_PU): logic 1 = running, logic 0 = reset. Connect a 10 kΩ pull-up to 3.3 V and a 1 µF capacitor to GND (delayed start), or a button to GND. | ||||||
| 4 | GPIO36 | input | ADC1_CH0 | SENSOR_VP – input only, no internal pull-up/pull-down | |||||
| 5 | GPIO39 | input | ADC1_CH3 | SENSOR_VN – input only, no internal pull-up/pull-down | |||||
| 6 | GPIO34 | input | ADC1_CH6 | Input only, no internal pull-up/pull-down | |||||
| 7 | GPIO35 | input | ADC1_CH7 | Input only, no internal pull-up/pull-down | |||||
| 8 | GPIO32 | input/output | ADC1_CH4 | T9 | |||||
| 9 | GPIO33 | input/output | ADC1_CH5 | T8 | |||||
| 10 | GPIO25 | input/output | TX2 | ADC2_CH8 | DAC1 | DAC1 (8-bit); UART2 TX (Serial2, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi on | |||
| 11 | GPIO26 | input/output | RX1 | ADC2_CH9 | DAC2 | DAC2 (8-bit); UART1 RX (Serial1, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi on | |||
| 12 | GPIO27 | input/output | TX1 | ADC2_CH7 | T7 | UART1 TX (Serial1, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi enabled | |||
| 13 | GPIO14 | input/output | ADC2_CH6 | T6 | JTAG MTMS; ADC2 cannot be used with Wi-Fi on | ||||
| 14 | GPIO12 | input/output | ADC2_CH5 | T5 | Strapping pin (MTDI) – selects the flash voltage. The module has 3.3 V flash, so it must be logic 0 at power-up (internal pull-down), otherwise it will not boot. This can be fixed permanently with an eFuse (espefuse set-flash-voltage 3.3V). ADC2 cannot be used with Wi-Fi on. | ||||
| 15 | GND | – | |||||||
| 16 | GPIO13 | input/output | ADC2_CH4 | T4 | JTAG MTCK; ADC2 cannot be used with Wi-Fi on | ||||
| 17 | GPIO9 | input/output | Connected to flash memory (SD2) – do not use; not connected on -32E | ||||||
| 18 | GPIO10 | input/output | Connected to flash memory (SD3) – do not use; not connected on -32E | ||||||
| 19 | GPIO11 | input/output | Connected to flash memory (CMD) – do not use; not connected on -32E | ||||||
| 20 | GPIO6 | input/output | Connected to flash memory (CLK) – do not use; not connected on -32E | ||||||
| 21 | GPIO7 | input/output | Connected to flash memory (SD0) – do not use; not connected on -32E | ||||||
| 22 | GPIO8 | input/output | Connected to flash memory (SD1) – do not use; not connected on -32E | ||||||
| 23 | GPIO15 | input/output | ADC2_CH3 | T3 | Strapping pin – logic 0 at boot disables bootloader output. JTAG MTDO | ||||
| 24 | GPIO2 | input/output | ADC2_CH2 | T2 | Strapping pin – must be logic 0 or unconnected at boot for download mode | ||||
| 25 | GPIO0 | input/output | ADC2_CH1 | T1 | Strapping pin – logic 0 at boot (together with GPIO2 at logic 0) = UART download mode. For normal boot use a pull-up (internal is enough); boards have a BOOT button to GND. | ||||
| 26 | GPIO4 | input/output | RX2 | ADC2_CH0 | T0 | UART2 RX (Serial2, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi enabled | |||
| 27 | GPIO16 | input/output | In use on PSRAM versions (-32E…R2); Serial2 defaults to GPIO4/25 in Arduino 3.x | ||||||
| 28 | GPIO17 | input/output | Formerly the default UART2 TX; in Arduino 3.x, Serial2 defaults to GPIO4/25 | ||||||
| 29 | GPIO5 | input/output | SS | Strapping pin (SDIO timing) – logic 1 at boot (internal pull-up) | |||||
| 30 | GPIO18 | input/output | SCK | ||||||
| 31 | GPIO19 | input/output | MISO | ||||||
| 32 | NC | – | |||||||
| 33 | GPIO21 | input/output | SDA | ||||||
| 34 | GPIO3 | input/output | RX | UART0 RX – firmware upload | |||||
| 35 | GPIO1 | input/output | TX | UART0 TX – firmware upload and log output | |||||
| 36 | GPIO22 | input/output | SCL | ||||||
| 37 | GPIO23 | input/output | MOSI | ||||||
| 38 | GND | – | |||||||
| pad | GND | – |
What to watch out for
- The GPIO are not 5V tolerant.
- GPIO12 must be at logic 0 at power-up – otherwise the flash gets 1.8 V and the module won’t start.
- GPIO0 at logic 0 at boot switches to download mode; GPIO2 must be at logic 0 or unconnected during uploading.
- GPIO34–39 are input-only with no internal pull-ups.
- ADC2 (GPIO0, 2, 4, 12–15, 25–27) cannot be used while Wi-Fi is on.
- There must be no copper or components under the antenna – place the module with the antenna over the board edge.
ESP32 on chiptron.eu/
Projects and guides on chiptron.eu/:
- ESP32 chip comparison – when the original ESP32 is enough and when to choose the S3, C3 or C6
- ESP32 and the FireBeetle board – the ESP32-WROOM-32 module with Li-ion charging in practice
- YoRadio – internet radio with an ESP32 WROOM and an I2S DAC, Home Assistant support
More pinouts
See all pinouts on the Pinouts page.