opencd init failed STM32F411RE platformio upload

Depois de carregar alguns programas para tentar piscar o led interno usando o platformio (no vscode) para uma bord stm32nucleo com o STM32F411RE, o carregamento (upload) deixou de funcionar e indicava o erro

error init mode failed (unable to connect to the target)
** opencd init failed **

O STM32CubeProgrammer também não se conseguia ligar. Na ultima linha do log dava os seguinte erro:

15:57:33 : STM32CubeProgrammer API v2.1.0
15:57:33 : ST-LINK error (DEV_CONNECT_ERR)
15:57:52 : ST-LINK SN : 066EFF555071494867112440
15:57:52 : ST-LINK FW : V2J33M25
15:57:52 : Voltage : 3.26V
15:57:52 : Error: No STM32 target found!

Entretanto depois de várias horas perdidas, na qual desconfigurei os drivers e voltei a ter que reinstalar tudo de novo, e com pesquisas muitas infrutíferas na web descobri uma que talvez tenha ajudado. Confesso que não sei se foi disso se foi uma mistura de duas coisas.

Mas antes dessa pagina, e depois de voltar a por os drivers em condições, depois descobri que conseguia ligar a placa e enviar o ficheiro elf usando o STM32CubeProgrammer.

Para ligar a placa bastou trocar o reset mode de software para hardware mode.

Com esta troca já consegui ligar STM32CubeProgrammer à placa.

O log ficou com o seguinte:

15:55:00 : ST-LINK SN : 066EFF555071494867112440
15:55:00 : V2J33M25
15:55:00 : Connected via SWD.
15:55:00 : SWD Frequency = 4,0 MHz.
15:55:00 : Connection mode : Connect Under Reset.
15:55:00 : Debug in Low Power mode enabled.
15:55:00 : Device ID:0x431
15:55:00 : Device flash Size : 512KBytes
15:55:00 : Device family :STM32F411xC/E

Por esta altura comecei a pensar que poderia alterar platformio.ini com alguma opção de reset mode e voltar a conseguir fazer o upload com o platformio.

Adicionei a seguinte linha e tentei

upload_resetmethod = hardware

Não funcionou.

Entretanto numa pesquisa sobre como reconfigurar o platformio.ini para fazer o reset descobri uma página que dizia para acrescentar o seguinte bloco ao platformio.ini:

upload_flags =
-f
interface/stlink.cfg
-c
transport select hla_swd
-f
target/stm32f4x.cfg
-c
init; reset halt; stm32f4x unlock 0; reset run

Mas também não funcionou. Mas curiosamente o erro “opencd init failed” desapareceu, ficou só o erro: “error init mode failed (unable to connect to the target)”, que já lá estava antes.

Por esta altura decidi voltar ao STM32CubeProgrammer e usa-lo para enviar o programa gerado pelo platformio.

Com o botão open file abri o ficheiro firmware.elf, e cliquei no botão download.

O ficheiro foi enviado para o mcu.

Posteriormente experimentei enviar através do platformio e funcionou bem. Fez o envio do programa.

Ai comecei a retirar os blocos de código que tinha colocado no platformio.ini e ficou simplesmente.

[env:genericSTM32F411RE]
platform = ststm32
board = genericSTM32F411RE
framework = arduino
upload_protocol = stlink
debug_tool = stlink

Mesmo assim, continuo a enviar o programa normalmente.

Problema resolvido