Laboratório Maker 09: Gravadores

Se você leu o artigo e viu o vídeo de exemplo do GDB com STM32, já tem pelo menos uma noção do que dá pra fazer de legal em termos de depuração. Nada como não precisar encher de prints nosso código, certo? E além disso, é muito mais explícito e amplo analisar o programa utilizando breakpoints e watchpoints. Mas nem sempre o que queremos é depurar um código, e com isso temos várias opções e vários preços também. Mas não pára por aí, por isso vamos dividir em tópicos esse artigo sobre gravadores.

Adaptador USB-TTL

Esse é um dos gravadores mais comuns e utilizado em placas que não têm porta USB, ou que precisam ter um bootloader gravado primeiro. Alguns modelos têm apenas o nível lógico 5V, não sendo adequado para todas as placas.

Nessa da imagem acima, temos a opção de 3V3 e 5V, além dos pinos TX, RX, GND. Ela também serve ao propósito de análise do barramento serial e é uma ferramenta de baixo custo.

Algumas pessoas cometem um erro ao conectar esse dispositivo a alguma MCU, ligando o TX do adaptador ao TX da MCU alvo, assim como o RX de um ao RX do outro. A maneira correta de conectar é ligando o TX de um ao RX do outro. Isso porque TX é Transmissor e RX é Receptor. Pense sempre assim; o Transmissor envia para o Receptor.

Adaptador FTDI

O adaptador FTDI é semelhante, mas tem uma característica que o diferencia. Ele possui os pinos RX, TX, GND, VCC, CTS e DTR. Com essa placa o reset para modo de gravação pode ser automático, enquanto com a USB-TTL temos que fazê-lo manualmente. É um dos gravadores mais populares também.

ST-LINK V2

Esse adaptador chinês serve para gravar STM8 e STM32. É um dos gravadores de baixo custo mais conhecidos para ARM, que podemos utilizar para gravar bootloader ou firmwares como o Nuttx, do qual já escrevi vários artigos. Nem adianta tentar iniciar o GDB nele, não vai funcionar.

JTAG – Qual adquirir?

Ao falar de JTAG, o assunto fica um pouco mais complicado. Vamos abrir com a introdução que todos usam:

“Joint Test Action Group (JTAG) foi um grupo criado em 1985 para desenvolver métodos de testes de circuitos, devido ao aumento da complexidade, que já estava tornando inviável o uso de pontos de prova”.

A função do JTAG é mais complexa do que depurar código: ele possui a habilidade de gravar e copiar firmware, permitindo engenharia reversa. Fazendo depuração, podemos adicionar breakpoints e watchpoints, mas repare que são funções específicas que podem trabalhar de diferentes maneiras, com diferentes ferramentas.

Uma das coisas chatas dessa história é que criaram o padrão de análise, mas não um dispositivo padrão. Desse modo, podemos ficar dependentes de licenças de software do fabricante, dependente de drivers etc. Por isso que na hora de escolher, além de observar a compatibilidade com a arquitetura alvo, é necessário também ver se tem compatibilidade com outras ferramentas como GDB e OpenOCD, que são opensource e facilmente integráveis em IDEs como Eclipse, VS Code e outras.

Quando utilizando o JTAG para debug e programação, apenas 4 fios de comunicação são usados. O conjunto de sinais é conhecido como Test Access Port ou, “TAP”. Eles são parte do padrão IEEE 1149.1, que é o padrão Boundary Scan do JTAG.

Essa é uma das ferramentas mais interessantes para interagir com circuitos eletrônicos microcontrolados, permitindo muitas vezes “ressuscitar” uma placa.

J-Link

Daí temos JTAGs para diferentes arquiteturas, mas qual escolher? Bem, pra Cortex-M e mais uma série de ARMs, escrevi recentemente o artigo JTAG no Laboratório Maker 08.

Black Magic Probe

Para um número mais reduzido, podemos converter um STM32 BluePill em um Black Magic Probe. Foi o utilizado no vídeo ao início do artigo.

Tem também o próprio Black Magic Probe, mas seu custo hoje é de 60 dólares. Para o Brasil é inviável no momento atual, mas tenho usado essa solução com a BluePill e tem sido suficiente para fazer debug em STM32. A partir do tópico JTAG, são todos mais que gravadores: são depuradores também.

ESP-Prog

Se for para ESP32, daí temos alguns outros modelos. Consideremos que o ESP32 tem 2 núcleos rodando RTOS com multithread. Não é fácil depurar um código, dependendo do tamanho, da complexidade e dos periféricos envolvidos. Esse JTAG funciona com OpenOCD e GDB, fazendo-nos ser programadores muito mais felizes!

O SWD ou, “Serial Wire Debug” é uma interface de depuração de 2 pinos (SWDIO e SWCLK). Com esse padrão podemos depurar e gravar placas ARM como a BluePill (Cortex-M3) e a Raspberry Pi Pico (Cortex-M0). Vale lembrar que a RP Pico também é dual core, mas sem rodar um RTOS só conseguimos executar 1 thread no segundo processador. Tenha em mente que o ESP32 não suporta SWD e JTAGs que são para uma linha específica de produto, e não devem funcionar em outro; um ST-LINK não deve funcionar em um ESP32. Um J-Link deve funcionar tanto em um Raspberry Pi Pico como em um BluePill, porque ambos são ARM Cortex-M.

Uma boa notícia é que na Pico já é possível instalar o Nuttx, Rust, RT-Thread, e rumores do FreeRTOS (até a edição e agendamento desse artigo).

Qual dongle adquirir?

Aí depende da necessidade. Todos os citados nesse artigo são ferramentas que uso em suas respectivas ocasiões, então a recomendação é: Tenha tantos quanto possível ou aplicável for!

Revisão: Ricardo Amaral de Andrade