Da última vez que dominamos a criação de um novo projeto usando o STM CubeMX, a primeira parte pode ser encontrada
aqui.Para quem tem preguiça de reler - tudo acabou com o fato de o projeto vazio ter sido montado com sucesso.

Nesta parte, escreveremos o exemplo mais simples do Hello World no HAL, veremos como executar e usar o depurador e descobriremos quanta memória nosso programa consome, que nesta parte será escrita no HAL.
Tomamos como base o mesmo projeto vazio que foi inicializado na última parte.
Para piscar o LED, precisamos seguir o seguinte algoritmo:
- Defina o estado inverso ao atual na perna do microcontrolador. Ou seja, havia 0 - conjunto 1, havia 1 - conjunto 0 e assim por diante.
- Aguarde N pelo número de microssegundos e retorne à etapa 1.
Para cumprir o primeiro ponto, precisamos informar ao compilador a qual pino e porta o LED está conectado e qual funciona para inverter seu estado.
Primeiro, descobrimos onde conectamos o LED.
No arquivo main.c, imediatamente após os comentários introdutórios que a empresa ST gentilmente nos escreveu, há uma linha para conectar o arquivo de cabeçalho main.h

Clique com o botão direito nessa linha e localize o item Declaração Aberta

Ao clicar nele, iremos para o arquivo main.h
Onde encontrar nossos nomes declarados de pinos e portas.

Lembre-se, na primeira parte, ao inicializar a saída do LED PC13, preenchemos o campo Etiqueta do usuário e inserimos CLOCK_LED lá?
Ao gerar o projeto, o STM32CubeMX levou em consideração nossos desejos e agora, em vez dos GPIO_PIN_13 e GPIOC abstratos, podemos acessar nosso LED através dos CLOCK_LED_Pin e CLOCK_LED_GPIO_Port mais inteligíveis.
Com isso - o que vamos gerenciar - descobrimos.
Agora, estamos procurando uma função que possa mudar o estado do nosso GPIO para o oposto.
Para fazer isso, na árvore de projetos no lado esquerdo da tela - encontre o arquivo:
Drivers -> STM32F1xx_HAL_Driver -> Inc -> stm32f1xx_hal_gpio.h
Tem muitas coisas, mas precisamos de descrições das funções incluídas no bloco / * Exported functions * /
Encontre a função lá
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
É exatamente disso que precisamos.

Para que o LED pisque constantemente, é necessário colocar a chamada de nossa função em principal no corpo do loop principal do programa.
E para distinguir entre piscadas - adicione depois disso um atraso usando a função HAL_Delay (500);
Nesse caso, o atraso será de 500 ms.

A propósito, a função HAL_Delay também é descrita em
Drivers -> STM32F1xx_HAL_Driver -> Inc
somente no arquivo stm32f1xx_hal.h
Ou seja, para piscar um LED - precisávamos escrever apenas 2 linhas de código.
Se fizemos tudo certo, você pode tentar executar o depurador e ver como o programa é executado.


Você pode navegar pelo código do programa usando os botões F5 e F6
Ao mesmo tempo, o botão F6 funciona apenas em chamadas de função, e o botão F5 permite que você insira a função chamada e veja o que acontece dentro.

A única coisa que você não deseja detectar falhas durante a depuração é aconselhá-lo a desativar a otimização. Isso é feito através do menu Projeto -> Propriedades
O valor do Nível de otimização deve ser definido como Nenhum (-O0)

Depois de parar a depuração, o controlador reiniciará o código novamente e o executará ciclicamente.
O resultado deve ser algo como isto.

Resumir
O uso do HAL nos permitiu implementar essa tarefa escrevendo apenas 2 linhas de código.
Mas, para simplificação do trabalho, era necessário pagar com memória

1,54 KB de RAM e 4,69 KB de flash.
Deixe-me lembrá-lo de que a otimização está desativada, ou seja, "-O0"
É muito ou pouco?
Esta pergunta pode ser respondida com confiança apenas nas seguintes partes do artigo.
O artigo original está no
meu blog como sempre.