Se não consegue transferir código para o seu ESP32 e recebe a mensagem de erro ” Wrong boot mode “, então este tutorial é para si.
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.
Um ESP32 pode estar essencialmente em três modos diferentes. Pode “executar” um programa, pode estar em modo “(deep-) sleep” ou pode estar em modo “download/flash” para ser programado.
Antes de poder transferir código para um ESP32, o chip tem de estar no boot mode modo correto. Para entrar manualmente no modo de download ou flash de firmware, onde pode programar o seu ESP32, normalmente tem de pressionar os botões BOOT (ou GPIO0) e EN (ou RESET) na sua placa de desenvolvimento (mais sobre isto a seguir).

Como este processo é pouco prático, muitas placas suportam um bootloader automático, onde o software de programação (por exemplo, Arduino IDE , esptool ) controla o modo de arranque através do chip conversor USB para série na placa de desenvolvimento.
No entanto, o bootloader automático depende de um circuito específico que envolve os pinos GPIO0 e ENABLE do ESP32. Em algumas placas de desenvolvimento, este circuito está incorreto/em falta e o bootloader automático não funciona corretamente ou não funciona de todo. Isto leva ao erro: ” Wrong boot mode detected (0x13) “, ao tentar transferir código para o ESP32.
As próximas duas secções explicam com mais detalhe o que está a causar o problema de transferência. Mas pode saltá-las se só estiver interessado nas possíveis soluções para este problema.
Como o bootloader automático está ligado e é ativado
Uma placa de desenvolvimento ESP32 normalmente tem um conector USB, que além da alimentação tem duas linhas de dados USB_DN e USB_DP , como mostrado no esquema do ESP32 Devkit-C abaixo:

As linhas de dados USB_DN e USB_DP estão ligadas a um chip conversor USB para série/UART (por exemplo, CP2102N ) que converte os dados USB em dados série nas linhas TXD e RXD . Mais importante ainda, também gera os sinais DTR e DSR , que controlam o fluxo de dados. Veja novamente o esquema à volta do CP2102N do ESP32 Devkit-C abaixo:

Os sinais de controlo DTR e DSR são então enviados para um circuito de “programação” que está ligado aos pinos EN(ABLE) e (GP)IO0 do ESP32:

Aqui está a tabela de verdade que descreve a função deste circuito de “programação”:

Mas para que a programação funcione de facto, o pino EN também precisa de estar ligado a um circuito RC composto por um R esistor (R11) e um C apacitor (C9), que introduz um atraso temporal no sinal EN :

É aqui que está o cerne do problema. Algumas placas de desenvolvimento não têm este circuito RC ou têm valores errados para o resistor ou condensador. Mais sobre isto na próxima secção e para ainda mais detalhes leia o ESP32 documentation on boot mode selection .
Porque é que o bootloader automático não funciona
Para colocar um ESP32 em download mode tem de mudar de um estado em que o pino ENABLE está alto e o pino GPIO0 está baixo, para um estado em que ENABLE está baixo e GPIO0 está baixo. Se quiser saber todos os detalhes técnicos, leia este excelente artigo: Understanding the automatic boot loader mechanism and truth table .
A mudança para o modo de download é sensível ao tempo e o Datasheet for the ESP32-WROVER-E board , por exemplo, indica:
Para garantir a alimentação do chip ESP32 durante o arranque, recomenda-se adicionar um circuito de atraso RC no pino
EN. O valor recomendado para o circuito RC é normalmente R = 10 kΩ e C = 1 µF.
No entanto, os parâmetros específicos devem ser ajustados com base no tempo de arranque do módulo e na sequência de arranque e reset do chip. Para o diagrama de tempos da sequência de arranque e reset do ESP32, consulte a Secção Power Scheme em ESP32 Datasheet .A imagem seguinte mostra o circuito RC (marcado com um retângulo amarelo) para a placa de desenvolvimento ESP32-WROVER-E . Note que os valores de R1 e C3 estão indicados como TBD (To Be Decided):

Em algumas placas de desenvolvimento este circuito RC está em falta ou os valores de R1 e C3 são inadequados, e por isso o bootloader automático não funciona. Neste caso, irá receber a mensagem de erro ” Wrong boot mode detected (0x13)! “, ao tentar programar o chip. Abaixo um exemplo de mensagem de erro ao usar o Arduino IDE e tentar transferir código para um WEMOS Lolin 32D board :

Nas próximas secções, mostro-lhe dois métodos manuais para colocar um ESP32 em modo de download e dois circuitos de hardware que pode adicionar para fazer o bootloader automático funcionar. Vai depender da placa de desenvolvimento específica, o que funciona ou não.
Soluções para Wrong boot mode detected
Solução 1: Carregue no botão BOOT e depois no RESET
Para manually switching an ESP32 board into download mode tem de primeiro pressionar e manter o botão [BOOT] (ou [IO0] ). Depois inicie a transferência, por exemplo no Arduino IDE ao carregar no botão de seta. Espere até aparecer o texto ” Connecting… “. Por fim, pressione e solte o botão [RESET] (ou [EN] ). O diagrama abaixo mostra-lhe o tempo de cada ação:

Este procedimento é, por exemplo, necessário para program an ESP32-cam board . Será igual ou semelhante noutras placas de desenvolvimento que não têm o circuito RC e não suportam o modo automático.
Infelizmente, há variações nesta temporização. Aparentemente, há placas em que tem de pressionar o botão [BOOT] quando vir o texto ” Connecting… ” mas não antes.
Depois de terminar o flash da sua placa, ela ficará em modo de download até pressionar [RESET] para que arranque normalmente de novo.
Finalmente, dependendo da placa, os dois botões podem estar identificados como Reset ou EN ou Enable , e Boot ou IO0 ou GPIO0 . A imagem seguinte mostra uma placa de desenvolvimento ESP-WROOM-32 com o botão [EN] e o botão [BOOT] :

Mas, novamente, há variações nisto. Por exemplo, a WEMOS Lolin 32D board só tem um botão [RESET] .
Solução 2: Carregue no botão RESET
Para placas de desenvolvimento como a WEMOS Lolin 32 classic , a WEMOS Lolin 32D board ou a WEMOS Lolin 32D Pro que só têm um botão [RESET] (mas não [BOOT] ), basta pressionar e soltar o botão [RESET] quando aparecer o texto ” Connecting… “.

Isto coloca a WEMOS Lolin 32D e as outras placas Lolin em modo de download e o programa começa a correr assim que a transferência termina. Embora isto seja melhor do que ter de alternar entre o botão [EN] e o botão [BOOT] , ainda não é totalmente automático.
Solução 3: Resistor de 10kΩ entre GPIO0 e GND
Para a WEMOS Lolin 32 classic , a WEMOS Lolin 32D board , a WEMOS Lolin 32D Pro, os seus clones e provavelmente outras placas, pode ativar o bootloader automático com uma simples alteração de hardware. Adicione um resistor de 10kΩ entre o GPIO0 e o GND como mostrado abaixo:

Com esta alteração já não precisa de pressionar nenhum botão ao programar a placa via Arduino IDE. Testei isto com a WEMOS Lolin 32D mas provavelmente funciona noutras placas Lolin e clones também. Curiosamente, não é necessário para a WEMOS Lolin 32 lite e clones dessa placa.
A desvantagem desta solução é que mantém permanentemente o GPIO0 ligado ao GND, por isso já não pode usá-lo como IO, e pode não funcionar em algumas placas. Uma solução melhor é adicionar um condensador entre EN e GND ( GND ) como descrito na próxima secção.
Solução 4: Condensador de 1µF entre RESET/ENABLE e GND
A folha de dados do ESP32 recomenda um condensador de 1µF para o circuito RC. Em algumas placas de desenvolvimento este condensador está em falta ou tem uma capacitância insuficiente. Adicionar um condensador de 1µF entre o pino EN/RESET e o GND resolve isto e o bootloader automático passa a funcionar.
Testei isto com a WEMOS Lolin 32 classic , a WEMOS Lolin 32D e deverá funcionar também para a WEMOS Lolin 32D Pro. Como já referido, não é necessário para a WEMOS Lolin 32 lite e os seus clones.
Ao adicionar o condensador, tenha atenção à polaridade correta. Veja o circuito mostrado abaixo.

Se só precisar de programar a placa algumas vezes, pode adicionar temporariamente o condensador numa breadboard e depois removê-lo quando a placa estiver a funcionar permanentemente:

No entanto, se quiser usar a placa regularmente para desenvolvimento, pode soldar o condensador permanentemente entre os pinos EN e GND. As pernas de um condensador típico de 1µF são suficientemente longas para isto. Veja a imagem abaixo:

Finalmente, também tive uma DOIT DEVIT V1 ESP32-WROOM-32 board , onde o bootloader automático também não funcionava. Adicionar o condensador de 1µF soldado entre EN e GND resolveu o problema:

Solução 5: Remover o cartão SD do ESP32-CAM
Se tem uma placa ESP32-CAM , descobri que remover o cartão SD do slot também pode resolver o erro Wrong boot mode . Isto pode só acontecer se estiver a correr um programa no ESP32-CAM que interaja com o cartão SD.

A razão parece ser que o leitor de cartões SD normalmente comunica via SPI, que usa o GPIO2. No entanto, o GPIO2 deve estar em LOW para o arranque correto em muitas configurações ESP32. Se o cartão SD ou o leitor de cartões SD puxar o GPIO2 para HIGH durante o arranque (por exemplo, através de pull-ups internos no cartão ou módulo SD), o ESP32 pode entrar num modo de arranque inválido, resultando no erro Wrong boot mode .
Outras razões para falha ao transferir
Podem existir muitas outras razões para o seu computador não conseguir transferir código para o ESP32. O Troubleshooting Guide for the ESP32 lista as seguintes coisas que pode tentar:
- Verifique se está a passar a porta série correta na linha de comandos.
- Verifique se tem permissões para aceder à porta série, e se outro software (como modem-manager no Linux) não está a tentar interagir com ela. Um erro comum é deixar um terminal série aberto noutra janela e esquecer-se disso.
- Verifique se o chip está a receber 3.3V de uma fonte de alimentação estável (veja Insufficient Power para mais detalhes.)
- Verifique se todos os pinos estão ligados como descrito em Boot Mode Selection . Verifique as tensões em cada pino com um multímetro, pinos “altos” devem estar perto de 3.3V e pinos “baixos” perto de 0V.
- Se ligou outros dispositivos aos pinos GPIO, tente removê-los e veja se o esptool começa a funcionar.
- Tente usar uma taxa de transmissão mais lenta (
-b 9600é um valor muito lento que pode usar para verificar se não é um problema de baud rate).
Conclusões
Este tutorial mostrou-lhe como colocar um ESP32 em modo de download, o que permite programar o ESP32. Dependendo da placa de desenvolvimento, isto pode ser um processo totalmente automático ou pode exigir algumas alterações de hardware para ativar o bootloader automático.
Sem um esquema da placa de desenvolvimento específica, não saberá que condensador ou resistor é necessário para corrigir o circuito RC. Mas um condensador de 1µF ou um resistor de 10kΩ deve funcionar na maioria dos casos. Se não funcionar, experimente outros valores. É pouco provável que danifique a placa.
Se tiver dúvidas, sinta-se à vontade para as deixar na secção de comentários.
Links
- ESP32 Flashing Problems
- Boot Mode Selection
- Understanding the automatic boot loader mechanism and truth table
- Trouble using the esptool with Lolin D32 Pro and Lolin D32 boards
- ESP32 Troubleshooting Flashing
- ESP32-WROVER-E Datasheet
- ESP32 Technical Documents
- How to flash an ESP32 on production

