clignotante.c
El parpadeo de referencia en C puro con STM32 HAL: el LED de usuario en pin 12 cambia cada 500 ms gracias al tick SysTick de 1 ms de HAL. El esqueleto es el generado por STM32CubeIDE, listo para compilar.
Hardware
Una STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) con ST-LINK integrado, pines de 3,3 V. Ninguno: basta con el LED de usuario (LED4 verte, broche PD12 ; les autres LED sont PD13-PD15). La placa se programa por su conector USB (ST-LINK o bootloader).
Cableado
Nada que cablear: LED interno en GPIOD/GPIO_PIN_12, activo en estado HIGH.
Funcionamiento
HAL_Init() configura SysTick (tick de 1 ms); HAL_GetTick() actúa como reloj no bloqueante. HAL_GPIO_WritePin controla el pin push-pull. __WFI() duerme la CPU entre ticks.
Ejecución
Proyecto STM32CubeIDE « STM32F407G-DISC1 »: pega el codigo en main.c, configura el .ioc, Run. La placa tiene 4 LED (PD12-PD15) y el boton USER en PA0.
Variantes
Crea el proyecto con el .ioc de ST (o uno equivalente), o usa la librería LL para un código más ligero.
clignotante.c
// Clignotement LED en STM32 HAL (projet genere par STM32CubeIDE/.ioc).
#include "main.h"
/* Broche de la LED utilisateur de la carte. */
#define LED_PORT GPIOD
#define LED_PIN GPIO_PIN_12
/* LED active a l'etat HIGH. */
uint32_t dernierBlink = 0;
uint8_t etat = 0;
int main(void) {
HAL_Init(); // SysTick 1 ms + priorites NVIC
SystemClock_Config(); // horloge generee depuis CubeMX
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitTypeDef g = {0};
g.Pin = LED_PIN;
g.Mode = GPIO_MODE_OUTPUT_PP; // sortie push-pull
g.Pull = GPIO_NOPULL;
g.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &g);
for (;;) {
if (HAL_GetTick() - dernierBlink >= 500) { // 500 ms
dernierBlink = HAL_GetTick();
etat ^= 1;
HAL_GPIO_WritePin(LED_PORT, LED_PIN, etat ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
__WFI(); // attend l'interruption SysTick : consomme moins
}
}