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 Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 KB flash) alimentada por micro-USB o 3,3 V externo; programacion SWD o bootloader serie. 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 (STM32F103C8) o Arduino (core STM32): programar por SWD (ST-LINK, adaptador DAPLink) o por el bootloader serie (BOOT0 a 1). Atencion: el LED PC13 es activo LOW.
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();
}
}
}