clignotante.c
Le clignotement de référence en C nu avec la STM32 HAL : la LED broche 12 de la carte bascule toutes les 500 ms grâce au tick SysTick de 1 ms. Le squelette est celui généré par STM32CubeIDE, prêt à compiler.
Matériel requis
Une STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) avec ST-LINK integre, broches 3,3 V. Aucun : la LED utilisateur (LED4 verte, broche PD12 ; les autres LED sont PD13-PD15) suffit. La carte se programme via son connecteur USB (ST-LINK ou bootloader).
Câblage
Rien à câbler : LED interne sur GPIOD/GPIO_PIN_12, active à l'état HIGH.
Fonctionnement
HAL_Init() configure SysTick (tick 1 ms) ; HAL_GetTick() sert d'horloge non bloquante. HAL_GPIO_WritePin pilote la broche en push-pull. __WFI() endort le CPU entre deux ticks.
Exécution
Projet STM32CubeIDE « STM32F407G-DISC1 » : coller le code dans main.c, configurer le .ioc, Run. La carte dispose de 4 LED (PD12-PD15) et du bouton USER sur PA0.
Variantes
Créer le projet avec le .ioc fourni par ST (ou un fichier .ioc équivalent), ou passer par la bibliothèque LL pour un code plus léger.
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
}
}