watchdog-iwdg.c
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();
}
}
}