watchdog.c
Le WDT du nRF52840 réinitialise la puce si le firmware ne « nourrit » pas le canal dans le délai : gels de boucle, deadlocks et pannes logicielles deviennent des redémarrages automatiques. Indispensable dans un boîtier scellé.
Matériel requis
Une carte nRF52840-MDK (Nordic nRF52840, Cortex-M4F @ 64 MHz, 1 Mo flash / 256 Ko RAM, BLE 5 + 802.15.4) avec son debugger intégré, programmée en C sous nRF5 SDK v17 et SoftDevice S140. nRF52840-MDK seule ; un moniteur série optionnel pour observer les redémarrages.
Câblage
Aucun câblage ; LED P0.06 comme témoin de vie (elle s'éteint quand le programme gèle).
Fonctionnement
Le canal alloué doit être nourri avant expiration (≈ 8 s) ; en mode RUN_SLEEP le timer continue pendant le sommeil. Expiration → reset système, exécution repartie de main().
Exécution
Ouvrir l'exemple correspondant du nRF5 SDK v17 (target custom_board), coller ce code dans main.c, compiler avec Segger Embedded Studio ou Makefile gcc, puis programmer via le debugger intégré (flash_nrf.py ou IDE).
Variantes
Nourrir le watchdog seulement quand chaque sous-tâche a tourné (supervision fine), ou logger la cause du reset (POFFRESETREAS) en flash.
watchdog.c
// nRF52840-MDK : watchdog matériel WDT — reset si la boucle principale gèle.
#include "nrf_drv_wdt.h"
#include "nrf_delay.h"
static nrf_drv_wdt_channel_id canal;
void wdt_evt(void) { } // optionnel : avertir avant reset (PPI/LPCOMP)
int main(void) {
nrf_drv_wdt_config_t cfg = NRF_DRV_WDT_DEAFULT_CONFIG;
cfg.behaviour = NRF_WDT_BEHAVIOUR_RUN_SLEEP; // tourne aussi en sommeil
cfg.timeout = WDT_TIMEOUT; // 8x32768 ticks ~ 8 s (adapter)
nrf_drv_wdt_init(&cfg, wdt_evt);
nrf_drv_wdt_channel_alloc(&canal);
nrf_drv_wdt_enable();
uint32_t tour = 0;
for (;;) {
nrf_drv_wdt_channel_feed(canal); // "j'ai tourné" — sans ça : reset
tour++;
nrf_gpio_pin_toggle(6);
nrf_delay_ms(200);
// Démo : bloquer volontairement au tour 50 pour voir le reset.
if (tour == 50) { while (1) { } }
}
}