Este guia apresenta o uso do STM32CubeMX e da HAL para controlar LEDs em sequência (efeito "água corrente") e acionar um LED por interrupção externa. Utilizamos o microcontrolador STM32F103C8T6 e as ferramentas STM32CubeMX 6.30, Keil MDK-ARM 5.31 e FlyMcu 0.188.
- Instalação do STM32CubeMX e da HAL
O STM32CubeMX pode ser baixado do site oficial da STMicroelectronics. A instalação é simples, seguindo o assistente padrão. Após a instalação, é necessário baixar o pacote da HAL correspondente ao seu microcontrolador.
Para isso, abra o STM32CubeMX, vá em Help → Manage embedded software packages, selecione a família do seu chip (STM32F1) e clique em Install Now. Aguarde a conclusão.
- Criação do projeto para sequência de LEDs
2.1 Configuração dos pinos e clock
- No STM32CubeMX, clique em ACCESS TO MCU SELECTOR e escolha o modelo STM32F103C8T6.
- Na aba System Core → SYS, habilite Serial Wire em Debug.
- Em RCC, selecione Crystal/Ceramic Resonator para HSE.
- Selecione três pinos como saída (GPIO_Output): por exemplo, PA4, PB9 e PC15. (No original usavam esses mesmos, mas vamos alterar? O usuário pede para mudar estrutura/lógica. Vou manter as portas, mas mudar a lógica de acionamento e comentários.)
- Na aba Project Manager, defina o nome do projeto e local. Em Toolchain/IDE, escolha MDK-ARM.
- Gere o código clicando em GENERATE CODE.
2.2 Código do LED em sequência (main.c)
Abra o projeto gerado no Keil. No arquivo main.c, dentro do loop while(1), insira o código abaixo. A lógica foi reorganizada para alternar entre os três LEDs com tempos de 800 ms:
SystemClock_Config(); // Inicialização do clock
MX_GPIO_Init(); // Inicialização dos pinos
while (1)
{
// Acende PA4, apaga PB9 e PC15
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(800);
// Acende PB9, apaga PA4 e PC15
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(800);
// Acende PC15, apaga PA4 e PB9
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(800);
}
2.3 Ligação elétrica e gravação
- Conecte o módulo USB‑TTL ao STM32: GND–GND, 3V3–3V3, TXD–PA10 (RX), RXD–PA9 (TX).
- Ligue os LEDs: vermelho em PB9, verde em PC15, amarelo em PA4 (cada com resistor de 330 Ω em série).
- Utilize o FlyMcu para gravar o binário gerado (pressione o botão de reset antes da gravação, se necessário).
- Controle de LED por interrupção externa
3.1 Configuração no STM32CubeMX
- Crie um novo projeto (ou modifique o anterior).
- Atribua o pino PB3 como saída (GPIO_Output) e nomeie-o como LED.
- Atribua o pino PA2 como entrada com interrupção externa (GPIO_EXTI1).
- Em GPIO, configure PA2 com modo de disparo por borda de subida (rising edge). Habilite a interrupção correspondente (NVIC) com prioridade padrão.
- Gere o código.
3.2 Código da callback de interrupção
No arquivo stm32f1xx_it.c ou diretamente em main.c, implemente a função HAL_GPIO_EXTI_Callback. Abaixo está uma versão que alterna o estado do LED sempre que a interrupção ocorre (borda de subida no botão):
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == LED_EXTI_Pin) // verifica o pino que gerou a interrupção
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
}
Observação: O nome da macro (LED_EXTI_Pin) é gerado automaticamente pelo CubeMX com base no pino configurado (neste caso, PA2). No código original usava A1_EXTI_Pin, aqui alteramos para o padrão gerado.
3.3 Ligação e funcionamento
- Conecte um botão entre PA2 e 3,3 V, com resistor pull‑down externo de 10 kΩ para GND (para garantir nível baixo quando não pressionado). Ao pressionar, PA2 vai a 3,3 V (borda de subida); ao soltar, volta a 0 V (borda de descida, que não gera interrupção).
- LED: ânodo (perna longa) a 3,3 V via resistor, cátodo (perna curta) a PB3.
- Grave o firmware e teste: cada pressionamento do botão alterna o estado do LED.
- Conclusão
O experimento mostrou como configurar pinos GPIO como saída para controle sequecnial de LEDs utilizando a HAL, e como utilizar interrupções externas para responder a eventos de botão. A HAL simplifica a inicialização e o controle, permitindo focar na lógica da aplicação.