Vous êtes sur la page 1sur 6

Exercice chapitre 7 Les exceptions et les interruptions Page 1

Exercice 1 : Interruption software


Dans cet exercice il faut générer et traiter une interruption software. Les interruptions software peuvent être
générées avec l’instruction SVC. Il est également possible de transmettre une constante, qui peut être décodé
dans le traiteur d’interruption :

Appel :
SVC 0x12 @ software interrupt

Décodage à l’aide du traiteur d’interruption :


.section .text.SVC_Handler
.weak SVC_Handler
.type SVC_Handler, %function

SVC_Handler:
LDR r2, [sp, #6*4] @ load r2 with the return address
LDRH r2, [r2, #-2] @ load r2 with SVC instruction
@ to obtain SVC number
BIC r2, r2, #0xFF00 @ mask top 8 bits -->
@ SVC number in r2!
BX lr @ return from SVC_Handler

Procédez de la manière suivante :


1) Définissez l’application principale, qui génère les interruptions software avec l’instruction SVC
2) Définissez le traiteur d’interruption SVC_Handler dans le ficher startup.s.
4) Testez le programme avec le débogueur.

V1.0 2017, Laboratoire d’informatque technique, E. Firouzi


Exercice chapitre 7 Les exceptions et les interruptions Page 2

Exercice 2 : Interruption avec la touche T0 CARME


Le but de cet exercice est de pouvoir déclencher et traiter des interruptions du type matériel en appuyant sur la
touche T0 du kit de développement CARME.

Le Cortex_M4 possède en tout 9 ports (PA à PI) à 16 pins. Tous ces pins sont multifonctionnels. Par
conséquent, ils peuvent être utilisés comme entré standard, comme sortie standard ou pour un module
périphérique donné (RS232, UART, I2C, SPI, USB etc.)

La touche T0 est connectée au port PC du processeur. Afin que ce dernier puisse générer des interruptions, il
faut le configurer dans un premier temps en entré standard. Ensuite, il faut pouvoir détecter ses flancs montants
ou descendants.

Par défaut, tous les pins sont initialisés comme entrée standard. Ce qui signifie que cette partie de l’exercice ne
nécessite pas de programmation.

La détection des flancs montants ou descendants peut être réalisée à l’aide du module « External Interrupt/Event
Controller » (EXTI). Ce module contient 23 entrées distinctes, qui permettent de détecter ces flancs
individuellement et de générer les signaux d’interruption correspondants (voir figure 1). Ces signaux
d’interruptions sont transmis au module NVIC (EXTI0 à RTC), qui a son tour les retransmet au CPU (IRQ et
IRQ#). Au niveau du module EXTI, les signaux d’interruption peuvent être activés ou désactivés
individuellement à l’aide du registre EXTI_IMR (adresse : 0x4001_4000). La nature de la détection du flanc
y est également configurable à l’aide des registres EXTI_RTSR (adresse : 0x4001_0408) et EXTI_FTSR
(adresse : 0x4001_040C).

Le pin PC7, qui est connecté à la touche T0, est reconduit à travers la ligne EXTI7 au module EXTI (voir figure
1). Par conséquent, il faut choisir dans un premier temps le port PC au niveau du multiplexeur MUX7. Cela peut
être réalisé avec les bits EXTI7[3:0] du registre SYSCFG_EXTICR2. Attention : avant d’initialiser le
multiplexeur MUX7, il faut activer l’horloge du module SYSCFG. Pour cela il faut écrire la valeur 0x4000
dans le registre RCC_APB2ENR (adresse : 0x4002_3844).

Ensuit il faut activer la détection des flancs pour la ligne EXTI7 au niveau du module EXTI. Cela peut être
obtenu en mettant à 1 le bit 7 dans le registre EXTI_IMR. La nature de flanc à détecter peut également être
fixée en mettant à 1 le bit 7 dans le registre EXTI_RTSR respectivement EXTI_FTSR. Les interruptions ainsi
générées seront reconduites à travers de la ligne EXTI9_5 au module NVIC.

Finalement, au niveau du NVIC les interruptions EXTI9_5 peuvent être activées avec la mise à 1 du bit numéro
23 du registre NVIC_ISER0.

V1.0 2017, Laboratoire d’informatque technique, E. Firouzi


EXTI0

EXTI6
&
PA7 EXTI8
PB7 … IRQ [68]
EXTI NVIC
EXTI22 Cortex-M4
PC7
Core
PD7 MUX7 IRQ
EXTI7 23 14
PE7 SYSCFG_
EXTICR2 IRQ [0] Interrupt
PF7 EXTI0 EXTI_IMR EXTI0 treatment
EXTI_RTSR … IRQ #
PG7 … …
EXTI7 EXTI_FTSR
EXTI4 IRQ [22] NVIC_ISER0
EXTI_PR IRQ [23] NVIC_ISER1
PH7 … EXTI9_5
EXTI22 EXTI15_10 IRQ [22] NVIC_ISER2
PI7 …
PVD
… IRQ [82]
RTC

Figure 1: EXTI
Exercice chapitre 7 Les exceptions et les interruptions Page 4

Suivez la procédure suivante :


1) Activez l’horloge pour le module SYSCFG. Ecrivez la valeur 0x4000 dans le registre
RCC_APB2ENR (adresse : 0x4002_3844)
2) Définissez dans le module principal « main.s » la sous routine initT0, qui initialise les registres
décrite ci-dessus afin que la touche T0 puisse générer une interruption.
3) Dans le module « startup.s », définissez le traiteur d’interruptions EXTI9_5_IRQHandler
pour le traitement des interruptions externes EXTI9_5. La tâche de ce traiteur d’interruption est de
désactiver les interruptions. Cela peut être obtenu en mettant à 1 le bit numéro 7 dans le registre
EXTI_PR (adresse : 0x4001_3C14).
4) Teste votre programme avec le Debugger : Insérer dans la routine d’interruption un point d’arrêt
(break point) et démarrer le programme.

V1.0 2017, Laboratoire d’informatque technique, E. Firouzi


Exercice chapitre 7 Les exceptions et les interruptions Page 5

1.1 Les registres du module NVIC

1.2 Les registres du module EXTI (adresse de base : 0x4001_3C00)

V1.0 2017, Laboratoire d’informatque technique, E. Firouzi


Exercice chapitre 7 Les exceptions et les interruptions Page 6

1.3 Les registre du module SYSCFG (adresse de base : 0x4001_3800)

Une documentation plus spécifiques des registres est fournies par "Cortex™-M4 Devices, Generic User
Guide" du site http://carme.bfh.ch.

V1.0 2017, Laboratoire d’informatque technique, E. Firouzi