watchdog-iwdg.c

STM32H7 Nucleo-144 (porte-drapeau : NUCLEO-H743ZI) · Fichier : watchdog-iwdg.c · Langage : C · Usage : Surveiller le programme avec le watchdog IWDG et redémarrer en cas de blocage

Le watchdog indépendant IWDG redémarre la carte si le firmware cesse de le rafraîchir : ici une boucle infinie simulée provoque le reset au bout de 30 cycles. Le port série montre clairement le redémarrage automatique.

Matériel requis

Une Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programmee via ST-LINK (USB), broches 3,3 V. Câble USB + terminal série pour observer les boots successifs.

Câblage

Aucun câblage. Dans CubeMX, activer IWDG (horloge LSI, prescaler et reload pour ~2 s de délai).

Fonctionnement

Une fois démarré, l'IWDG ne peut plus être arrêté : si HAL_IWDG_Refresh n'est pas appelé avant la fin du reload, la puce fait un reset matériel. Le printf au boot prouve le redémarrage.

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

Sauvegarder un compteur de redémarrages dans la RTC backup register ou la flash pour tracer les crashs, ou rafraîchir le chien dans une tâche RTOS dédiée.

watchdog-iwdg.c

// IWDG : si le firmware ne « rafraichit » plus le chien, reset.
#include "main.h"

extern IWDG_HandleTypeDef hiwdg; // LSI/64, reload ~2 s dans CubeMX
extern UART_HandleTypeDef huart2;

int __io_putchar(int ch) {
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return ch;
}

static void tache_critique(void) {
  // Simule un blocage au bout de 30 appuis (test du watchdog).
  static int n = 0;
  if (++n == 30) for (;;);
}

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_IWDG_Init();   // demarre le chien des la configuration

  printf("Boot. Rafraichissement IWDG toutes les 500 ms\r\n");

  uint32_t t0 = 0;
  for (;;) {
    if (HAL_GetTick() - t0 >= 500) {
      t0 = HAL_GetTick();
      HAL_IWDG_Refresh(&hiwdg);   // « je suis vivant »
      printf("OK\r\n");
      tache_critique();
    }
  }
}

← Retour à la fiche