watchdog-iwdg.c

STM32H7 Nucleo-144 (modèle phare : NUCLEO-H743ZI) · Archivo : watchdog-iwdg.c · Lenguaje : C · Uso : Surveiller le programme avec le watchdog IWDG et redémarrer en cas de blocage

El watchdog independiente IWDG reinicia la placa si el firmware deja de refrescarlo: aquí un bucle infinito simulado provoca el reset tras 30 ciclos. El puerto serie muestra claramente el rearranque automático.

Hardware

Una Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programada via ST-LINK (USB), pines de 3,3 V. Cable USB + terminal serie para observar los arranques sucesivos.

Cableado

Sin cableado. En CubeMX activa IWDG (reloj LSI, prescaler y reload para un retardo de ~2 s).

Funcionamiento

Una vez arrancado, el IWDG ya no se puede parar: si HAL_IWDG_Refresh no se llama antes de que venza el reload, el chip hace un reset hardware. El printf del arranque prueba el rearranque.

Ejecución

Proyecto STM32CubeIDE basado en la Nucleo-H743ZI: el codigo va en main.c, los perifericos se declaran en el .ioc y Run via ST-LINK. El monitor serie del ST-LINK muestra los printf a 115200.

Variantes

Guarda un contador de rearranques en un registro backup de la RTC o en flash para trazar los fallos, o refresca el perro en una tarea RTOS dedicada.

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();
    }
  }
}

← Volver a la ficha