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.