diff --git a/cores/esp32/Arduino.h b/cores/esp32/Arduino.h
index 9048249a873..b3a1be98cb6 100644
--- a/cores/esp32/Arduino.h
+++ b/cores/esp32/Arduino.h
@@ -228,6 +228,12 @@ bool shouldPrintChipDebugReport(void);
     return true;                          \
   }
 
+uint64_t getArduinoSetupWaitTick(void);
+#define SET_SETUP_WAIT_TICK(tick)      \
+  uint64_t getArduinoSetupWaitTick() { \
+    return tick;                       \
+  }
+
 // allows user to bypass esp_spiram_test()
 bool esp_psram_extram_test(void);
 #define BYPASS_SPIRAM_TEST(bypass)    \
diff --git a/cores/esp32/main.cpp b/cores/esp32/main.cpp
index 6c4d50a9a84..9247a4dcb16 100644
--- a/cores/esp32/main.cpp
+++ b/cores/esp32/main.cpp
@@ -44,10 +44,15 @@ __attribute__((weak)) bool shouldPrintChipDebugReport(void) {
   return false;
 }
 
+__attribute__((weak)) uint64_t getArduinoSetupWaitTick(void) {
+  return 0;
+}
+
 void loopTask(void *pvParameters) {
 #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
   // sets UART0 (default console) RX/TX pins as already configured in boot or as defined in variants/pins_arduino.h
   Serial0.setPins(gpioNumberToDigitalPin(SOC_RX0), gpioNumberToDigitalPin(SOC_TX0));
+  vTaskDelay(getArduinoSetupWaitTick());
 #endif
 #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
   printBeforeSetupInfo();