Esptool es un conjunto de herramientas creadas en Python para programar las placas de desarrollo ESP8266, ESP8585, ESP32, ESP32-C2, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-S2 y ESP32-S3.
1.- Instala la ultima versión de Python (ocupas 3.10 o superior., sigue la guía)

2.- Instala Visual Studio Code (Sigue el tutorial)

3.- Crea una carpeta por ejemplo esptool y abren la carpeta con Visual Studio Code VSC

Marcamos estas opciones

4.- Creamos un entorno virtual para Python
Así gestionamos dependencias y paquetes de manera independiente. En VSC abrimos terminal y escribimos:
En Windows
python -m venv esptoolenv
Para MacOS / Linux
python3 -m venv esptoolenv5.- Activamos el entorno virtual
En Windows
Para evitar este error:


Deshabilitar las políticas de seguridad y poder abrir el script., ejecuta PowerShell como administrador

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Set-ExecutionPolicy RemoteSigned -Scope CurrentUserEscribimos S y Enter, en cada uno

Ahora si lo habilitamos
esptoolenv\Scripts\activate
En MacOS / Linux
source esptoolenv/bin/activateNos crear una carpeta esptoolenv en donde se instalaran los paquetes, scripts y todas las configuraciones del entorno
6.- Instalamos esptool
En Windows
pip install esptool
En MacOS / Linux
pip3 install esptool7.- Instala los controladores para tu placa ESP
necesarios para que tu equipo se comunique con el ESP
8.- Conecta tu ESP vía USB y anota el puerto

En Windows
Abrir Administrador de dispositivos > desplegamos Puertos (COM y LPT)
Para este caso es el COM3

En MacOS / Linux
sudo dmesg | grep ttyUsualmente están enumerados /dev/ttyUSB0,1, 2, 3, 4, 5
9.- Programar o Flashear un ESP
Para este ejemplo voy a usar una placa ESP32 y el firmware de BlueRetro el cual nos permite programar como receptor inalámbrico de controles de video juegos recientes (Xbox One S/X, PlayStation 5, PlayStation 4, PlayStation 3, Switch, Wii, Wii U, etc.) en consolas clásicas (N64, PS1, PS2, PSX, GameCube, Wii, NES, SNES, Dreamcast, etc.)., lo puedes descargar de esta pagina https://darthcloud.itch.io/blueretro Botón Download Now > apoya el proyecto o No thanks, just take me to the downloads > y descarga v25.04_hw1.zip, descomprímelo en el carpeta de trabajo esptool

En las carpetas bootloader, ota y partition_table se encuentran los binarios base que sumado al binario especifico para cada consola (ejemplo N64 BlueRetro_hw1_n64.bin) conformaran el firmware
En Windows
esptool -c esp32 -p COM3 -b 460800 --before default-reset --after hard-reset write-flash --flash-mode dio --flash-size 4MB --flash-freq 40m 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.binRemplaza COM3 por el puerto asignado COM1, 2, 3, 4, 5 etc.

En cuanto aparezca Connecting……… presiona el botón BOOT del ESP32 y suelta

En MacOS / Linux
sudo esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 --before default-reset --after hard-reset write-flash --flash-mode dio --flash-size 4MB --flash-freq 40m 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.binRemplaza /dev/ttyUSB0 el puerto de tu ESP /dev/ttyUSB0,1, 2, 3, 4, 5 etc.
Sobre las opciones de esptool
-c / --chip: especificamos que tipo de chip ESP8266, ESP32, ESP32-C2, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-S2 y ESP32-S3 Se puede omitir en versiones 5 y superiores lo detecta en automático (para verificar ejecuta esptool version)
-p / --port: especificamos el puerto de comunicación que se le ha asignado al conectarlo vía USB para Windows COM0,1,2,3,… en MacOs / Linux /dev/ttyUSB0,1,2,3,… Este parámetro se puede omitir ya que dinámicamente este buscara entre los puertos disponibles
-b / --baud: La velocidad de transferencia en baudios los mas comunes -b 230400 -b 460800 -b 921600 -b 1500000., por defecto es 115200
Modos de reseteo
Por defecto esptool intenta restablecer por completo el chip al modo de gestor de arranque antes Inicia y reinicia el chip para ejecutar el programa normal una vez que se completa
--before default-reset: es el valor predeterminado, que intentar restablecer el chip al modo de gestor de arranque.
--before no-reset: omitirá las asignaciones y simplemente comenzará a enviar un comando de sincronización en serie al chip
--before no-reset-no-sync: omitirá las asignaciones y omitirá también el comando de sincronización en serie
write-flash
Escribe los datos binarios en la Flash y tiene los siguientes argumentos:
--flash-mode / -fm: modo de estrada y salida del flasheo los valores que puede tener son keep, qio, qout, dio, dout., por defecto es keep, la mayoría de los módulos ESP32 utilizan qio.
--flash-size / -fs: Tamaño en megabytes del flash. Los valores válidos son keep, detect, 1MB, 2MB, 4MB, 8MB, 16MB podemos usar -fs detect para detectarlo de manera automática si falla el valor por defecto será de 4MB.
--flash-freq / -ff: frecuencia del flasheo es la velocidad en MHz de interacción con el dispositivo ESP. Los valores válidos son keep, 40m, 26m, 20m, 80m por defecto es keep. La mayoría de los chips funciona con velocidades de reloj de 40 MHz.
A partir de la versión 2.0 estos parámetros no son necesarios --flash-mode, --flash-size y --flash-freq.
Después del parámetro write-flash viene la direcciones que ocupara en memoria dentro del ESP y la ruta / archivo binario que se escribirá en este., las direcciones se especifican en formato hexadecimal 0x1000 o su valor equivalente en decimal 4096., si quieres convertirlo usa la consola de Python REPL https://repl.raymundopizano.com/

Como vimos algunos de los parámetros no son necesarios ya que estamos usando una versión superiora la 5 de esptool (v5.1.0) y los detecta o completa de manera dinámica por lo que podemos resumir de la siguiente manera:
esptool write-flash 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.bin
En MacOS / Linux
sudo esptool.py write-flash 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.binProbamos nuestro ESP32 con Blueretro
Vamos a la pagina https://blueretro.io/ (solo es compatible con Google Chrome y Microsoft Edge)

10. Merge fusionar los binarios y escribirlo
Fusionamos múltiples archivos binarios .bin para crear uno solo, esto lo hacemos con el comando merge-bin -o nombre-merged-flash.bin la opción -o es output / salida
En Windows
esptool -c esp32 merge-bin -o n64_blueretro_hw1v25.04_merged.bin --flash-mode dio --flash-size 4MB 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.bin
En MacOS / Linux
sudo esptool.py -c esp32 merge-bin -o n64_blueretro_hw1v25.04_merged.bin --flash-mode dio --flash-size 4MB 0x1000 ./bootloader/bootloader.bin 0x8000 ./partition_table/partition-table.bin 0xd000 ./ota/ota_data_initial.bin 0x10000 BlueRetro_hw1_n64.binEscribir el archivo merged / fusionado
Como este ya contiene todas las partes y direcciones en la flash, solo indicamos la dirección hexadecimal 0x0 / decimal 0 donde comenzara a escribir
esptool write-flash 0x0 n64_blueretro_hw1v25.04_merged.bin
11. Actualizar esptool
pip3 install --upgrade esptool12. Desactivar ENV
Una vez terminado de usar la esptool podemos deshabilitar el entorno virtual
deactivate
Y si ya no lo ocupamos borramos la carpeta esptoolenv
Otra alternativa solo para Windows es Flash Download Tools.
Mas fácil de usar que esptool. Compatible con Windows 7, 10 y 11 (64bits).
Descarga y descomprime Flash Download Tool
Escribir los binarios
Ejecuta flash_download_tool_3.9.9_R2.exe en la carpeta donde lo descomprimiste

Selecciona ESP32 (o tu placa a programar) y botón OK

Ubica los binarios de Blueretro en sus carpetas con el botón […], escribe su dirección @ y marca todas las casillas.
| BIN | Dirección |
| bootloader.bin | 0x1000 |
| partition-table.bin | 0x8000 |
| ota_data_initial.bin | 0xD000 |
| BlueRetro_hw1_n64.bin (la versión para tu consola) | 0x10000 |


Verifica que SPI SPEED este en 40MHz, SPI MODE en DIO., estos valores están por defecto
Conecta tu ESP vía USB y anota el puerto

Abrir Administrador de dispositivos > desplegamos Puertos (COM y LPT)
Para este caso es el COM3 y selecciónalo en el Flash Download Tool en la opción COM:

Presiona el botón START en cuanto aparezca SYNC presiona el botón BOOT del ESP32 y suelta en cuanto cambie a Download., al terminar aparecerá FINISH.


Merge fusionar los binarios
Fusionamos múltiples archivos binarios .bin para crear uno solo firmware. Mantén todos los parámetros anteriores y presiona [ ConbineBin ], abrirá una carpeta con el target.bin


Escribir el bin fusionado / merged
El target.bin contiene todas las partes del firmware por lo que se escribe en la dirección inicial de memoria hexadecimal 0x0 o decimal 0, ubica el archivo en el botón […] solo marca el targe.bin y escribe en la dirección @ 0x0, conserva los para metros de la imagen y realiza el mismo procedimiento de escritura del .bin



