NVIC
Le contrôleur d'interruption (NVIC) n'est pas spécifique au STM32L475 mais aux Cortex M. Sa documentation est donc dans la documentation officielle d'ARM sur les Cortex M4. ARM donnant la possibilié aux fabricants de customiser le NVIC dans une large mesure, nous vous recommandons en premier la documentation du NVIC de notre processeur disponible dans le Programming Manual, en page 207.
Il dispose de plusieurs registres qui permettent de contrôler les IRQ externes (et seulement les externes). Les deux principaux sont :
NVIC_ISER
: qui permet, en écrivant un 1 sur le bitn
, d'activer l'IRQ externe numéro n (= l'exception numéro16+n
)NVIC_ICER
: qui permet, en écrivant un 1 sur le bitn
, de désactiver l'IRQ externe numéro n (= l'exception numéro16+n
)
Par exemple, pour activer / désactiver les interruptions spécifiques au WATCHDOG, dont le numéro d'IRQ externe est 0 (numéro d'exception 16), on écrira ceci :
// Pour activer les IRQ du WATCHDOG
SET_BIT(NVIC_ISER[0], 1);
// Pour désactiver les IRQ du WATCHDOG
SET_BIT(NVIC_ICER[0], 1);
Seule l'écriture d'un 1 dans ces registres a un effet. Cela évite d'avoir à faire un read-modify-write pour activer ou désactiver une interruption dans le NVIC.
On peut aussi utiliser les fonctions de la CMSIS void NVIC_EnableIRQ(IRQn_Type IRQn)
et void NVIC_DisableIRQ(IRQn_Type IRQn)
, disponibles dans le fichier core_cm4.h
. Par exemple, pour activer / désactiver les interruptions spécifiques au SPI1, dont le numéro d'IRQ externe est 35, on écrira ceci :
// Active les IRQ du SPI1
NVIC_EnableIRQ(35);
// Désactive les IRQ du SPI1
NVIC_DisableIRQ(35);
Les exceptions internes ne sont pas modifiables par le NVIC.
Activation / désactivation de toutes les interruptions
Il est possible d'autoriser ou d'interdire toutes les interruptions (sauf le reset et la NMI), en positionant le registre PRIMASK du processeur. On modifie ce registre par les instructions assembleur suivantes :
cpsie i
: active les interruptionscpsid i
: désactive les interruptions
Ces fonctions sont aussi disponibles en C dans la CMSIS, fichier stm32l475xx.h
: __enable_irq(void)
et __disable_irq(void)
.