clignotante.c

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · Fichier : clignotante.c · Langage : C · Usage : Faire clignoter la LED utilisateur avec la bibliothèque HAL

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
  }
}

← Retour à la fiche