Une instruction ARM spéciale pour l'entrée en mode basse consommation : WFI
Particularité du coeur ARM
Chaque architecture possède des instructions spécifiques qui ne sont pas supportées explicitement par le langage C.
Par exemple les processeurs ARM peuvent exécuter les instructions
WFI (Wait For Interrupt)
et
WFE (Wait For Event) qui sont indispensables pour utiliser les modes d'économie d'énergie.
Pour insérer ces instructions on peut envisager de :
- créer des fonctions en langage d'assemblage, les assembler et linker dans le projet
- utiliser l'"inline assembly" qui est supporté par certains compilateurs C (mais avec une syntaxe très variable)
- utiliser des "built-in functions" incorporées à cet effet dans certains compilateurs C (mais avec une syntaxe très variable)
La solution supportée par ST
La bibliothèque
CMSIS (Cortex Microcontroller Software Interface Standard) définit des macros qui vont mettre en oeuvre
une solution automatiquement choisie en fonction du compilateur utilisé, ce qui assure la portabilité du code source.
Exemples :
Rôle effectif de WFI
Le résultat de cette instruction dépend de l'implémentation, la spec ARM prévoit seulement un bit de configuration,
le bit SLEEPDEEP dans le registre SCR (System Control Register) du Cortex (voir parte 4.4.6 p. 230 du document
Programming manual du STM32).
Dans le cas du STM32,
- si ce bit est à 0 : on obtient un simple sleep (arrêt du CPU jusqu'à la prochaine interruption)
- si ce bit est à 1 : on obtient un arrêt plus ou moins complet de la machine (STOPx, STANDBY, SHUTDOWN), déterminé par
d'autres bits de configuration localisés dans le module PWR (voir chapitre 5 du reference manual du STM32L4xx
et le chapitre 96 de la description des drivers HAL/LL).
N.B. dans les cas STANDBY et SHUTDOWN, le processeur ne pourra pas être réveillé par interruption, mais seulement par reset
Une fois l'instruction WFI exécutée, pour sortir du mode basse consommation dans lequel est entré le mcircontrôleur, il faut une interruption de niveau de priorité
plus élevé que la priorité en cours, ou un reset (destructeur pour tout ce qui n'est pas alimenté par le domaine d'alimentation back-up).