Skip to Content

Wrong boot mode ESP32

Wrong boot mode ESP32

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).

Transferir código do computador para o ESP32

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:

USB connector
Conector USB ( source )

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:

USB to UART converter
Conversor USB para UART ( source )

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:

"Programming" Circuit
Circuito de “Programação” ( source )

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

Truth table of "Programming" Circuit
Tabela de verdade do Circuito de “Programação” ( source )

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 :

RC Circuit
Circuito RC ( source )

É 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):

ESP32 RC delay circuit
Circuito de atraso RC do ESP32 ( source )

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 :

Error in Arduino IDE: Wrong boot mode detected (0x13)!
Erro no Arduino IDE: Wrong boot mode detected (0x13)!

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:

Timing for EN and IO0 button to enter download mode
Temporização dos botões EN e IO0 para entrar em modo de download

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] :

Buttons on ESP-WROOM-32 board
Botões na placa ESP-WROOM-32 ( source )

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… “.

[RESET] button on WEMOS Lolin 32D board (source )

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:

10kΩ Resistor between GPIO0 and GND for WEMOS Lolin 32D
Resistor de 10kΩ entre GPIO0 e GND para WEMOS Lolin 32D

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.

1µF Capacitor between EN and GND for WEMOS Lolin 32D
Condensador de 1µF entre EN e GND para WEMOS Lolin 32D

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:

1µF Capacitor between EN and GND for WEMOS Lolin 32D on breadboard
Condensador de 1µF entre EN e GND para WEMOS Lolin 32D em breadboard

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:

1µF Capacitor soldered between EN and GND for WEMOS Lolin 32D
Condensador de 1µF soldado entre EN e GND para WEMOS Lolin 32D

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:

1µF Capacitor between EN and GND for DOIT ESP32-WROOM-32 board
Condensador de 1µF entre EN e GND para DOIT ESP32-WROOM-32 board

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.

Remover o cartão SD do ESP32-CAM

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