Académique Documents
Professionnel Documents
Culture Documents
Version 2.1
Mise à jour oct. 2020
LibreOffice 5.2 - Debian
Exceptions et Interruptions
•Principe
Il existe des mécanismes pour stopper l’exécution « normale » d’un
programme afin que d’autres parties de code soient lancées lorsque
des « événements » se produisent
2
Comment ça marche ?
4
A quoi ça sert ?
5
Table d'exceptions ?
Code de la
Ex : le microcontrôleur sait que si l'on fonction « reset »
0x0000F412
appuie sur reset, l'adresse du code à
exécuter se trouve toujours à l'adresse
0x0000 0004 0x00000008 -------- @fonction IT
•La CPU va alors chercher l’adresse stockée dans la table d’exception, grâce
au numéro de vecteur. A cette adresse, on retrouvera la 1ère instruction de la
fonction d’interruption à lancer
→ la table d'exception n'est donc qu'une suite d’adresses, et ne
contient aucune instruction !
7
Résumé mécanisme d’interruption
Instruction i
en cours
Interruption n
Sauvegarde RAM
PROGRAMME PRINCIPAL
du contexte :
registres et
@retour
Récupère @ fonction
d'interruption dans
table d'exception
Exécution des
instructions IT
FONCTION
Restauration D’INTERRUPTION
contexte et retour
programme princ.
Instruction MECANISME
i+1 D’INTERRUPTION
8
Table d'exception du LPC1768
9
Priorités
•Une priorité est assignée à chaque source. Il s’agit d’un nombre avec la
logique suivante :
« plus le nombre est petit, plus la source est prioritaire »
Ainsi une source avec une priorité 2 sera plus prioritaire qu’une autre source avec une
priorité 5
Pour notre cible LPC1768 (NXP), les priorités « utilisateur » disponibles sont
codées avec un nombre compris entre 0 et 31 (codage sur 5 bits)
10
Priorités
•Par défaut et hormis les exceptions systèmes (voir plus loin), toutes les
sources ont une priorité 0 (donc maximale)
11
Priorités - Exemples
Exemple 1 :
IRQ 6 :
Actif
priorité 1
IRQ 0 :
Actif Actif
priorité 2
main
temps
Interruption Interruption
IRQ 0 IRQ 6
12
Priorités - Exemples
Exemple 2 :
IRQ 6 :
En attente Actif
priorité 5
IRQ 0 :
Actif
priorité 2
main
temps
Interruption Interruption
IRQ 0 IRQ 6
13
Priorités - Exemples
IRQ 4 :
En attente Actif
priorité 2
IRQ 6 :
En attente Actif
priorité 2
IRQ 0 :
priorité 2 Actif
main
temps
15
Interruptions du LPC1768
16
Interruptions du LPC1768
N°
IRQ
17
Table d’interruption du LPC1768
18
Configuration IT : Fonctions CMSIS
19
Acquittement
20
External Interrupt (EXT INT)
Attention :
Seulement EINT0
de câblé sur un BP
pour nos platines
de TP
21
External Interrupt (EXT INT)
•Ces interruptions EXT INT peuvent se déclencher selon 2 modes :
–Sur front : montant ou descendant
–Ou sur niveau : haut ou bas
Les choix se font à partir de registres :
LPC_SC->EXTMODE LPC_SC->EXTPOLAR
22
External Interrupt (EXT INT)
Activer le périphérique
EXT INT activé par défaut : facultatif
INITIALISATION
Configurer le périphérique
•EXTMODE et EXTPOLAR pour choisir le mode
•Priorité et démasquage dans le NVIC
Utiliser le périphérique
23
Exemple External Interrupt - Synthèse
int main(void)
{
LPC_PINCON->PINSEL4 = LPC_PINCON->PINSEL4 | (1<<20); //mode EINT0 pour P2.10
24
La fonction d'interruption EINT
•Si l’on souhaite faire une action particulière, il faut écrire cette fonction
d’interruption EINT0_IRQHandler() :
–Il faudra baisser le drapeau correspondant à EINT0
–Puis intégrer le code à exécuter quand l'interruption arrive
25
La fonction d'interruption EINT
Drapeau à baisser :
registre EXTINT
26
La fonction d'interruption EINT - Synthèse
•Ex : inverser l’état d’une LED branchée sur P2.0 si front sur EINT0
void EINT0_IRQHandler(void) // Attention à bien nommer la fonction !
FONCTION
{
LPC_SC->EXTINT = LPC_SC->EXTINT | (1<<0); //acquittement
IT
LPC_GPIO2->FIOPIN = LPC_GPIO2->FIOPIN ^ (1<<0); //inverse l’état de P2.0
}
int main(void)
{
LPC_PINCON->PINSEL4 = LPC_PINCON->PINSEL4 | (1<<20); //mode EINT0 pour P2.10
PGM PRINCIPAL
LPC_GPIO2->FIODIR = LPC_GPIO2->FIODIR | (1<<0); //P2.0 configuré en sortie
while(1); // boucle infinie, vide ici, mais qui pourrait gérer le LCD...
return 0 ;
} 27
Interruptions sur Timer
•Cela est particulièrement utile pour effectuer des actions à des intervalles
réguliers
–Échantillonnage d'un signal d'entrée
–Clignotement régulier d'une alarme
–Mise à jour régulière d'une variable
–…
29
Interruptions sur Timer
•Acquittement
Pour baisser le drapeau d’interruption, il faut écrire dans le registre IR
Bit MRm du registre IR mis à 1
30
Exemple IRQ Timer
Cahier des charges : faire changer toutes les 2 secondes l'état d'une LED
branchée à P2.0
→ on veut donc régler le Timer pour que toutes les 2 secondes il arrive en
fin de comptage et lance une interruption
•Calcul des PR et MR pour un comptage sur 2s (donc 0,5 Hz)
PR = 0, MR = 50.106 - 1
31
Exemple IRQ Timer - Synthèse
FONCTION IT
{
LPC_TIM0->IR = LPC_TIM0->IR | (1<<0); //baisse le drapeau dû à MR0
LPC_GPIO2->FIOPIN = LPC_GPIO2->FIOPIN ^ (1<<0); //inverse l’état de P2.0
}
int main(void)
{
LPC_GPIO2->FIODIR = LPC_GPIO2->FIODIR | (1<<0); //P2.0 configuré en sortie
PGM PRINCIPAL
LPC_TIM0->PR = 0; // Prescaler PR à 0
LPC_TIM0->MR0 = 50000000 - 1; // valeur de MR
LPC_TIM0->MCR = LPC_TIM0->MCR | (3<<0); // RAZ du compteur + interruption
LPC_TIM0->TCR = 1 ; // Lancement Timer