watchdog-iwdg.c

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · 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 STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) con ST-LINK integrado, 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 « STM32F407G-DISC1 »: pega el codigo en main.c, configura el .ioc, Run. La placa tiene 4 LED (PD12-PD15) y el boton USER en PA0.

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