Interfaces MCU

Circuito de reset automático e boot do ESP32 (DTR/RTS)

O circuito de dois transistores das placas de desenvolvimento da Espressif com o qual o esptool, o Arduino IDE e o PlatformIO resetam um ESP32 e iniciam seu bootloader serial pelas linhas DTR e RTS de uma ponte USB-UART, sem apertar botões.

Nível lógico de operação
3,3 V (VDD33 na DevKitC V4)
Componentes
8
Fórmulas
3
Armadilhas
4
Abrir no Web CAD
Fonte Verificada

Área de trabalho do esquema

ESP32 Auto-Reset and Boot CircuitExported from CircuitBaseR110kΩR210kΩQ12N3904Q22N3904R310kΩC11µFSW2ENSW1BOOTDTRRTS+3.3VGNDGNDENGNDIO0

Visão geral do circuito

Nível lógico de operação
3,3 V (VDD33 na DevKitC V4)
Componentes
8
Fórmulas
3
Armadilhas
4

Clique em qualquer componente no esquema para ver seus parâmetros elétricos e função no circuito.

Visão geral do circuito

Este é o bloco “auto program” do esquema da Espressif ESP32-DevKitC V4, redesenhado com a rede de atraso do EN e os botões BOOT e EN. O ESP32 inicia o bootloader serial quando IO0 está em nível baixo no instante em que sai do reset. Uma ponte USB-UART, como o CP2102N da DevKitC ou um CH340G, tem duas saídas de controle de modem livres, DTR e RTS, e as ferramentas de gravação de firmware as alternam para controlar EN e IO0. Os dois transistores NPN são acoplados em cruz, de modo que cada um conduz somente quando suas duas linhas de controle diferem: se DTR e RTS estão ambas em nível alto ou ambas em nível baixo, nada acontece, e um programa de terminal que aciona as duas linhas juntas não reseta o chip. A placa de referência usa transistores SS8050; o 2N3904 de uso geral desenhado aqui faz o mesmo trabalho com essas correntes. O resistor de pull-up e o capacitor do EN seguem os 10 kΩ e 1 µF recomendados pela Espressif; a DevKitC V4 usa 0,1 µF. O GPIO0 tem um pull-up interno fraco, por isso o circuito não precisa de resistor no IO0.

Especificações técnicas principais

Nível lógico de operação3,3 V (VDD33 na DevKitC V4)
Tabela verdade do controle (níveis de pino)DTR 1, RTS 0 → EN 0; DTR 0, RTS 1 → IO0 0; níveis iguais → EN 1, IO0 1 (esquema da DevKitC V4)
Condição de resetCHIP_PU abaixo de 0,6 V por pelo menos 50 µs (Espressif Hardware Design Guidelines)
Rede de atraso do EN10 kΩ e 1 µF recomendados pela Espressif, τ = 10 ms (calculado); a DevKitC V4 usa 0,1 µF
Condição de início do bootloaderIO0 em nível baixo na saída do reset; GPIO2 em nível baixo ou desconectado (documentação do esptool)
TransistoresSS8050 na DevKitC V4; aqui está desenhado o 2N3904
Corrente de base≈ 0,26 mA por transistor com resistores de base de 10 kΩ (calculado, supondo VBE ≈ 0,7 V)

Princípio de funcionamento e análise teórica

01

DTR e RTS da ponte USB-UART

DTR e RTS são saídas ativas em nível baixo: quando o software aciona uma linha, o pino vai a 0 V; quando a libera, volta a 3,3 V. Tudo a seguir é descrito em níveis de pino, como na tabela verdade impressa no esquema da DevKitC V4.

02

Transistores acoplados em cruz

Q1 tem a base no DTR através de R1 e o emissor no RTS; seu coletor puxa o EN. Q2 é a imagem espelhada: base no RTS através de R2, emissor no DTR e coletor no IO0. Um transistor conduz somente quando o lado da base está em nível alto e o lado do emissor em nível baixo:

DTR = 1, RTS = 1: ambos os transistores em corte, EN = 1, IO0 = 1.

DTR = 0, RTS = 0: ambos os transistores em corte, EN = 1, IO0 = 1.

DTR = 1, RTS = 0: Q1 conduz, EN = 0 (chip em reset), IO0 = 1.

DTR = 0, RTS = 1: Q2 conduz, EN = 1, IO0 = 0.

Como níveis iguais não chaveiam nada, abrir uma porta que aciona as duas linhas juntas não reseta o chip. Quando um transistor está em corte com o emissor em nível alto e a base em nível baixo, sua junção base-emissor fica reversamente polarizada com 3,3 V, bem abaixo da V(BR)EBO mínima de 6 V do 2N3904.

03

Reset

Primeiro o esptool define DTR = 1, RTS = 0. Q1 satura, puxa o EN para o terra e descarrega C1. O ESP32 reseta quando o CHIP_PU permanece abaixo de 0,6 V por pelo menos 50 µs; o esptool mantém esse estado por 100 ms. Com R1 = 10 kΩ a corrente de base de Q1 é de aproximadamente:

FORMULA & CALCULATION
IB = (VDTR - VBE) / (R1) ≈ (3.3 V - 0.7 V) / (10 kΩ) = 0.26 mA

o que satura o transistor contra os 0,33 mA fornecidos por R3.

04

Saída do reset com IO0 em nível baixo

Em seguida o esptool define DTR = 0 e RTS = 1 em duas chamadas consecutivas. Entre elas as duas linhas ficam brevemente em nível baixo e os dois transistores em corte; C1 desacelera a subida do EN durante essa pausa, então o chip ainda está em reset quando Q2 conduz e puxa o IO0 para nível baixo. Depois o EN sobe através de R3, carregando C1:

FORMULA & CALCULATION
\tau = R3 × C1 = 10 kΩ × 1\,µF = 10 ms

Ao sair do reset, o chip lê seus pinos de strapping. Ao encontrar IO0 em nível baixo, ele inicia o bootloader serial em vez do programa na flash. Para o bootloader iniciar, o GPIO2 também precisa estar em nível baixo ou desconectado.

05

Volta ao repouso

Após 50 ms o esptool libera o DTR, então as duas linhas ficam em nível alto, os dois transistores em corte e o IO0 volta a nível alto pelo pull-up interno. O bootloader continua rodando e a gravação segue por TXD0 e RXD0. Para executar o novo firmware, o esptool pulsa apenas o RTS (DTR = 1, RTS = 0): um reset por hardware comum com IO0 em nível alto.

Equações e fórmulas de dimensionamento

Constante de tempo do atraso do EN

τ = R3 · C1

Constante de tempo da subida do EN depois que Q1 ou SW2 o liberam.

SímboloParâmetroValor típico
R3Resistor de pull-up do EN10kΩ
C1Capacitor de atraso do EN1µF
τConstante de tempo (calculada)10ms

Tensão do EN durante a liberação

VEN(t) = VDD(1 − e − t/τ)

O EN chega a 63% da alimentação após uma constante de tempo e a cerca de 99% após cinco (50 ms com os valores desenhados).

SímboloParâmetroValor típico
VDDTensão de alimentação3.3V
τConstante de tempo10ms

Corrente de base do transistor

IB = VDD − VBER1

Corrente de base do transistor que conduz quando sua linha de controle está em nível alto e a outra em nível baixo.

SímboloParâmetroValor típico
VDDNível alto da linha de controle3.3V
VBETensão base-emissor (suposta)0.7V
R1Resistor de base10kΩ
IBCorrente de base (calculada)0.26mA

Lista de materiais (BOM)

Todas as peças necessárias para montar este circuito. Selecione uma referência para inspecioná-la no esquema.

Ref.ComponenteValorEncapsulamentoFunção no circuitoReferência
Transistor NPN de pequenos sinais

SS8050-G na DevKitC V4. Com essas correntes serve qualquer chave NPN pequena.

2N3904TO-92Puxa o EN para nível baixoTransistor NPN de pequenos sinais: pinagem e folha de dados
Transistor NPN de pequenos sinais

SS8050-G na DevKitC V4.

2N3904TO-92Puxa o IO0 para nível baixoTransistor NPN de pequenos sinais: pinagem e folha de dados
Resistor fixo

R21 na DevKitC V4.

10kΩ0603 / 0805 / axialResistor de base de Q1—
Resistor fixo

R22 na DevKitC V4.

10kΩ0603 / 0805 / axialResistor de base de Q2—
Resistor fixo

R11 na DevKitC V4.

10kΩ0603 / 0805 / axialPull-up do EN—
Capacitor cerâmico

Valor recomendado pela Espressif. A DevKitC V4 usa 0,1 µF (C9) e mais 0,1 µF em paralelo com o botão EN (C14).

1µF0603 / 0805Atraso do EN—
Chave táctil

A DevKitC V4 adiciona 0,1 µF em paralelo com ela (C15).

BOOTSMD / THTIO0 em nível baixo manualmente—
Chave táctilENSMD / THTReset manual—

Aplicações práticas e cenários de uso

Gravação de firmware por USB-UART em placas de desenvolvimento ESP32
Placas próprias com ESP32 que devem ser gravadas pelo Arduino IDE, PlatformIO ou ESP-IDF sem botões
Adaptadores USB-UART para gravar módulos ESP32
Jigas de teste que regravam placas automaticamente

Armadilhas críticas de projeto e cuidados de engenharia

Armadilhas encontradas em montagens reais, com a solução de cada uma.

Crítico

Capacitância insuficiente no EN

Sem capacitor entre EN e GND, ou com um muito pequeno, o reset automático não é confiável e o esptool pode não conseguir se conectar ao chip, principalmente no Windows.

Mitigação

Coloque de 1 µF a 10 µF entre EN e GND, como recomenda a documentação do esptool; 1 µF com 10 kΩ corresponde às diretrizes de projeto de hardware da Espressif.

Aviso

O monitor serial reseta ou prende a placa

Alguns programas de terminal e drivers acionam RTS ou DTR por conta própria ao abrir a porta, e o controle de fluxo por hardware RTS/CTS controla o RTS. Dependendo dos níveis, a placa reseta ou fica presa no reset ou no bootloader. No Linux, uma porta ociosa pode acionar o RTS por padrão.

Mitigação

Desative o controle de fluxo por hardware RTS/CTS no programa de terminal. No Linux, remova o HUPCL da porta (stty -F /dev/ttyUSB0 -hupcl), como descreve a documentação do esptool.

Aviso

Carga no GPIO2 bloqueia o bootloader

O ESP32 entra no bootloader serial somente se, além do IO0 em nível baixo, o GPIO2 também estiver em nível baixo ou desconectado. Um resistor de pull-up ou outro circuito que mantenha o GPIO2 em nível alto impede o reset automático, mesmo que os transistores chaveiem corretamente.

Mitigação

Deixe o GPIO2 desconectado ou garanta nível baixo nele durante o reset; não coloque resistor de pull-up nele.

Nota

Capacitor grande no IO0

Um capacitor grande no IO0 mantém o pino em nível baixo por algum tempo após a energização, e o chip pode iniciar o bootloader em vez do seu programa.

Mitigação

Não adicione capacitores de alto valor no IO0, como alertam as diretrizes de projeto de hardware da Espressif; o circuito depende apenas do pull-up interno fraco.

Fontes primárias

Ajude a manter esta página correta

Montou, simulou ou revisou este circuito? Confirme-o ou relate uma peça, valor ou ligação errada.

Abre um formulário público no GitHub com esta página já preenchida; é preciso uma conta gratuita do GitHub. Como funcionam relatos e confirmações

Código HTML

<iframe src="https://circuitbase.tech/embed/schematic/esp32-auto-reset-flashing-circuit?theme=paper" width="100%" height="500" frameborder="0" loading="lazy" style="border: 1px solid #e5e7eb; border-radius: 6px; max-width: 100%;" title="Circuito de reset automático e boot do ESP32 (DTR/RTS) — CircuitBase Interactive Schematic"></iframe>