clignotante.c

STM32H7 Nucleo-144 (porte-drapeau : NUCLEO-H743ZI) · 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 0 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 Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programmee via ST-LINK (USB), broches 3,3 V. Aucun : la LED utilisateur (LD1, broche PB0 selon la cartographie officielle de la carte) suffit. La carte se programme via son connecteur USB (ST-LINK ou bootloader).

Câblage

Rien à câbler : LED interne sur GPIOB/GPIO_PIN_0, 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 base sur la Nucleo-H743ZI : le code se glisse dans main.c, les peripheriques se declarent dans le .ioc, puis Run via l'interface ST-LINK. Le moniteur serie du ST-LINK affiche les printf a 115200.

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  GPIOB
#define LED_PIN   GPIO_PIN_0
/* 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