Mit einer 0 an GPIO12 legt der ESP nur 1,8V VCC an den internen FLASH-Baustein. Dann bootet der nicht mehr. Kannst du dein Signal "Ready" abklemmen oder auf 1 legen? Ebenso ist die Versorgung aus einem Schaltregler ohne RESET-Chip etwas fragwürdig. Der Regler braucht einige ms, bis die Spannung stabil ist. Erst danach sollte der ESP-Reset losgelassen werden.
Wenn die Spannungsversorgung stabil ist, nochmal einen Reset ausführen und GPIO12 auf 1 lassen. Danach kann man eine Fuse programmieren, dass der Pin12 keine Umschaltung mehr macht (COM-Port natürlich anpassen):
esptool.py --port com3 --chip esp32 erase_flash
Ausgabe dabei sollte so aussehen:
Chip is ESP32-D0WDQ6 (revision v1.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz
MAC: xxxxxx
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 1.5s
Wenn hier 0.0s stehen, dann ist der Flash-Speicher gesperrt!
Wahrscheinlich durch schwankende Versorgungsspannung setzen sich beim Ausschalten/Abstecken wohl manchmal einige Bits... Unten stehender Befehl setzt die Statusbits zurück, danach sollte der ESP32 wieder überschreibbar sein.
Statusbits des FLASH zurücksetzten:
esptool.py --port com3 write_flash_status --bytes 3 --non-volatile 0
Ergebnis sollte ähnlich aussehen:
Chip is ESP32-D0WDQ6 (revision v1.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz
MAC: xxxxxxxx
Uploading stub...
Running stub...
Stub running...
Initial flash status: 0x205200 <<< vorher
Setting flash status: 0x000000 <<< neuer Wert
After flash status: 0x001000 <<< Nachher, 1 Bit bleibt gesetzt
Hard resetting via RTS pin...
Versorgungsspannung des FLASH auf 3,3V festlegen (ACHTUNG GEHT NUR EINMAL!)
espefuse.py set_flash_voltage 3.3V -p com3