ESP32 Programmer
This guide explains how to use vPlayer as a standalone flasher for any ESP32-based board. Since different ESP32 variants (ESP32, ESP32-S2, ESP32-S3, ESP32-C3, etc.) may have unique partition layouts, you can specify memory offsets for the bootloader, partition table, firmware, and SPIFFS (or other file systems) in a simple config.txt file. vPlayer reads these offsets at startup, ensuring compatibility across multiple boards without recompilation.
To maintain different firmware sets, create unique folders on the SD card—one folder per firmware variant—placing the associated .bin files and a matching config.txt into each folder.
Source Code and bin file
Configuration File
Create a file named
config.txtin your firmware folder.Define offsets for each component (bootloader, partitions, firmware, etc.):
bootloaderNameOffset=0x0 partitionsNameOffset=0x8000 bootNameOffset=0xe000 firmwareNameOffset=0x10000 spiffsNameOffset=0x10000
These values are example offsets commonly used for an ESP32-C3.
Example for a Standard ESP32
bootNameOffset=0xe000 bootloaderNameOffset=0x1000 partitionsNameOffset=0x8000 firmwareNameOffset=0x10000 spiffsNameOffset=0x3D0000
Locating the Offsets
If you’re compiling and uploading with the Arduino IDE, you can retrieve the exact offsets by enabling verbose output (in File -> Preferences, check “Verbose Output” for both compile and upload). During the upload process, look for a line similar to:
"/Users/YourName/Library/Arduino15/packages/esp32/tools/esptool_py/4.9.dev3/esptool"
--chip esp32s3 --port "/dev/cu.usbmodem1412201" --baud 921600
--before default_reset --after hard_reset write_flash -z --flash_mode keep --flash_freq keep --flash_size keep
0x0 "/Users/YourName/Library/Caches/arduino/sketches/.../myProject.ino.bootloader.bin"
0x8000 "/Users/YourName/Library/Caches/arduino/sketches/.../myProject.ino.partitions.bin"
0xe000 "/Users/YourName/Library/Arduino15/packages/esp32/hardware/esp32/.../boot_app0.bin"
0x10000 "/Users/YourName/Library/Caches/arduino/sketches/.../myProject.ino.bin"
Here, each offset is followed by the corresponding .bin file:
0x0– Bootloader (.bootloader.bin)0x8000– Partition table (.partitions.bin)0xe000– Boot App (boot_app0.bin)0x10000– Main application firmware (myProject.ino.bin)
You can also copy these .bin files from their listed paths to your SD card folder, making sure they follow the naming rules below.
File Naming Requirements
When you select a folder on the SD card, the code checks for specific keywords in the filenames to identify each file type. This is how it knows which files to flash and their intended purpose.
Required Files
Bootloader - Must contain the substring
bootloaderin its filename. - Examples:bootloader_s3.bin,mybootloader.bin.Partition Table - Must contain the substring
partitionsin its filename. - Examples:partitions.bin,partitions_custom.bin.Main Firmware - Must contain either
.ino.bin(e.g.,mySketch.ino.bin) oresp32.bin(e.g.,myFirmware_esp32.bin) in its name. - If either substring is detected, it’s assumed to be the main application.Boot App - Must contain the substring
boot_appin its filename. - Example:boot_app0.bin.SPIFFS (Optional) - Must contain the substring
spiffs.bin(e.g.,myData_spiffs.bin). - If present, SPIFFS will be flashed using the offset inconfig.txt. - If missing, SPIFFS flashing is skipped.Configuration File - Must be named exactly
config.txt. - Includes key-value pairs for each file’s flash offset (e.g.,bootloaderNameOffset=0x0). - If this is missing, the flasher will not proceed.
Example Folder Layout
A typical folder might look like this:
/MyFirmwareFolder
├─ config.txt
├─ boot_app0.bin
├─ bootloader_s3.bin
├─ partitions_custom.bin
├─ mySketch.ino.bin
├─ myData_spiffs.bin
Where:
boot_app0.bin has
boot_appbootloader_s3.bin has
bootloaderpartitions_custom.bin has
partitionsmySketch.ino.bin has
.ino.binmyData_spiffs.bin has
spiffs.binconfig.txt defines the offsets.
Connection Basics
For minimal hookup, simply connect the vPlayer device to your target ESP32’s TX and RX pins. If you want automated programming (i.e., toggling the ESP32 into bootloader mode without manual intervention), you can add code to drive the BOOT and RESET lines directly—vPlayer has extra I/O pins available for this purpose. However, for a basic setup, you only need:
TX (vPlayer) -> RX (ESP32)
RX (vPlayer) -> TX (ESP32)
GND (shared between vPlayer and ESP32)
To enter the bootloader manually:
Hold the BOOT pin low,
Then toggle RESET or power cycle the ESP32 while BOOT is held low.