Como programar STM32 em C 29

No post anterior sobre STM32 vimos que é possível programar a placa STM32 Blue Pill através da IDE Arduino, sendo uma abordagem ideal para makers e iniciantes em STM32. Além disso é possível programar a placa utilizando algumas ferramentas do próprio fabricante STMicroelectronics. Essas ferramentas são utilizadas até mesmo na indústria. Então para você que quer se especializar nos microcontroladores STM32 este post irá trazer a base e uma abordagem mais profissional sobre STM32. Como projeto prático faremos um pequeno programa em C para piscar o LED da placa e você aprenderá como programar STM32 em C.

Ferramentas STMicroelectronics

A ST Microelectronics disponibiliza várias ferramentas para possibilitar o trabalho com seus produtos. Dentre todas as ferramentas temos as seguintes que iremos utilizar para desenvolver nosso projeto prático:

  • STM32CubeMX
  • TrueStudio
  • STMCubeProgrammer

STM32CubeMX

O STM32CubeMX é um programa de configuração para STM32. Com ele é possível escolher o microcontrolador com o qual se deseja trabalhar, configurar a função de pinos, gerar um código de inicialização com configuração necessária para funcionamento do microcontrolador, dentre outras funções. Esse software, juntamente com outras ferramentas, tem a iniciativa de tornar a vida dos programadores mais fácil, reduzindo esforço, tempo e custo de desenvolvimento.

Para baixar o STM32CubeMX acesse o seguinte link e crie uma conta no site caso ainda não tenha uma.

https://www.st.com/en/development-tools/stm32cubemx.html

TrueStudio

O TrueStudio é uma IDE voltada para o desenvolvimento de software para STM32. Pra quem já conhece o Eclipse vai ver que é familiar pois foi feito baseado no mesmo. É uma ferramenta gratuita e é usada tanto em empresas grandes como pequenas e também por estudantes e hobbistas em todo mundo. Recentemente a ferramenta foi comprada pela ST. Ela será utilizada para mostrar como programar STM32 em C.

Mais informações sobre o TrueStudio e download você encontra no link abaixo:

https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-ides/truestudio.html

STM32CubeProgrammer

Com o STM32CubeProgrammer é possível programar os microcontroladores da família STM32. Através de uma interface amigável é possível ler, gravar e verificar tanto as memórias internas como Flash e RAM como externas. O processo de comunicação com o microcontrolador é feito através da interface de debug SWD e JTAG ou utilizando um bootloader pela USB ou UART.

Mais informações sobre este software programador e download você encontra no seguinte link:

https://www.st.com/en/development-tools/stm32cubeprog.html

Configuração do projeto com CubeMX

Após ter baixado as três ferramentas acima já podemos ver como programar STM32 em C e começar a desenvolver o nosso projeto com STM32 usando primeiramente o STM32CubeMX.

Nesta seção iremos ver:

  • Criando novo projeto no CubeMX
  • Configuração dos pinos de Debug
  • Configuração do pino GPIO
  • Como gerar o projeto CubeMX

Abra o programa e clique em New Project.

Primeiro projeto STM32CubeMX

Será apresentada uma janela para escolha do microcontrolador. A lista tem mais de 1000 modelos mas é possível usar o campo de busca da esquerda digitando o microcontrolador presente na placa Blue Pill que iremos usar: STM32F103C8

Primeiro projeto STM32CubeMX

Serão apresentadas as características do microcontrolador. Então clique em Start Project.

Primeiro projeto STM32CubeMX

A tela a seguir é dividida em duas partes principais. Na esquerda temos diversos periféricos como I2C, SPI, CAN, ADC e na direita temos o microcontrolador com seus pinos.

Primeiro projeto STM32CubeMX

Primeiro precisamos configurar os pinos de Debug. Isso é muito importante pois não fazer esse passo pode impedir de fazer futuras gravações de firmware na placa. Não é algo crítico pois existe a possibilidade de corrigir. Então não se preocupe caso erre neste passo. Mas para facilitar configure os pinos de Debug da seguinte forma.

No menu da esquerda, escolha o item SYS e em Debug escolha Serial Wire como na figura abaixo:

Primeiro projeto STM32CubeMX

Note que dois pinos ficaram verdes. O Pino PA13 para SWDIO e PA14 para SWCLK. Assim, quando gravarmos o primeiro firmware, o microcontrolador já saberá que aqueles pinos serão usados para conectar o gravador/debugger. Então lembre-se. Sempre quando for criar um novo projeto, e for utilizar o gravador/debugger, esse passo é bem importante.

Essa ferramenta é bem legal pois podemos, por exemplo, clicar em um pino e configurá-lo como GPIO Input ou Output dentre outras funções.

Primeiro projeto STM32CubeMX

Clique no pino PC13 e selecione GPIO_Output. Escolhemos o pino PC13 pois é nele que o LED da placa BluePill se encontra. Iremos mostrar como programar STM32 em C fazendo um pisca LED com o LED PC13.

Agora é necessário configurar algumas características do GPIO. Para isso clique na aba Configuration e então no botão GPIO:

Primeiro projeto STM32CubeMX

Selecione a linha de informações do GPIO para abrir as opções. Mantenha as configurações como estão apenas mudando o User Label para BUILTIN_LED. Esse label irá facilitar na hora da programação. Clique em Apply e em OK.

Primeiro projeto STM32CubeMX

Voltando a aba Pinout veja que o pino PC13 está verde e com o nosso label escolhido anteriormente.

Primeiro projeto STM32CubeMX

Após os pinos configurados já podemos finalizar o projeto no CubeMX. Clique no botão superior onde é indicado “Generate source code based on user settings”.

Primeiro projeto STM32CubeMX

Na janela seguinte escolha um nome para o projeto, a pasta onde deverá ser salvo e a IDE que iremos utilizar que no caso é o TrueStudio. Clique Ok.

Primeiro projeto STM32CubeMX

Na janela seguinte, caso Open Project não funcione diretamente para abrir o projeto no TrueStudio simplesmente clique em Close pois também é possível abrir o projeto manualmente.

Primeiro projeto STM32CubeMX

Agora temos um projeto inicial com diversos arquivos de código de pré-configuração e inicialização do microcontrolador.

Trabalhando com o TrueStudio e como programar STM32 em C

Nesta seção iremos ver:

  • Abrir o projeto CubeMX no TrueStudio
  • Como programar STM32 em C criando uma rotina pisca LED
  • Compilar o projeto
  • Fazer o debug do programa pisca LED

Dentro do TrueStudio vá em File -> Open Project From File System e escolha a pasta onde o projeto foi salvo no CubeMX.

Compilamos o projeto clicando no botão Build.

Primeiro projeto TrueStudio como programar STM32 em C

Se você estiver usando Linux pode ser que apareçam as seguintes mensagens de erro:

Cannot run program "arm-atollic-eabi-objcopy.exe": Unknown reason
Error: Program "arm-atollic-eabi-objcopy.exe" not found in PATH

Como o Linux não usa .exe pode desconsiderar.

Se aparecer algo como abaixo e sem nenhum erro adicional é porque a compilação ocorreu OK:

Generate build reports...
Print size information
   text    data     bss     dec     hex filename
   4812      20    1568    6400    1900 projeto_teste_post.elf
Print size information done
Generate listing file
Output sent to: projeto_teste_post.list
Generate listing file done
Generate build reports done

Antes de realizar o debug e carregar o firmware para placa vamos colocar as funções de controle do LED. 

Abra o arquivo main.c e procure pelas linhas abaixo:

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{   
 
/* USER CODE END WHILE */

Esse while(1) é como se fosse o void loop() do Arduino. Alí que devemos colocar nosso programa.

Vamos usar duas funções do chamado HAL, Hardware Abstraction Layer, HAL_GPIO_TogglePin e HAL_Delay, que são funções parecidas como do Arduino DigitalWrite, PinMode, delay e etc.

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{   
    HAL_GPIO_TogglePin(BUILTIN_LED_GPIO_Port, BUILTIN_LED_Pin);
    HAL_Delay(1000);
 
/* USER CODE END WHILE */

Note que não precisamos usar o PC13 mas sim o BUILTIN_LED que escolhemos lá no CubeMX.

Sem modificar nada mais no arquivo, salve o main.c.

Antes de fazer o debug o gravador precisa estar conectado a placa BluePill da seguinte maneira.

Conexão Debugger STM32

Conecte o gravador na porta USB e clique no botão Debug no menu de ferramentas do TrueStudio. O firmware vai ser carregado e a IDE deve trocar para o ambiente de debug.

Primeiro Projeto TrueStudio

Agora é só ir apertando F6 ou clicar no botão Step Over no menu de ferramentas, até chegar nas funções Toggle e Delay. O LED da placa deverá piscar a cada passagem pela função Toggle.

Primeiro Projeto TrueStudio

Essa é uma grande vantagem sobre o Arduino. Além de aprender como programar STM32 em C, você pode percorrer por todo o código pausadamente e analisar possíveis erros.

Usando o STM32CubeProgrammer

Quando fizemos o debug pelo TrueStudio, a placa já foi programada com o programa pisca LED. Mas é possível utilizar um outro programa, o STM32CubeProgrammer, para gravarmos firmwares. Por exemplo quando você encontra um firmware pré-compilado e quer gravar na placa, pode ser usado o CubeProg, sem passar pelo TrueStudio.

Com a placa e debugger ainda conectados ao computador, abra o CubeProg e clique em Erase & Programming.

Usando STM32CubeProg

Você deve notar que o debugger foi conectado automaticamente. Clicando no botão Browse, você pode escolher o arquivo .elf que foi gerado no TrueStudio ao compilar o programa pisca LED. No meu caso ele se encontra em:

/home/giobauermeister/projects/workspace-stm32/projeto_teste_post/Debug/projeto_teste_post.elf

Selecione as opções desejadas como Verify programming ou Run after programming e então clique no botão Start Programming.

Usando STM32CubeProg

Caso ocorra algum erro tente realizar a programação novamente.

Esse é o básico do CubeProg. Existem diversas outras funções que podem ser realizadas como apagar a memória, configurar proteção de leitura e escrita e etc.

Conclusão

Agora você já deve saber como utilizar as ferramentas da STMicroelectronics para iniciar projetos com STM32 e como programar STM32 em C. Os próximos passos seriam estudar as APIs da biblioteca HAL e continuar colocando a mão na massa criando outros projetos. Existe um E-book grátis do professor Geoffrey Brown, bem interessante sobre STM32 com diversos exemplos práticos. Veja mais informações e link para download do E-book no Portal Embarcados. Pra quem prefere uma tradução para o português existe uma versão traduzida por uma turma de Engenharia de Automação e Controle da Universidade Federal do Espírito Santo e pode ser baixada aqui.

No próximo post desta série iremos mostrar alguns produtos reais que utilizam STM32 e como utilizar o debugger USB para reprogramar um osciloscópio DSO150 vendido pela MakerHero.

Gostou de aprender como programar STM32 em C? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial. 

 

 

Faça seu comentário

Acesse sua conta e participe

29 Comentários

  1. Oi.
    Uma consulta, qual é a diferença entre a opção “Debug” e a opção “Run” no truestudio?.

    Agradeço desde já pela informação.

  2. Oi, uma consulta, é possível executar o programa passo a passo mas sem precisar ter a placa conectada?, é dizer, só quero ver como corre o programa passo a passo, olhando os câmbios nos registros e nas portas. É possível?.

    Desde já agradeço pela informação.

    No aguardo.

  3. Ótimo tutorial, muito obrigado!

  4. Gostei muito do artigo. Parabéns.
    Uma dúvida, quando não se configura os pinos de debug, como fazer para restaurar a capacidade de voltar a gravar a placa novamente ?

    Abraço !

  5. Olá, me chamo Allan, você saber me informar se eu consigo gravar o stm32f4ve sem o modulo gravador ? com o cabo mini usb dele ou com um arduino ?

    1. Allan,

      Dê uma olhada nesse link: https://www.makerhero.com/blog/stm32-com-ide-arduino-primeiros-passos/

      Abraços!
      Diogo – Equipe MakerHero

  6. Excelente Tutorial ! Fui inventar de desbravar sozinho usando STMCube e caí na tentação de debugar sem configurar os pinos. A plaquinha ficou “ingravável” mas mexi nos jumpers e deu pra restaurar !

    Parabéns pelo site e pelos tutoriais!

  7. Estou seguindo seu tutorial e quando chega na parte do truestudio o botão do debug esta fosco e não consigo clicar, como baixei recentemente a versão e mais recente e um pouco diferente talvez tenha que configurar alguma coisa!
    você poderia me ajudar! não consigo compilar o programa em c e envia para a placa!

    1. Alisson,

      Verifique todas as suas conexões e se seu pc está reconhecendo a placa. O problema pode estar aí 🙂

      Abraços!
      Diogo – Equipe MakerHero

      1. já verifiquei e está tudo ok! mas não consigo nem fazer o Build pois o botão está apagado!

  8. Faça piscar dois leds com o sistema operacional para microcontroladores FreeRTOS utilizando o microcontrolador stm32f103c6 da STMicrocontrolers… como faço isso?

  9. Estou tendo alguns problemas quando vou fazer o debug com o STM32CubeIDE, e não achei nenhuma solução em outros fóruns até agora. Estou recebendo a seguinte mensagem:

    Error in final launch sequence:

    Error in initializing ST-LINK device.
    Reason: (18) Could not verify ST device! Abort connection.

    O gravador* ainda funciona perfeitamente com a IDE do Arduino, e eu já tentei mexer nas conexões para descobrir se era algum erro antes de chegar na placa, desde tocar a ordem dos fios até desconectá-la completamente. Todas deram mensagens de erro diferentes que faziam bastante sentido com o contexto, mas essa está difícil de descobrir o que é…

    Todas as partes foram compradas na loja de vocês, então acredito que sejam de ótima qualidade e originais. Certamente ajudaria bastante se vocês conseguissem resolver esse problema que parece não ser limitado somente a mim. Muito obrigado e um bom dia!

    * Fui instruído pela IDE a atualizar o firmware do gravador, que não permitiu a última fase da gravação até que isso fosse feito.

    1. Gustavo,

      Já tentou verificar os drivers da placa? É bom dar uma conferida nisso.

      Abraços!
      Diogo – Equipe MakerHero

    2. Eu estou tendo o mesmo problema, mesmo verificando os drivers da placa. Já pesquisei o problema em diversos forums mas não achei um fix que resolvesse o problema. Você conseguiu resolver o problema?

      1. Eu tive o mesmo problema e não consegui resolver usando o true studio, mas consegui mudando de ide para o stm32cubeide e seguindo esses passos:

        https://stackoverflow.com/questions/58783393/atollic-couldnt-verify-st-device

        Ambas são baseadas em eclipse e são praticamente idênticas.

    1. Obrigado, Arthur!

      Todos aqui ficamos muito feliz que tenha gostado! E lembre-se de continuar se aventurando no #movimentoMaker!

      Abraços!
      Diogo – Equipe MakerHero

  10. Sensacional a iniciativa
    Parabéns!!

    1. Olá Luis,

      É muito bom saber que gostou do nosso trabalho 😀

      Abraço!
      Rosana – Equipe MakerHero

  11. Vou recomeçar a estudar o ST por aqui. O material está excelente, mas… seria interessante colocar as versões do SW utilizados no artigo. Hoje (26/1/19), pelo menos o CUBEMX está com a cara diferente do mostrado no artigo. Isto pode atrapalhar quem não tem muita prática com isto.

    1. Olá Richard!

      Que bom que nossa série de ST vai ser útil pra você. Confesso que quando comecei a aprender STM32, não consegui encontrar tanto conteúdo na internet e saber quais software eram necessários.

      Muito obrigado pela leitura e feedback. Vou dar uma olhada nas versões dos softwares.

  12. Parabéns pela iniciativa. Os STM32 são excelentes microcontroladores com um preço muito acessível. O seu tutorial foi completo: abordou o uso do CubeMX para gerar a configuração e como passar dele para o True Studio e desenvolver o projeto, compilar e gravar com oST Link. O livro que você citou também é muito bom e acessível para quem está começando.
    Achei excelente.
    E as black boards com STM32F407vet6? A MakerHero não tem planos de comercializa-las?

    1. Olá Pedro! Muito obrigado pela leitura e visita ao blog.

      Que bom que o tutorial foi útil.

      Ainda estamos começando a incluir produtos com STM32 na loja, mas com certeza futuramente teremos mais produtos STM32 e sua indicação do STM32F407vet6 é bastante válida.

      Abraço!

      1. Giovanni

        Aqui tem uma apresentação da placa que eu mencionei, é bem barata, 10-12 dolares e muito poderosa. Pode-se usa-la com o TrueStudio como você ensina acima ou carregar micropython e programa-la em python.

        https://os.mbed.com/users/hudakz/code/STM32F407VET6_Hello/shortlog/

  13. Giovanni.
    Muito bom seu artigo.
    Me envie seu email que te mando o pdf do livro do Geoffrey Brown em português.
    Vai ser muito util para iniciantes.
    Abraços

    1. Olá José! Muito obrigado pela visita ao blog e pela leitura.

      O livro será de grande valia, aceito sim. Segue meu e-mail: [email protected]

      Abraço!

      1. Muito bom o artigo , vou iniciar os estudos do STM32 !
        Se possivel pode me enviar o livro sobre o microcontrolador stm32
        Obrigado

        1. Olá, Edson!
          Que bom que curtiu o conteúdo! Clique aqui para baixar o livro 🙂

          Abraços!
          Diogo – Equipe MakerHero