2 de dezembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

OpenOCD no Raspberry Pi 400

RPi Pico no VS Code | Programar a RPi Pico | OpenOCD e GDB | OpenOCD no Raspberry

Dando continuidade à série, nesse artigo veremos como usar o OpenOCD no Raspberry Pi 400 para programar a Raspberry Pi Pico. Se não está acompanhando a série, ela começa por aqui:

Como aprender a programar em Python

Debug com Raspberry Pi

Como usar SWD na Raspberry

No artigo anterior (último link acima) descrevi o processo de instalação, configuração e wiring. Também citei, mas vou repetir: O OpenOCD não deve ser instalado pelo apt. Compile conforme descrito no artigo anterior para garantir o suporte ao multidrop do SWD. Não sabe do que estou falando? Calma, depois do artigo ainda tem o vídeo.

Wiring SWD no Raspberry Pi 400

Já mostrei o wiring no Raspberry, mas não no 400. Como o pinout é o mesmo, não tem muito o que fazer de diferente a não ser identificar o pino 1. A própria Raspberry Pi 400 identifica o pino 1 e o 40, de modo que fica claro que os pinos ímpares estão em cima e os pinos pares estão embaixo.

OpenOCD no Raspberry - GPIO

Instalação de dependências

Querendo ou não, será necessário ler o artigo anterior para configuração do ambiente, pois estou separando em partes para ficar fácil executar um determinado ponto da configuração. Então, invés de repetir novamente os comandos e o wiring, por favor, tenha paciência e consuma menos de 2 minutos nessa leitura.

Se tiver um erro do tipo “GnuTLS: Error in the pull function“, instale o pacote gnutls-bin. Ou garanta que esteja instalado antes de começar o processo. Coloquei essa anotação também no artigo anterior para garantir que esse pacote não faltará.

apt install gnutls-bin

Binário do programa

O OpenOCD espera binários do tipo .elf, invés do .uf2 usado pelo modo BOOTSEL. Estou presumindo que já tenha alguma experiência com o Raspberry Pi Pico e saiba o que é o formato .uf2. Se não, dê uma navegada pelo menu RASPBERRY e veja o que já foi feito com essa plaquinha incrível.

Se seguiu os procedimentos do artigo anterior deve ter um diretório pico no home do usuário pi. Abra um terminal no Raspberry (como mostrado na imagem a seguir, clicando na janela preta da barra de tarefas) e entre no diretório de exemplos.

cd ~/pico/pico-examples/build/hello_world
make -j3
OpenOCD no Raspberry - Build

Conforme a configuração, devemos ter agora o diretório serial e o diretório usb dentro de hello_world. Dentro desses diretórios teremos as versões hello_serial e hello_usb do .elf e do .uf2.

Se fôssemos fazer o upload pelo modo BOOTSEL, utilizaríamos agora um dos dois arquivos .uf2, mas aqui seguiremos pelo OpenOCD, portanto, entre no diretório do arquivo hello_serial.elf e carregue-o da seguinte forma:

cd serial
openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c "program hello_serial.elf verify reset exit"

Depois conecte-se à serial com um dos programas recomendados no artigo de debug com Raspberry Pi. Mas se preferir testar algo mais rápido, faça uma gravação do blink:

cd /home/pi/pico/pico-examples/build
make blink
cd blink
openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c "program blink.elf verify reset exit"

O upload deve terminar em uma tela assim:

OpenOCD no Raspberry - upload

E a placa, claro, com o LED piscando.

No caso, estamos especificando a interface de programação e as informações da placa alvo como parâmetro do OpenOCD (porque o OpenOCD não é uma ferramenta exclusiva para Raspberry Pi Pico, cuja MCU é a Cortex-M0). Por fim, indicamos o programa a carregar na flash, seguido por uma validação da gravação (verify), inicialização da placa (reset) e desconexão da Pico (exit).

Dica sobre erro: DAP init failed

Se ocorrer esse erro, significa que o OpenOCD não encontrou a RP2040 na interface SWD. As causas mais comuns para isso são a placa Pico não estar energizada pela USB (já dito no artigo anterior que é fundamental), o wiring pode estar incorreto ou falha na integridade do sinal (descrito também no artigo anterior). Vale mais uma vez a recomendação: Não use uma protoboard para no wiring do SWD porque muito provavelmente gerará erros de integridade. Um jumper defeituoso também pode ser a causa.

Achei que havia conectado a Raspberry Pi Pico à USB, mas não o havia feito. Quando executei o comando com OpenOCD, obtive um erro diferente desse, infelizmente não registrado. Mas fica a dica: Atente-se à alimentação da Raspberry Pi Pico pela USB.

Por que usar SWD invés do BOOTSEL?

O BOOTSEL é simples:

1 – Seguramos o botão BOOTSEL antes de conectar a Pico à USB.

2 – Conectamos à USB.

3 – Soltamos o botão.

4 – Abrimos o dispositivo de bloco criado pela Pico.

5 – Copiamos o arquivo .uf2 para a Pico.

6 – Ela desmonta o compartilhamento e reinicia, já executando seu programa.

É de fato fácil. Porém esse não é o melhor processo para quem está em fase de desenvolvimento do programa. Isso porque mesmo sendo um programador experiente, muitas vezes precisamos fazer testes de funções, testes de retorno, teste de comunicação com dispositivos periféricos etc. Dependendo do quão elaborado é o projeto, pode levar dias. Imagine a cada teste fazer todo esse processo acima. Vai gastar a porta USB.

Usando o SWD podemos não apenas fazer o upload diretamente o tempo inteiro enquanto estivermos desenvolvendo, como também podemos fazer a depuração de código com breakpoints, assim como um programa qualquer programado nativamente em uma arquitetura x86. Imagine que podemos parar a execução dos núcleos da Raspberry Pi Pico em qualquer ponto do seu código e analisar a memória; isto é, checar os valores atribuídos às variáveis, checar em quê resulta uma determinada condicional que faz outra chamada, criar uma task etc. Após todo o desenvolvimento, aí sim fica fácil gravar suas placas com o programa já depurado, copiando-os para a Raspberry Pi Pico como se fosse um pendrive.

No próximo artigo veremos como fazer a depuração e já escreveremos algum código de duas formas diferentes, criando condições que propiciem um debug.

Vídeo do OpenOCD no Raspberry Pi 400

Chegou a hora do primeiro vídeo, que está em fase de edição. Pode demorar um pouco, mas já está gravado. Inscreva-se em nosso canal DobitaobyteBrasil no Youtube e acompanhe tudo!