Espressif ESP32-S3-Pico from WaveShare not supported board type?

My first time here.
I’m just starting to dev with ESP32.
When I create a new project and search the Board Types I can’t find Espressif ESP32-S3-Pico.
Can anyone tell me if this WaveShare board will be supported or…
Is there a generic S3 I can use ?

I using Espidf not Arduino.
I have uploaded a blink example and it works using the Board Type = Espressif ESPP-s3-DevKitc - 1.
BUT my problem is I can’t debug via OpenOCD / JTAG. That is why I need a different or specific Board Type… I think.
The JTAG GP pins are different on Espressif ESPP-s3-DevKitc and my WaveShare ESP32-S3-Pico.
I’m using the ESP-Prog JTAG breakout board for debugging

1 Like

I also came here to ask this. I want to use it with Arduino.

This is the board.

Is there a guide to adding boards somewhere?

Hi, just bumping this to help out who may find themselves needing a config:


platform = espressif32

board = lolin_s3_mini

framework = arduino

monitor_speed = 115200

build_flags = -DARDUINO_USB_CDC_ON_BOOT=1


when I found a board that did not have proper pins/characteristic defined I created my own. To do it:
1- go to the folder “.platformio/packages/framework-arduinoespressif32/variants” and create there a folder - in my case: zh_esp32s3_bare_module
2- inside this folder (in my case: “.platformio/packages/framework-arduinoespressif32/variants/zh_esp32s3_bare_module” ) there are files describing the board:

  • pins_arduino.h
#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <stdint.h>

#define USB_VID            0x239A
#define USB_PID            0x811B
#define USB_PRODUCT        "ZH S3-WROOM-1U N4 bare module"
#define USB_SERIAL         "" // Empty string for MAC adddress

#define NUM_DIGITAL_PINS        48
#define NUM_ANALOG_INPUTS       20

#define analogInputToDigitalPin(p)  (((p)<20)?(analogChannelToDigitalPin(p)):-1)
#define digitalPinToInterrupt(p)    (((p)<48)?(p):-1)
#define digitalPinHasPWM(p)         (p < 46)

static const uint8_t SDA = 8;
static const uint8_t SCL = 9;

static const uint8_t SS    = 42;
static const uint8_t MOSI  = 35;
static const uint8_t SCK   = 36;
static const uint8_t MISO  = 37;

#endif /* Pins_Arduino_h */
  • variant.cpp
#include "esp32-hal-gpio.h"
#include "pins_arduino.h"

extern "C" {

// Initialize variant/board, called before setup()
void initVariant(void)
  • zh_default_4MB.csv
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x1E0000,
app1,     app,  ota_1,   0x1F0000,0x1E0000,
spiffs,   data, spiffs,  0x3D0000,0x20000,
coredump, data, coredump,0x3F0000,0x10000,% 

3- inside folder: “.platformio/platforms/espressif32/boards/” you create the file i.e. “zh_esp32s3_bare_module.json” in which you provide more info:

  "build": {
      "ldscript": "esp32s3_out.ld",
      "partitions": "zh_default_4MB.csv"
    "core": "esp32",
    "extra_flags": [
    "f_cpu": "240000000L",
    "f_flash": "80000000L",
    "flash_mode": "qio",
    "hwids": [
    "mcu": "esp32s3",
    "variant": "zh_esp32s3_bare_module"
  "connectivity": [
  "debug": {
    "openocd_target": "esp32s3.cfg"
  "frameworks": [
  "name": "ZH S3-WROOM-1U N4 bare module",
  "upload": {
    "flash_size": "4MB",
    "maximum_ram_size": 327680,
    "maximum_size": 4194304,
    "use_1200bps_touch": true,
    "wait_for_upload_port": true,
    "require_upload_port": true,
    "speed": 460800
  "url": "",
  "vendor": "PAPIO LTD"

of course I copied templates from other boards (folders/files as examples) and I modified to my case
this way now in platformio.ini I declare this in

board = zh_esp32s3_bare_module

and further:

extends                 = base
board                   = ${zh_esp32s3_bare_module.board}
build_flags             = ${base.build_flags} 
    -D DEVICE_ID=93

This way you can stop relying on the vendors of the boards and you can create your own taste.
Of course where there are custom names, you need to keep them consistent across all these files.
if that helps