Hackeando o STM32-VL-DISCOVERY para funcionar no STM32-Cube-IDE

A STM32-VL-DISCOVERY é uma placa de desenvolvimento antiga, que não é mais suportada na nova IDE STM32-CubeIDE da STM. Mesmo assim, o microcontrolador target dela, o STM32F100RB, um ARM de 32-bits, ainda está na ativa e pode ser utilizado sem riscos de descontinuação em novos projetos. Como tenho uma placa dessas e não queria jogá-la fora, tive que partir para as hackinagens para conseguir usá-la. A placa em si, possui dois microcontroladores, um deles é o próprio uC target, o outro implementa um ST-LINK, que permitiria a gravação e debug.

Na verdade, já estava conseguindo carregar binários de firmware nela, como mostrei no post Como gravar um STM32-VL-DISCOVERY com o ST-LINK v1. Entretanto, o debug de código não estava funcionando. Neste post mostro como fazê-lo funcionar, com um pouco de hardware hacking.

Se você não precisa do debug, pode usar o método descrito no post acima, a vantagem dele é que não necessita de nenhuma modificação de hardware, trata-se apenas de uma configuração no Cube-IDE.

Também escrevi um post mostrando como utilizar a placa discovery no VsCode em Como utilizar a placa STM32-VL-DISCOVERY no VSCode.

Quanto ao funcionamento da placa, o grande problema é que o ST-LINK embutido está na versão V1, que não é mais suportada, e a ferramenta oficial de atualização de firmware da ST não permite a atualização para a versão V2 suportada, pois existe uma incompatibilidade de hardware.

Como esta a incompatibilidade de hardware é pequena, conseguimos, com algumas soldas e um ST-LINK externo, atualizar o firmware do ST-LINK da placa discovery e fazer os ajustes necessários de hardware (na verdade um único jumper).

Este post é baseado neste post aqui. Entretanto, no meu post faço as soldas de uma maneira diferente, que acredito que seja bem mais fácil. E também explico como fazer a configuração no STM32-Cube-IDE para conseguirmos utilizar a função de depuração.

Resumo do método

Em resumo, o método consiste em:

  • Conectar o ST-LINK externo à interface SWD do ST-LINK embutido na placa discovery. Essa conexão é feita com a solda de alguns jumpers
  • Gravar o novo firmware (V2) no ST-LINK da placa discovery, “a força”
  • Desfazer as soldas do primeiro passo
  • Soldar um jumper adicional, que o ST-LINK-V2 exige
  • Configurar o STM32-Cube-IDE para debug via ST-LINK
  • Pronto

Materiais

Hardware

  • ST-LINK externo. Usei um genérico, desses:
  • Placa STM-VL-DISCOVERY
  • Ferramentas de solda
    • Certa habilidade para soldas finas em componentes SMD

Software

Passo 1: Acessando a Interface SWD

O ST-LINK embutido na placa discovery utiliza um STM32F103C8. O primeiro passo para atualizar seu firmware consiste em acessar fisicamente os pinos de sua interface SWD e conectá-los ao gravador externo.

A interface SWD é um padrão ARM, de design extremamente simplificado, necessitando apenas de dois pinos para gravação. Os pinos são: SWDIO (bidirecional) e SWCLK, além do GND e a alimentação do uC. Como a alimentação e o GND já estão expostos na barra de pinos da placa, só vamos precisar externalizar mais dois pinos.

Uma possível maneira de se fazer isso é puxando um jumper de cada perna do CI.

discovery_2
Fonte: https://visserslatijn.wordpress.com/2019/01/20/upgrade-st-link-v1-to-v2/

Esse tipo de solda requer certa habilidade, e sempre tem um certo risco de acabar danificando os pads ou pinos do componente. Felizmente, existe uma maneira mais fácil de externalizar esses pinos, através dos jumpers de solda SB3 a SB10 (solder bridges) e da barra de pinos CN3. Por sorte, os engenheiros da ST já deixaram os pads ali pra isso mesmo 🙂.

Soldando os pads SBx e conectando os jumpers da barra CN3, conforme o diagrama a seguir, é possível rotear as linhas SWDIO e SWCLK para o conector CN2.

Por padrão os pads DEFAULT vêm todos curto-circuitados e os pads PRG-32, abertos. Colocando isto em uma tabela, é assim que devem ficar:

SB3Fechado
SB4Aberto
SB5Aberto
SB6Fechado
SB7Fechado
SB8Aberto
SB9Aberto
SB10Fechado
CN3 Pinos 1 e 2Fechado
CN3 Pinos 3 e 4Fechado

Soldas feitas:

Estado dos jumpers para externalização da interfaces SWD

Observação: Não é necessário resistor de 0 ohms para curto-circuitar os pads, um pingo de solda dá conta.

O ST-LINK externo deve ser conectado da seguinte maneira:

ST-LINK ExternoPlaca STM32-VL-DISCOVERY
SWDIOPino 4 do CN2
SWCLKPino 2 do CN2
3V3Pino 3V3
GNDPino 3 do CN2

ST-LINK externo conectado a placa STM32-VL-DISCOVERY

Atualizando o Firmware

Depois de feitas as conexões do passo anterior, vamos conectar o ST-LINK externo na interface USB, o ST-LINK externo se encarregará de alimentar a placa discovery.

Em seguida, utilizaremos o software ST-Link Utility para carregar a versão V2 de firmware no ST-LINK embutido na placa discovery.

Primeiramente, vamos verificar se o ST-LINK externo consegue se conectar corretamente ao ST-LINK embutido, indo em Target > Connect. A conexão deve ser feita com sucesso (o dispositivo vai ser detectado), entretanto, não vai ser possível ler o conteúdo da memória do uC.

Por padrão, a proteção de leitura está habilitada, para desabilitá-la devemos ir em Target > Option Bytes e mudar a opção Read Out Protection para Disabled e aplicar a alteração.

Tela “Option Bytes”

Com a proteção desabilitada podemos carregar o novo firmware.

  • File > Open File…
  • Abrir o seguinte arquivo: Firmware ST-LINK-V2
  • Target > Program & Verify…
    • Start address: 0x08000000
    • Start
Novo firmware carregado

Nos próximos passos vamos desfazer as soldas e confirmar que o firmware foi atualizado com sucesso.

Desfazendo as soldas

Deve-se voltar ao padrão: os pads DEFAULT todos curto-circuitados e os pads PRG-32, abertos:

SB3Fechado
SB4Aberto
SB5Fechado
SB6Aberto
SB7Fechado
SB8Aberto
SB9Fechado
SB10Aberto
CN3 Pinos 1 e 2Fechado
CN3 Pinos 3 e 4Fechado

Verificando o Update de Firmware

Após desfazer as soldas, conectar a placa discovery via USB e abrir o software ST-LINK Upgrade. Se ele indicar a versão de firmware V2.X.X, o update foi feito com sucesso.

Firmware do ST-LINK atualizado com sucesso

Soldando o jumper PB12/PB14

Os pinos PB12 e PB14 devem ser conectados através um jumper para que o ST-LINK, agora atualizado para a V2, funcione corretamente. Esse jumper não é necessário para o processo de atualização de firmware, mas, após atualizado, é necessário para se comunicar com o microcontrolador target da placa.

MUITA atenção quanto à orientação do CI, estes pinos estão na fileira do conector USB

Essa é a parte mais difícil do processo em termos de solda. Os pinos PB12 e PB14 devem ser conectados através um jumper. Pessoalmente, a técnica que uso para essas casos é:

  • Lixar a ponta do fio (utilizei fio esmaltado fino)
  • Estanhar o fio levemente
  • Fixar o fio na posição que quero com auxílio de uma fita (nem precisa ser fita Kapton). No caso, encosto o fio no pino que quero e fixo
  • Soldar (um ferro de ponta fina ajuda)
  • Repetir para o outro pino

Segue o resultado:

Pinos PB12 e PB14 curto circuitados

Com o jumper entre os pinos PB12 e PB14 soldado, deve ser possível ler o conteúdo da memória do uC target. O target é o microcontrolador da placa a ser gravado/depurado pelo ST-LINK atualizado, ou seja o STM32F100RB. Para isso, vamos conectar a placa discovery na interface USB e utilizar o ST-LINK Utility para tentar se conectar ao target. Se for possível se conectar e ler conteúdo da memória confirmamos que a placa está funcionando corretamente.

Clicar em Target > Connect.

A figura abaixo mostra o que esperar em caso de sucesso.

ST-Link conectado ao uC target com sucesso

Se você chegou até aqui parabéns! 😁

Esta etapa conclui as alterações de hardware que devem ser feitas. Daqui pra frente é uma questão de configurar o Cube-IDE.


Configurando o CubeIDE

A configuração consiste em:

  • Rodar um servidor GDB, que controla o target. No caso utilizei o ST-LINK GDB server. Mas o OpenOCD também funciona.
  • Se conectar a este servidor GDB, pelo CubeIDE
  • Debugar

Se a placa STM32-VL-DISCOVERY fosse suportada pelo CubeIDE esta configuração seria bem mais simples. Mas como o CubeIDE assume que esta placa não é suportada, ele impede de criar uma configuração do tipo “STM32 Cortex-M C/C++ Application”. Sendo assim, temos que enganar o CubeIDE configurando um debug genérico via GDB.

Configurações de Debug

Rodando o servidor GDB

Utilizei o ST-LINK GDB Server para rodar o servidor GDB. No meu caso ele tinha sido instalado automaticamente com o CubeIDE e estava na pasta C:\ST\STM32CubeIDE_1.4.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.win32_1.4.0.202007081208\tools\bin\
Esta pasta estava salva na variável de ambiente ${cubeide_stlinkgdbserver_path}, do CubeIDE.

Entretanto, para que o ST-LINK GDB Server funcionasse corretamente, também foi necessário instalar o STM32CubeProgrammer software for all STM32. Instalei na pasta C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin

Após tudo instalado, com a placa discovery conectada via USB, você deve rodar o comando:

ST-LINK_gdbserver.exe -cp "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin" -d -e -k

Se funcionar, será exibida uma saída do tipo:

Servidor GDB escutando na porta 61234

O servidor GDB está rodando, agora, sem fechar esta janela, vamos configurar o CubeIDE para se conectar nele.

Conectando-se ao servidor GDB

Acesse Run > Debug Configurations e crie uma configuração do tipo GDB Hardware Debugging.

Na aba Debugger, configure:

  • GDB Command: ${gnu_tools_for_stm32_compiler_path}\arm-none-eabi-gdb.exe
  • JTAG Device: ST-LINK (ST-LINK GDB Device)

O restante pode deixar nos valores padrões.

Configurando o debugger GDB

Apenas para referência a variável ${gnu_tools_for_stm32_compiler_path} contém, aqui na minha máquina, o valor C:\ST\STM32CubeIDE_1.4.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.7-2018-q2-update.win32_1.4.0.202007081208\tools\bin

Clique em Apply para salvar as configurações e ao clicar em Debug, o código será compilado, o binário será carregado para o target e a depuração será iniciada! ❤

Debug funcionando 😎

Com Debug funcionando, agora vamos configurar o CubeIDE para iniciar o ST-LINK GDB Server automaticamente sempre que for iniciar um sessão de Debug, para que não precisemos deixá-lo rodando no terminal manualmente quando formos utilizá-lo.

Sendo assim, o ST-LINK GDB Server deve ser fechado para que possamos fazer os próximos passos.

Acesse a opção Run > External Tools > External Tools Configurations … e crie um Program chamado GDB Server, conforme a figura a seguir.

Configuração do Program GDB Server

Não se esqueça de clicar em Apply para salvar.

Agora vamos em Run > Debug Configurations … e criar um Launch Group.

Dentro da Aba Launches, clicar em Add e configurar conforme a seguir.

Ainda dentro da Aba Launches, clicar novamente em Add e configurar conforme a seguir.

Deve ficar assim:

Agora, ao utilizar esta configuração de debug criada, o servidor GDB será inicializado automaticamente e em seguida o CubeIDE irá se conectar a ele!

Conclusão

A placa STM32-VL-DISCOVERY possui um firmware antigo no seu ST-LINK embutido. O firmware V1 não é mais suportado pela STM32-CUBE-IDE e a ferramenta oficial de atualização não permite o update para a versão V2, que é suportada.

Neste artigo mostrei como atualizar o firmware do ST-LINK da placa STM32-VL-DISCOVERY da versão V1 para a versão V2, por meio de um ST-LINK externo e alguns trabalhos de solda.

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *