Microcontrôleurs I
Les interruptions :principes, programmation et utilisation,
Application :prise en compte d’événements et mesure du
temps
Frédéric Rousseau
IESE3 S5
2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Principes des interruptions
DéfinitionI En informatique, une interruption est un arrêt temporaire
de l’exécution normale d’un programme informatique par lemicroprocesseur afin d’exécuter un autre programme(appelé service ou fonction d’interruption - ISR ou interrupthandler) (extrait en partie de wikipedia).
CausesI Une requête d’interruption peut provenir de :
I La modification de l’état électrique d’une entrée-sortie (onparle d’interruption asynchrone)
I L’indication de début ou de fin de traitement par unpériphérique associé au microprocesseur (par exemple : finde transmission de donnée, décomptage de temps, ...)
I Autre ... (exception - accès à une zone mémoire interdite,calcul arithmétique incorrect, ...)
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Fonctionnement
2 types d’interruption - ITI matérielle (ou externe) : déclenchée par un matériel
extérieur au processeurI logicielle (ou interne) : déclenchée par une instruction
spéciale du processeur
UtilitéI 2 raisons principales d’utiliser une interruption
I Lorsqu’il est nécessaire de réagir en temps réel à unévénement asynchrone
I Quand on souhaite économiser le temps d’exécution duprocesseur lié à une boucle de scrutation (polling)
On s’en sert où?I Partout : clavier, souris, tous les périphs
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Principe de l’exécution des fonctions d’IT
Programme en cours d'exécu1on
Sauvegarde du contexte du programme
Fonc1on service d'interrup1on
interrup1on
Traitement de l'interrup1on
Restaura1on du contexte du programme
Retour ou fin d'interrup1on
I Lors d’une interruption, le microprocesseur sauve tout oupartie de son état interne (le contexte, càd les registres)dans la pile, et exécute la fonction d’interruption
I A la fin du traitement d’interruption, on restaure lecontexte, et on termine l’interruption
I On reprend le programme à l’endroit ou on s’était arrêtéMicrocontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Plus précisément - 1
I A la détection de l’interruption, le processeur terminel’instruction (ou les instructions) en cours d’exécution
I Si les interruptions sont validées coté microprocesseur, l’ITest prise en compteI A chaque type d’IT est associé un vecteur d’interruption,
c’est à dire l’adresse de la fonction d’interruption à exécuterI On peut alors exécuter la fonction d’interruption
I Sinon, on continue normalement l’exécution duprogramme.
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Plus précisément - 2
Au niveau de la fonction d’interruptionI On sauvegarde le contexteI On vérifie si nécessaire que l’interruption est bien celle
attendue (si un vecteur d’IT est associé à plusieurs IT)I Généralement, le déclenchement d’une IT bloque les ITs
suivantes. Il faut alors re-valider les ITsI On exécute le traitement associé à l’interruptionI On restaure le contexte et on termine la fonction
d’interruption
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Conséquences
En terme de programmationI Il faut laisser le contenu des registres identiques
(sauvegarde et restauration du contexte)I Une seule façon d’échanger des informations entre le
programme principal et une fonction d’interruption : lesvariables globales
I Une fonction d’interruption doit toujours être la plus courtepossible (au sens du temps d’exécution), c’est à dire sansboucle d’attente ... Attention aux appels de fonctions ...
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
ExempleOn souhaite développer une application qui fait clignoter uneLED toutes les 500ms. Un périphérique associé aumicroprocesseur génère une interruption toutes les ms.
main:. . .
/∗ Boucle ∗/Loop1:
ldr r0, =G_VARldr r1, [r0]cmp r1, #500/∗ G_VAR != de 500 ∗/bne Loop1
/∗ si G_VAR = 500 ∗/ldr r1, =#0str r1, [r0]/∗ faire clignoter la LED ∗/. . .b Loop1. . .
IT_handler:push {r0, r1, lr}
/∗ On incrémente G_VAR ∗/ldr r0, =G_VARldr r1, [r0]add r1, r1, #1str r1, [r0]. . .pop {r0, r1, pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Exemple : une autre façon de faireOn souhaite développer une application qui fait clignoter uneLED toutes les 500ms. Un périphérique associé aumicroprocesseur génère une interruption toutes les ms.
main:. . .
Loop1:b Loop1. . .
IT_handler:push {r0, r1, lr}
/∗ On incrémente G_VAR ∗/ldr r0, =G_VARldr r1, [r0]add r1, r1, #1str r1, [r0]
cmp r1, #500/∗ si G_VAR != de 500 ∗/bne finIT/∗ si G_VAR = 500 ∗/ldr r1, =#0str r1, [r0]/∗ faire clignoter la LED ∗/. . .
finIT:pop {r0, r1, pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Différences entre les 2 versions
I Dans un cas, une fonction d’IT très courteI Dans l’autre cas, une fonction plus longue (mais
néanmoins raisonnable)I L’échange de valeurs entre le programme et la fonction
d’IT à l’aide d’une variable globale
Point commun !I Sauvegarde et restauration du contexte
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
A éviter ! ! !I Une fonction d’IT trop longue !
Diagramme temporel d'exécu3on correcte
Diagramme temporel d'exécu3on incorrecte
U"lisa"on du processeur
Programme > 95%
Fonc"on IT < 5%
U"lisa"on du processeur
Programme ≈ 50%
Fonc"on IT ≈ 50%
Diagramme temporel d'exécu3on à éviter absolument !!!
U"lisa"on du processeur
Programme < 5%
Fonc"on IT > 95%
Avec boucle d'aAente
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Mise en oeuvre des interruptions
Validation des ITsI De façon générale, pour utiliser les IT, il faut :
I Valider les IT du périphérique (ou des GPIO) qui émet l’ITI Valider la prise en compte de(s) IT par le processeurI Programmer le contrôleur d’interruptionsI Insérer la fonction d’interruption dans le programme et en
définir son contenuI Vérifier que le vecteur d’interruption est bien défini et
associé à la fonction d’interruptionI Toute la programmation se fait par configuration de
registres
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Contrôleur d’interruptions
Un processeur ne possède que peu de lignes d’interruption. Side nombreux périphériques (et signaux extérieurs) nécessitentl’utilisation des IT, il est nécessaire d’introduire un contrôleurd’interruptions qui gère les arrivées
Microprocesseur Contrôleur d'interrup2ons
IRQ 1
IRQ 2
IRQ n
IT
ACK IT
data NMI
IRQ : Interrupt ReQuest NMI : Non masquable Interrupt
Fonctions du contrôleurI Etablir les priorités entre
les sources d’ITI Décharger le processeur
de la détermination de lasource
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Un contrôleur d’interruption NVIC
I Pour gérer toutes les interruptions matériellesI Un composant EXTI pour gérer les IT provenant d’une
source autre qu’un périphérique
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Application à la carte STM32
Docs à consulterI Programming manual (PM0214) - Systick (pp. 245-250) -
et NVIC (pp. 207-219)I Reference manuel (RM0390)
ProgrammationI De nombreux registres ...
Etudes de cas : IT déclenchée parI Le bouton poussoir bleuI Une horloge système période : SysTick
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Les vecteurs d’IT de la carte STM32
Les vecteurs d’IT sont déjà définis dans le fichier
/∗ File asm_project/src/boot/interrupts.S ∗//∗ ARM Cortex-M4 Interrupts ∗/
Interrupt_Handler NMIInterrupt_Handler HardFaultInterrupt_Handler MemManageInterrupt_Handler BusFault. . .Interrupt_Handler SysTick. . .Interrupt_Handler EXTI15_10. . .
I Ce qui indique que les handler d’IT associés sontI SysTick_HandlerI EXTI1510_Handler
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
IT générée par le bouton poussoir
Le bouton poussoir bleu est connecté à PC13
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
IT générée par le bouton poussoir
Contenu du mainI Valider les GPIOCI Valider le contrôleur
système SYSFIG sur lebus APB2I Utiliser pour rediriger
l’une des lignes d’entréeextérieure vers les GPIO
I Valider le bouton sur PC13I Valider les interruptions sur
PC13
main:push (lr)/∗ enable GPIOC ∗/bl enable_GPIOC
/∗ Enable SYSCFG on APB2 ∗/bl enable_SYSCFG
/∗ enable PC13 input from button ∗/bl enable_button2PC13
/∗ IRQ init from PC13 ∗/bl init_IRQ_PC13
loop:b loop
pop {pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 1
Configuration de SYSCFG pour le contrôleur EXTII EXTI13[3 :0] = 0010 pour "mapper" PC13
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 2
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 3
Configuration de EXTII Configuration du registre EXTI_IMR[13] = 1I Configuration du registre EXTI_RTSR[13] = 0I Configuration du registre EXTI_FTSR[13] = 1
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 4
Configuration de EXTII Configuration du registre EXTI_PR[13] = 1
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 5
Configuration de NVICI Les IT provenant de EXTI[15 :0] sont en position 40I Il faut donc configurer NVIC_ISER[40] = 1 (en fait
NVIC_ISER1[8] = 1)
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 6
init_IRQ_PC13:push {lr}ldr r0,=SYSCFGldr r1,[r0,#EXTICR4]bic r1, r1, #0xF0orr r1, r1, #0x20 /∗ EXTI13 = 0b0010 (PC13) pin ∗/str r1,[r0,#EXTICR4] /∗ SYSCFG_EXTICR4 ∗/
ldr r0,=EXTIldr r1,[r0,#IMR]orr r1, r1, #(1<<13) /∗ IT PC13 non masque (MR13) ∗/str r1,[r0,#IMR] /∗ EXTI_IMR ∗/
ldr r1,[r0,#RTSR]bic r1, r1, #(1<<13) /∗ IT TR13 rising trigger disable ∗/str r1,[r0,#RTSR] /∗ EXTI_RTSR ∗/ldr r1,[r0,#FTSR]orr r1, r1, #(1<<13) /∗ IT TR13 falling trigger enable ∗/str r1,[r0,#FTSR] /∗ EXTI_FTSR ∗/ldr r1, =(1<<13) /∗ IT PR13 set to 1 ∗/str r1,[r0,#EXTIPR] /∗ clear EXTI_PR13 ∗/
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Description de init_IRQ_PC13 - 7
/∗ IT enable ∗//∗ EXTI15_10 is IRQ#40 ∗//∗ ISER1 (1*32), bit 8 ∗/.set ISER1,0X04
ldr r0,=NVICmov r1, #(1<<8) /∗ set bit40 of ISER (bit8 of ISER1) ∗/str r1,[r0,#ISER1]pop {pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
La fonction d’IT - EXTI15_10_Handler
Contenu - Nom et association définis dans une tableI On vérifie que l’IT provient de la ligne 13I Il faut re-valider les IT
EXTI15_10_Handler:push {r0, r1, lr}
/∗ Check if exti13 ∗/ldr r0, =EXTIldr r1,[r0,#EXTIPR]tst r1,#(1<<13)beq endHandler
/∗ Clear pending register EXTIPR[13] = 1 ∗/ldr r1, =(1<<13)str r1,[r0,#EXTIPR]. . .
endHandler:pop {r0, r1, pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
IT du Systick
I Le System Tick Timer ou SysTick est un compteur detemps (timer) intégré dans le NVIC
I Le SysTick génère une IT de façon régulière aprèsprogrammation initiale
I La fonction d’interruption associée est SysTick_Handler
I Il est très simple à programmer et à utiliser ! ! !
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Programmation du Systick
La documentation précise les étapes de programmationI Définir et programmer la valeur de décomptageI Supprimer la valeur de décomptage couranteI Programmer les registres de contrôle et d’état
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Définir et programmer la valeur de décomptage
I Le SysTick peut fonctionner à la même fréquence que leprocesseur
I La valeur à charger est le nombre de coups d’horloge
systick_init:. . .
/∗ Setup 1ms SysTick - CLK = 16 MHz ∗//∗ STK_LOAD register = 15999 ∗/
ldr r0, =SysTickldr r1, =#15999str r1, [r0, 0x04]. . .
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Supprimer la valeur de décomptage courante
I Le SysTick peut fonctionner à la même fréquence que leprocesseur
I La documentation précise que la valeur à charger est lenombre de coups d’horloge
systick_init:. . .
/∗ Clear current value ∗//∗ STK_VAL register = 0 ∗/
ldr r0, =SysTickldr r1, =#0str r1, [r0, 0x08]. . .
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Programmer le registres de contrôle
I Seuls les 3 bits de poidsfaibles nous intéressent
systick_init:. . .
/∗ Clear current value ∗//∗ STK_CRTL register = 0x07 ∗/
ldr r0, =SysTickldr r1, =#0x7str r1, [r0]. . .
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Programme complet utilisant le SysTick
I Ce programme ne fait rien,mais configure le SysTick
I Pas de re-validation des ITdans SysTick_Handler
main:push (lr)/∗ Setup 1ms SysTick ∗/bl systick_init
loop:b loop
pop {pc}
SysTick_Handler:push {lr}pop {pc}
systick_init:push (r0, r1, lr)ldr r1, =Systick
/∗ STK_LOAD = 15999 ∗//∗ 1ms SysTick with CLK = 16MHz ∗/ldr r0, =#15999str r0, [r1, 0x04]
/∗ Clear STK_VAL ∗/ldr r0, =#0str r0, [r1, 0x08]
/∗ STK_CTRL = 0x07 ∗/ldr r0, =#0x07str r0, [r1]
pop {r0, r1, pc}
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021
Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin
Pour aller plus loin
La fonction d’IT n’est pas une fonction comme les autresI Pas d’échange de paramètresI Arrivée asynchroneI Le processeur passe en mode particulier (IRQ) et certains
registres sont spécifiques (r13_irq, r14_irq, r15_irq)I Généralement, du matériel permet d’empiler d’adresse de
retour (pile d’interruption et interrupt stack pointer)I Une doc simple sur les IT (en anglais) :
http://www.iti.uni-stuttgart.de/~radetzki/Seminar06/08_report.pdf
Attention !I A l’arrivée d’une IT plus prioritaire (FIRQ, reset, ...)I A l’arrivée d’IT trop nombreuses
Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021