watchdog-iwdg.c

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · 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 STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) avec ST-LINK integre, 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 « 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

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