Debugando microcontrolador STM32F

Esta semana chegou em minhas mãos uma pequena placa de desenvolvimento e o seu gravador.

Esta placa possui o microcontrolador STM32F103C8T6, um ARM Cortex-M3 que roda em até 72 MHz, com 64 kB de flash (programa), 20 kB de RAM (variáveis) e diversas interfaces de comunicação.

Criando um projeto

Para programar vamos usar a STM32CubeIDE, uma IDE focada em microcontroladores fornecida pela STM. Vamos criar o projeto:

  • Crie o projeto
    • Menu File > New > STM32 Project.
    • Menu Arquivo > Novo > Projeto STM 32.
  • Em “Part Number” (à esquerda) digite o código do microcontrolador: STM32F103C8. Selecione na lista e avance (Next).
  • Dê um nome ao projeto: Blink (piscar). Finalize (Finish).
  • Abrirá este arquivo Blink.ioc, que contém as configurações do microcontrolador para geração automática do código do hardware.
  • Configure a interface de debug: à esquerda entre em SYS, selecione “Serial Wire” em Debug e selecione “SysTick” em Timebase Source (fonte de temporização). Note que dois pinos são marcados em verde, pois são usados pela interface de debug.
  • Na placa, o LED é indicado como PC13, então configuramos este como saída (GPIO_Output).
  • Agora basta salvar e confirmar que deseja gerar o código.

Programando para o LED piscar

Para fazer o LED piscar é muito simples. Usamos duas funções:

  • HAL_GPIO_WritePin(), para alterar o valor o IO que controla o LED; e
  • HAL_Delay(), para aguardar o tempo passar.

O arquivo com a função main() se encontra em Core/Src/main.c. Este é um dos arquivos gerados automaticamente pela IDE.

Note que você pode modificar o código entre os comentários de início (USER CODE BEGIN XXX) e fim (USER CODE END XXX).

A IDE usa estes comentários para saber onde inserir o código gerado automaticamente. O que estiver fora das regiões permitidas será eliminado na próxima vez que o arquivo Blink.ioc for editado e o código for gerado novamente.

Encontre o laço infinito [while(1){…}] e adicione as chamadas de função para aguardar (delay) e escrever no pino (write pin).

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // Desligar LED
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    HAL_Delay(500);

    // Ligar LED
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Configurando o debug

Para configurar o debug basta seguir os passos abaixo:

  • Primeiro é necessário compilar o projeto.
    • Menu Project > Build Project
    • Menu Projeto > Compilar Projeto
  • Abra as configurações de debug
    • Menu Run > Debug Configurations…
    • Menu Executar > Configurações de Debug/Depuração…
  • Selecione a opção “STM32 Cortex-M C/C++ Application”, clique nela com o botão contrário e crie uma nova configuração (New Configuration).
  • A configuração de debug deve se parecer com as duas da imagem. Abas: Main e Debugger.
  • Inicie o debugger clicando em “Debug”.
  • O programa vai parar no início da função main().
  • Então é possível usar:
    • “Step Into (F5)” para prosseguir passo a passo, entrando nas funções chamadas;
    • “Step Over (F6)” para prosseguir passo a passo, sem entrar nas funções chamadas;
    • “Step Return (F7)” para parar no retorno da função atual; e
    • “Resume (F8)” para continuar, parando no próximo breakpoint.
  • Para criar breakpoints basta dar um clique duplo no número da linha.

Conclusão

Agora é só se divertir com a placa de desenvolvimento: configure os pinos como entrada ou saída, escreva e leia eles.

Autor: Djones Boni

Engenheiro Eletricista.

Deixe um comentário

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