ESP32 – conhecendo os pinos de Strapping

ESP32 pinos de Strapping

Projetos com esse poderoso microcontrolador da Espressif vem se tornando muito frequentes, oferecendo conectividade sem fio, Wi-Fi e Bluetooth, com custos muito competitivos, permitindo criar variadas aplicações para IoT. Vou trazer aqui neste artigo, detalhes sobre os pinos de strapping do ESP32, para evitar problemas nos seus projetos baseados nessa plataforma.

O que são os pinos de Strapping?

Os pinos de strapping definem algumas configurações do ESP32. Durante o curto processo de  inicialização da CPU, é lido o estado lógico presente na entrada de cada um desses pinos especiais e esses estados (0 ou 1) são por sua vez, escritos num registrador chamado ”GPIO_STRAPPING”.

Após o processo de inicialização, esses pinos voltam a funcionar com sua função normal.

Os bits deste registrador configura o modo de boot, a tensão presente no pino VDD_SDIO e outras funções iniciais que vemos na tabela abaixo:

pinos de Strapping do ESP32
Figura 1 – Tabela funções dos pinos de strapping

O ESP32 têm cinco pinos de strapping: GPIO_12, GPIO_0, GPIO_2, GPIO_15 e GPIO_5.

pinos de Strapping do ESP32
Figura 2 – Destaque dos pinos no módulo ESP32-WROOM-32

Cada pino de strapping é conectado internamente a um resistor de pull-up ou pull-down interno durante a inicialização do chip (ver coluna “Default” na tabela da Fig.01). Consequentemente, se o pino está desconectado ou o circuito externo conectado é de alta impedância, o pull-up/pull-down interno determina o nível de entrada default dos pinos de strapping. Para alterar os valores default, o usuário pode aplicar as resistores externos para alterar o estado lógico da entrada.

Entendendo as funções dos pinos de strapping

Vamos entender o que exatamente cada pino de strapping faz, seguindo a tabela da Fig.01:

GPIO_12: Tensão do LDO interno do chip: Se este pino estiver desconectado (pull-down interno) ou com um nível lógico 0 na sua entrada durante a inicialização, o pino VDD_SDIO, que é uma saída de tensão de alimentação externa do chip, usado para alimentação de periféricos, terá tensão de 3V3 na sua saída. Agora se tiver com nível lógico 1, sua saída será de 1V8.

GPIO_0 e GPIO_2: Modo de Boot: Se ambos os pinos estiverem desconectados ou GPIO_0 em nível lógico 1 na sua entrada, o ESP32 irá executar o firmware gravado na memória FLASH pelo barramento SPI. Para entrar em modo de gravação do ESP32 (download boot) ambos pinos devem estar em nível lógico 0.

Esses três pinos de strapping acima são os que mais causam problemas. Vamos entender o porquê logo mais.

GPIO_15: Log de inicialização na saída do pino de comunicação serial U0TXD: Se este pino estiver desconectado (pull-up interno) ou com um nível lógico 1 na sua entrada, teremos na saída do pino U0TXD, que é referente à comunicação serial do chip, o Log de inicialização do chip, com diversas informações relevantes. Em nível lógico 0 esse Log é desabilitado.

image2 2
Figura 3 – Trecho de Log de inicialização no pino U0TXD

GPIO_5 e GPIO_15: Temporizações do SDIO Slave: Esse pinos definem as características da comunicação do chip com periférico SD card. Se ambos estiverem desconectados (pull-up interno) ou nível lógico 1, a comunicação será do tipo Rising-edge Sampling / Rising-edge Output.

Enfim, os problemas

Os problemas começam quando esquecemos desses pinos de strapping e de seus estados lógicos quando estamos definindo os GPIOs no esquemático do projeto.

Veja o esquemático abaixo, definimos o barramento I2C nos GPIO_12 e GPIO_13:

image9
Figura 4 – Barramento I2C

Esquecemos que o GPIO_12 (definido como SDA do I2C) é um pino de strapping, roteamos e montamos a placa do projeto dessa forma. O que vai acontecer ao ligar a placa?

  • Simplesmente nada vai funcionar: nada na saída serial, nada de gravação, nada de boot.

Sabemos que existe necessidade de resistores de pull-up no barramento de comunicação I2C para que o mesmo funcione adequadamente. Vide R21 e R22 no esquemático.

Colocando esses resistores para que o I2C funcione, colocamos o GPIO_12 em nível lógico 1… Aí está o problema!!!

Com o nível lógico em 1 definido durante a inicialização do ESP32, a memória FLASH interna ao módulo que tem a tensão de alimentação correta de 3V3, passou a ser alimentada com 1V8. Abaixo da tensão de trabalho recomendada.

A Fig.05 abaixo mostra como é ligado a memória FLASH internamente ao módulo. A alimentação da memória (pino 8 – VCC) provêm do pino VDD_SDIO, que tem sua tensão de saída definido pelo GPIO_12 durante a inicialização.

pinos de Strapping do ESP32
Figura 5 – Ligação memória FLASH interno ao módulo

Tem até uma nota no datasheet sobre essa situação (MTDI é o GPIO_12):

image7 1
Figura 6 – Nota no datasheet do ESP32

Outra situação:

Um simples botão ligado ao GPIO_2. Um resistor de pull-up e o botão ligado ao GND. Vemos isso em diversos projetos. Veja na Fig.07 abaixo:

pinos de Strapping do ESP32
Figura 7 – Ligação botão ao GPIO_2

Mais uma vez teremos problemas, dessa vez o ESP32 não entrará em modo gravação. O GPIO_2 define o modo de boot e para entrar em modo download (gravação), ambos pinos, GPIO_2 respectivamente e também o GPIO_0 devem estar em nível lógico 0. E nesse caso o GPIO_2 está permanentemente em nível lógico 1 através do resistor de pull-up R21.

Essa outra situação na Fig.08 não traz tantos problemas funcionais, mas pode provocar estranheza a quem espera a saída do Log de inicialização sendo printado na serial do chip.

pinos de Strapping do ESP32
Figura 8 – LED ligado ao GPIO_15

efinimos no programa o GPIO_15 como saída para ativação de um LED.

Durante a inicialização do ESP32, o GPIO_15 está sendo ligado ao GND através do resistor R21 e do LED D10 polarizado diretamente. Com o GPIO_15 em nível lógico 0 temos o desabilitação do Log de saída.

Conclusão – ESP32 – conhecendo os pinos de Strapping

O datasheet é sempre o melhor amigo de um desenvolvedor de hardware. A regra de ouro que fica aqui é a leitura atenciosa do datasheet e dos outros documentos pertinentes, sempre quando começar a trabalhar com um novo dispositivo (Ah, isso inclui os documentos de Erratas também!). Atente-se aos detalhes e as notas do fabricante. Faça uma lista dos pontos importantes a serem observados durante o projeto (check-list).

Isso ajudará a evitar erros, mas caso algum passar, ajudará para um debug mais rápido.

Referências

https://www.espressif.com/en/support/download/documents/chips

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf

Website | Veja + conteúdo

Graduando em engenharia de computação, técnico em eletrônica e informática. Tenho a eletrônica como hobby desde minha infância. Membro do Laboratório Hacker de Campinas - LHC, onde participo e contribuo ativamente das atividades. Atualmente trabalho como especialista em hardware, desenvolvendo soluções voltadas à IoT.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
5 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Jackson Lewandowski
Jackson Lewandowski
06/05/2021 10:42

Uma vez eu fiz um projeto que deixei a IO12 com pullup, estava fazendo uns teste para descobrir o porque não estava gravando e pá, por um acaso coloquei a IO12 em nível baixo e achei o erro heueheueheu

Jorge Pedro
jorge pedro
23/03/2021 17:06

muito obrigado pelo belo texto muito simples e explicativo.. eu tenho um projrcto e estou com alguns problemas. quando coloco o esp32 em mode de gravacao ele entra um modo de gravacao e consigo fazer a gravacao, mais quando reinicio o modo para entrar no modo normal (para ler o programa colocado) ele entra em lup infinito e imprimi a informacao abaixo sera que tem uma solucao? ja verfique todos os pinos alem de mais nao estou a usar comunicacao I2C rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x4007ecfc,len:8896 load:0x40080400,len:5816 csum err:0xe0!=0xfc ets_main.c 371  ets… Leia mais »

Last edited 4 meses atrás by jorge pedro
Alex Strasser
Alex Strasser
08/10/2020 10:59

Nossa excelente artigo. Acho que acabei estragando meu esp32. Carreguei um código grbl nele e funcionou mas não comandou a placa aí vi que tinha que fazer uma configuração no código foi quando carreguei normalmente o código só que ele não iniciou mais… se clicar em monitor serial aparece :
rst:0x3 (sw_reset) boot:0x13 (Spi_fast_flash_boot)… E mais um monte de coisa…
Alguma coisa do tipo que descreveu no artigo aconteceu….
Infelizmente perdi meu esp32.

Cesar Augusto
CESAR A BONADIO
26/02/2020 20:58

Bacana, parabéns pelo artigo

Talvez você goste:

Nenhum resultado encontrado.

Séries

Menu