Hier j’ai joué un peu avec le watchdog d’un STM32F103.
J’avais dans l’idée de l’utiliser comme source d’entropie en jouant sur le déphasage avec l’horloge du processeur.
Loupé 🙂 C’est pas fait pour (ça je savais) et ça ne peut pas marcher, car le watchdog fait bien son boulot, mais que son boulot.
Watchdog ?
Un Processeur Cortex a deux Watchdogs. Celui qui nous intéresse ici, c’est le IWDG : independant watchdog.
Il est cadencé par un oscillateur interne à 40Khz, et dispose d’un compteur 12 bits (avec un prescaler 8bits).
Il décompte de sa valeur de référence à 0, et force un reset du processeur quand il arrive à 0.
Son utilité est de parer à tout crash du système en le redémarrant.
Il ne fera rien d’autre 🙂
Même un crash de l’horloge principale (ça arrive ça ?) ne peut l’arrêter, puisqu’il est branché sur un signal d’horloge indépendant, interne au processeur.
Utilisation Type
Le cas d’utilisation typique est le suivant :
- On configure le watchdog pour qu’il reset au bout de … ms (on peut aller en gros jusque 1 seconde maxi, mais en général c’est plutôt genre 50ms)
- Pour cela, on configure son prescaler, et la valeur de « reload » de son compteur.
- Dans une interruption (par exemple générée par systick), on force un « reload » du compteur du watchdog, qui recommence alors à se décrémenter.
- Il n’arrive donc en principe jamais à 0, sauf crash logiciel.
Les limites
Ce qui m’a bloqué, c’est qu’on n’a jamais accès à la valeur du compteur de ce watchdog.
Tout ce qu’on peut faire, une fois qu’il est actif, c’est le reloader à sa valeur initiale.
On ne peut pas se brancher sur une interruption une fois à 0, il ne fait que reset, on ne peut pas lire la valeur du compteur.
Du code ?
A venir, un projet type sous coocox, pour une carte type Mini STM32 V3, qui met en pratique ce watchdog.
Une interruption « systick », toutes les 250ms, change la LED1 d’état et recharge le watchdog.
Le watchdog reset après environ 350ms sans interruption.
Si on laisse appuyé KEY1, l’interruption ne fait plus rien et le watchdog entre alors en action.
Référence
Le schéma des horloges d’un STM32 :