Every ESP32 talks the moment it resets. Before any program runs, the code built into the chip (its ROM) prints a few lines on its serial port at 115,200 baud: when its ROM was made, why the chip reset, how it is booting. There is nothing to program, and the EN button repeats it as often as you like. It is the easiest real serial signal there is to practise on.
The ROM prints on UART0. Its TX pin by chip, from Espressif's ESP-IDF (the pin definitions for each chip):
| Chip | UART0 TX |
|---|---|
| ESP32 | GPIO1 |
| ESP32-S2 | GPIO43 |
| ESP32-S3 | GPIO43 |
| ESP32-C3 | GPIO21 |
| ESP32-C6 | GPIO16 |
On a dev board the same pin also goes to the USB-to-serial chip, which is how a serial monitor on your PC sees it; the probe and the PC can listen at the same time. The signal is 3.3 V logic, idling high.
A classic ESP32's ROM message, as Espressif's documentation shows it (ESP-IDF's Flash Encryption guide, a sample boot log):
ets Jun 8 2016 00:22:57 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:8452 load:0x40078000,len:13608 load:0x40080400,len:6664 entry 0x40080764
ets Jun 8 2016 00:22:57: the date of the ROM code built into the chip. It names the ROM, not your program. Newer chips print their own first lines instead; an ESP32-S3 prints ESP-ROM:esp32s3-20210327 and Build:Mar 27 2021.rst:0x1 (POWERON_RESET): why the chip reset, as a number and a name (the table below).boot:0x13 (SPI_FAST_FLASH_BOOT): the levels of the chip's strapping pins at reset, the pins it reads once to decide how to start. Each bit is one pin, set if it was high and clear if it was low; 0x13 is binary 1 0011. SPI_FAST_FLASH_BOOT is the normal start from flash; DOWNLOAD_BOOT(...) means the chip waits to be programmed (below). Other names mean a boot mode that is not supported was selected.configsip, SPIWP, the _drv values: how the chip's flash is wired and driven, from its eFuses (settings burnt into the chip) and the bootloader's header. Normal output.mode:DIO, clock div:2: how the ROM reads the flash (DIO: two data lines) and the clock divider from 80 MHz: 1 is 80 MHz, 2 is 40 MHz.load:0x…,len:… and entry 0x…: each piece of the second-stage bootloader as the ROM copies it from flash into memory, and the address it then starts at.After this, the second-stage bootloader and your program print whatever they are built to print. ESP-IDF's log lines look like I (28) boot: …: the level (I for information), the milliseconds since start, and which part is speaking.
The classic ESP32's reset reasons, from ESP-IDF's ROM header (the number the ROM prints is in hexadecimal):
| rst: | Name | What it means |
|---|---|---|
| 0x1 | POWERON_RESET | Power-on reset |
| 0x3 | SW_RESET | Software reset of the digital core |
| 0x5 | DEEPSLEEP_RESET | Waking from deep sleep |
| 0x7, 0x8 | TG0WDT_SYS_RESET, TG1WDT_SYS_RESET | A watchdog timer (timer group 0 or 1) ran out: a program stopped responding |
| 0x9 | RTCWDT_SYS_RESET | The RTC watchdog reset the digital core |
| 0xc | SW_CPU_RESET | Software reset of the CPU |
| 0xf | RTCWDT_BROWN_OUT_RESET | The supply voltage was not stable (a brown-out) |
| 0x10 | RTCWDT_RTC_RESET | The RTC watchdog reset the digital core and the RTC |
Newer chips number and name their reasons their own way; an ESP32-S3 prints rst:0x1 (POWERON). A board that keeps resetting with a watchdog or brown-out reason is telling you something about its program or its power supply, and this message is often the only place it says so.
Hold the board's BOOT button (it pulls GPIO0 low), press and release EN, then release BOOT. The chip read GPIO0 low at reset, and the message says so: the boot value changes and its name becomes DOWNLOAD_BOOT(...), the mode in which it waits to be programmed. Espressif's example of that line is rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2)). Press EN alone and it boots normally again.
Other strapping pins on the classic ESP32, from the same Espressif page: GPIO15 (MTDO) held low at reset silences the ROM's message; GPIO2 must be low or unconnected for download mode; GPIO12 held high selects 1.8 V for the flash, which can stop a board with 3.3 V flash from starting.
The ESP32's older cousin, the ESP8266, prints its boot message at 74,880 baud, not 115,200: Espressif's documentation gives 74,880 as its boot-log rate, and says that with a 26 MHz crystal this is its power-on default. (It is also exactly 115,200 × 26 / 40.) A serial monitor at 115,200 shows a line of garbage at every reset, then readable text once the program starts at its own rate.
That makes it a good baud-rate exercise: measure one bit (1 / 74,880 = 13.4 µs) or let Auto rate measure it; NovaOS names 74,880 among the rates it compares with. The record then holds two rates, the ROM's and the program's, so measure them one part at a time (why).
| What you see | Why, and what to change |
|---|---|
| Nothing on the pin at reset | The wrong pin for this chip (the table above), or the ROM's message is switched off (on a classic ESP32, GPIO15 held low at reset). |
| It stops before the text | The line may twitch as the chip resets. Move the trigger point further left, or arm Normal and press EN twice. |
| Characters, but garbage | Wrong baud rate: 115,200 for the ESP32 family's ROM, 74,880 for the ESP8266. Turn on Auto rate to measure it. |
Invalid header in the decoded text | The ROM could not read a valid bootloader from flash. Espressif lists the causes: no bootloader there, a flash wiring or power problem, flash encryption that does not match, or a strapping pin (GPIO2, GPIO12) in the wrong state. |
The chip's ROM prints at a fixed rate, and the monitor is at another. The ESP32 family's ROM uses 115,200 baud; the ESP8266's uses 74,880. Set the monitor to that rate, or decode it on the scope.
That the ESP32 started from a power-on reset. The number after rst: is the reset reason; the name beside it says what it means (the table above).
0x13 is the level of the chip's strapping pins at reset, one bit per pin; SPI_FAST_FLASH_BOOT means a normal start from flash. With the BOOT button held it reads DOWNLOAD_BOOT instead.
No. The message comes from the ROM built into the chip, before any program runs. A brand-new board prints it too.
Yes. The USB-to-serial chip and the probe both just listen to the TX pin. Clip the ground to the board's GND.
An XBee radio's serial line, from the wiring to the decoded answer: the trigger on the start bit, the time base and the decoder settings.
Find an unknown baud rateMeasure one bit, divide one by it, snap to a standard rate; the U trick, how close is close enough, and when to trust the scope's Auto.
Why the scope waits for a triggerAuto, Normal and Single; slope and level; and why a level that looks right still catches nothing on an idle line.