watchdog-iwdg.c
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 Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programmee via ST-LINK (USB), 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
Creer un projet STM32CubeIDE (selection Nucleo-F401RE ou F411RE), coller le code dans main.c, configurer les peripheriques dans le .ioc, puis Executer > Run. Le terminal serie du ST-LINK affiche les printf a 115200.
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();
}
}
}