Skip to content

ESP32-P4 board

A dual-core RISC-V ESP32-P4 board, with selectable chip revision, mask ROM, PSRAM and flash

ESP32-P4 board

The ESP32-P4 board is a development board for Espressif’s ESP32-P4: two 32-bit RISC-V high-performance cores at 360 MHz (400 MHz on v3.x silicon) plus a low-power RISC-V core, with in-package PSRAM and external flash. The simulator runs the chip’s own mask ROM, so firmware boots through the same ROM → second-stage bootloader → application path as on the board.

It takes a merged flash image (.bin) written from offset 0, not an ELF — the same artifact esptool writes to a real board, containing the bootloader, partition table, and application.

The ESP32-P4 has no radio. The Wi-Fi companion chip many P4 boards carry (an ESP32-C6 over SDIO) is not simulated, so there is no Wi-Fi or Bluetooth on this board.

The ESP32-P4 datasheet and technical reference manual cover the register map and peripherals. The board drawing’s 2 × 20 header follows the J1 header of Espressif’s ESP32-P4 Function EV Board.

Every pad on the chip is a pin, named by its GPIO number: GPIO0–GPIO54. That includes pads a real board routes to onboard parts rather than to its header. Power pins are 3V3, 5V and GND.

The J1 header (2 × 20) carries these:

J1 pinSignalJ1 pinSignal
13V325V
3GPIO745V
5GPIO86GND
7GPIO238GPIO37 (U0TXD)
9GND10GPIO38 (U0RXD)
11GPIO2112GPIO22
13GPIO2014GND
15GPIO616GPIO5
173V318GPIO4
19GPIO320GND
21GPIO222GPIO1
23GPIO024GPIO36
25GND26GPIO32
27NC28NC
29GPIO3330GND
31GPIO2632GPIO54
33GPIO4834GND
35GPIO5336GPIO46
37GPIO4738GPIO27
39GND40GPIO45

Wire by the GPIO name, not the J1 position. Peripheral signals follow the firmware’s GPIO matrix and IO MUX setup, so a bus appears on whichever pads the firmware routes it to.

KeyValuesDefaultMeaning
revisionv0.0, v1.0, v1.3, v3.0, v3.1, v3.2v1.3Chip revision. v1.x cores run at 360 MHz, v3.x at 400 MHz
romauto, rev0, v1, rev300autoMask ROM. auto uses the selected revision’s own ROM
psramnone, 16MB, 32MB32MBIn-package PSRAM
flashMB4, 8, 16, 32, 6432External GigaDevice flash size in MB
const p4 = graph.addComponent("ESP32P4FunctionEV", {
id: "p4",
config: { revision: "v3.1", psram: "32MB", flashMB: 16 },
});
await p4.setFlash("./build/merged-binary.bin");

v1.x and v3.x images are not interchangeable, on silicon or here: pick the revision your image was built for.

Build with ESP-IDF 5.4 or 5.5 and merge the image:

Terminal window
idf.py set-target esp32p4
idf.py build
idf.py merge-bin # writes build/merged-binary.bin

esptool.py --chip esp32p4 merge_bin -o merged.bin @flash_args, run in the build directory, produces the same image.

  • v1.x revisions need CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y, the default in ESP-IDF 5.5. ESP-IDF 5.4 builds v1.x images only.
  • v3.x revisions need ESP-IDF 5.5.3 or later, built with CONFIG_ESP32P4_SELECTS_REV_LESS_V3=n.
  • The ESP32-P4 bootloader sits at 0x2000, so a merged image starts with padding. Upload the whole merged image, not bootloader.bin or the app .bin.

These are simulated and have been checked with upstream ESP-IDF test apps and examples:

AreaPeripherals
GPIO and timingGPIO (including flex glitch filters and ETM), LEDC, PCNT, RMT, MCPWM, GPTimer, SYSTIMER / esp_timer, watchdogs
Serial busesUART (including XON/XOFF flow control, autobaud, UHCI DMA), I2C master and slave, I3C, GP-SPI master and slave (including half-duplex quad), LP-SPI, TWAI/CAN ×3
AudioI2S (standard, PDM, TDM), LP I2S
DMAAHB and AXI GDMA, DW-GDMA, 2D-DMA
Graphics and videoPPA, JPEG codec, H.264, MIPI-DSI display, MIPI-CSI camera and ISP, parallel LCD/camera (LCD_CAM), PARLIO
StorageSDMMC (SD and eMMC), SD-SPI, flash (esp_flash, mmap, wear levelling, SPIFFS, NVS, OTA), PSRAM including execute-in-place from PSRAM
USBUSB OTG HS device (TinyUSB) and host, USB-Serial/JTAG including JTAG debugging with OpenOCD
EthernetEMAC with the IP101 PHY
Analog and sensingADC, temperature sensor, touch
SecuritySHA, AES, RSA (MPI), ECC, HMAC, Digital Signature, ECDSA, flash encryption (XTS-AES), eFuse keys; Key Manager on v3.x
PowerLP core, light sleep, deep sleep and wake-up sources
ChannelDescription
usbserialUSB-Serial/JTAG console — where ESP-IDF sends printf/ESP_LOG by default on this board
uart0–uart4One channel per UART; uart0 is the console when firmware selects UART0 (GPIO37/GPIO38)

Each channel streams to the terminal panel live and is readable afterwards with run.logs({ from: "p4:usbserial" }).

  • No Wi-Fi or Bluetooth: the ESP32-P4 has no radio, and a board’s Wi-Fi companion chip (often an ESP32-C6) is not simulated
  • Firmware has been tested with ESP-IDF; other frameworks have not
Docs
Open dashboard ↗