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
- Firmware ST-LINK-V2 (Binário)
- STM32-Cube-IDE
- ST-LINK GDB server
- STM32CubeProgrammer software for all STM32
- ST-LINK Utility
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.
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:
SB3 | Fechado |
SB4 | Aberto |
SB5 | Aberto |
SB6 | Fechado |
SB7 | Fechado |
SB8 | Aberto |
SB9 | Aberto |
SB10 | Fechado |
CN3 Pinos 1 e 2 | Fechado |
CN3 Pinos 3 e 4 | Fechado |
Soldas feitas:
Observação: Não é necessário resistor de 0 ohms para curto-circuitar os pads, um pingo de solda dá conta.
Conectando o ST-LINK externo
O ST-LINK externo deve ser conectado da seguinte maneira:
ST-LINK Externo | Placa STM32-VL-DISCOVERY |
---|---|
SWDIO | Pino 4 do CN2 |
SWCLK | Pino 2 do CN2 |
3V3 | Pino 3V3 |
GND | Pino 3 do CN2 |
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.
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
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:
SB3 | Fechado |
SB4 | Aberto |
SB5 | Fechado |
SB6 | Aberto |
SB7 | Fechado |
SB8 | Aberto |
SB9 | Fechado |
SB10 | Aberto |
CN3 Pinos 1 e 2 | Fechado |
CN3 Pinos 3 e 4 | Fechado |
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.
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.
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:
Testando a conectividade entre ST-LINK e uC target
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.
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.
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:
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.
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! ❤
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.
Rodando o ST-LINK GDB Server automaticamente
Acesse a opção Run > External Tools > External Tools Configurations … e crie um Program chamado GDB Server, conforme a figura a seguir.
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.
Deixe um comentário