Vous êtes sur la page 1sur 10

TP 4

Les interruptions

Objectif :
Mise en œuvre des interruptions générées par les boutons et les timers.

I. Introduction
Le processeur Cortex-M4 sur les MCU MSP432P401x implémente un contrôleur
d’interruptions (NVIC : Nested Vectored Interrupt Controller) avec 64 lignes d’interruption
externes et 8 niveaux de priorité (Voir MSP432 Technical Reference Manual).

Figure 1 : Schéma fonctionnel MSP432P401R


Une interruption (IRQ, Interrupt ReQuest) est un signal envoyé au microcontrôleur par un de
ses périphériques pour interrompre le programme en cours et exécuter un sous-programme
spécifique (appelé routine d’interruption, e.g. PORT1_IRQHandler).
Toutes les sources d’interruptions possibles sont reliées à un composant unique, le contrôleur
d’interruptions (NVIC). Lorsqu’une interruption est reçue par le NVIC, celui-ci envoie au
microcontrôleur un signal d’interruption (IRQ) et le numéro de périphérique qui a généré
l’interruption (IRQ_id). Le microcontrôleur interrompt le programme en cours et exécute la
routine d’interruption correspondante. Le principe général (simplifié) des interruptions est
illustré à la figure ci-dessous.

1
Figure 2 : Principe général simplifié des interruptions.

Figure 3 : Les interruptions NVIC

Figure 4 : Table de vecteur d’interruption

2
II. Interruption sur P1
Il existe de nombreuses sources d’interruptions dans le MSP432, mais dans cette partie, nous allons
nous concentrer sur l’entrée générale sur P1. La figure suivante montre les GPIO sur P1.

Figure 5 : Boutons et LEDs


Une interruption sur P1 peut être activée en contrôlant plusieurs registres du port 1 :

• Interrupt Enable Registers (PxIE)


Chaque bit PxIE active le bit d’interruption PxIFG associé.

Registre PxIE

Description du registre PxDIR

• Interrupt Edge Select Registers (PxIES) :


Chaque bit du registre PxIES sélectionne le front d’interruption pour l’I/O correspondante
(Sélectionne le front qui va provoquer la mise à 1 du bit PxIFG).

Registre PxIES

3
Description du registre PxIES

Remarque : Ecrire dans PxIES pour chaque I/O peut modifier le flag de l’interruption
correspondante.

• Interrupt Flag Register (PxIFG)


Indicateur d’interruption du port x. Défini chaque fois que la pin correspondante effectue
le changement d’état demandé par PxIES.

Registre PxIFG

Description du registre PxIFG


Remarque : L’écriture dans PxOUT, PxDIR ou PxREN peut mettre à 1 les flags PxIFG
correspondants.

• Pullup or Pulldown Resistor Enable Registers (PxREN)


Chaque bit de chaque registre PxREN active ou désactive la résistance pullup ou pulldown de
la pin I/O correspondante. Le bit correspondant dans le registre PxOUT sélectionne si la pin
contient un pullup ou un pulldown.
- Bit = 0 : résistance pullup ou pulldown désactivée
- Bit = 1 : résistance pullup ou pulldown activée
Le tableau ci-dessous résume l’utilisation de PxDIR, PxREN et PxOUT pour une configuration
d’E/S appropriée.

4
Registre PxREN

Description du registre PxREN

• Interrupt Set-Enable Registers (ISER)


Ce sont les registres de configuration d’autorisation d’interruptions. Chaque bit de ces
registres est associé à une interruption. Comme le nombre d’interruptions est 64, elles sont
divisées en deux :
1. ISER0 (Offset = 100h) [reset = 00000000h]
Autorisation de la source d’interruption numéro 0 à 31.

Registre ISER0

Description du registre ISER0

2. ISER1 Register (Offset = 104h) [reset = 00000000h]


Autorisation de la source d’interruption numéro 32 à 63.

Registre ISER1

5
Description du registre ISER1

Travail demandé
Changer l’état de la LED1 lorsque le bouton S2 est appuyé en utilisant les interruptions. Pour
ce faire, vous allez suivre les étapes ci-dessous :

1. Créer un nouveau projet.

2. Configurer pour le port 1 :

- pin 0 pour contrôler la LED1


- pin 4 pour recevoir les actions bouton ( Activer la résistance pull up interne de
l’entrée S2).

3. Activer l’interruption sur P1.4 :


- Le trigger de l’interruption est le front descendant.
- Assurer qu’il n’y a pas d’interruptions en attente sur S2 (clear flag).
- Activer l’interruption 35 (il faut mettre à 1 le bit correspondant dans le registre
ISER).
- Activer les interruptions globales en faisant appel à la fonction __enable_irq().

4. Le programme obtenu en suivant les étapes précédentes permet au bouton S2 de


lancer une interruption et au cortex de la traiter. Il faut ajouter le code qui sera exécuté
pendant cette interruption. Le prototype de la fonction d’interruption est le suivant :
void PORT1_IRQHandler(void) ;

III. Interruption générée par Timer A


III.1 Clock système (CS)

6
Les registres CS sont protégés par un mot de passe pour éviter les écrasements défectueux.
Les bits corrects doivent être écrits dans le registre KEY avant toute modification des autres
registres CS. Il est également recommandé d’écrire n’importe quelle valeur dans le registre
KEY lorsque le système d’horloge est correctement configuré pour protéger le système. La
logique de sélection de l’horloge est est détaillée dans le guide de l’utilisateur MSP432P401R.
La valeur de la clé est 0x0000695A.

III.2 Timer A

Figure 6 : Timer A dans TI MSP432


Les registres du timer A sont listés dans le tableau suivant :

7
• Timer_Ax Control Register (TAxCTL)

Le registre de contrôle TAxCTL

Description du registre TAxCTL

• Timer_Ax Counter Register

Registre TAxR

• Timer_Ax Capture/Compare Control 0 Register to Timer_Ax Capture/Compare Control 6

Les registres TAxCCTL0 à TAxCCTL6

• Timer_Ax Capture/Compare 0 Register to Timer_Ax Capture/Compare 6 Register

Les registres TAxCCR0 à TAxCCR6

8
• Timer_Ax Expansion 0 Register

Le registre Expansion 0 TAxEX0


Les fonctions Timer_A comprennent :

- Un timer/compteur 16 bits asynchrone avec quatre modes de fonctionnement (stop, up,


continuous, and up/down).

Les quatre modes du Timer

- Source d’horloge sélectionnable et configurable.

TAIDEX Prescale
000b /1
001b /2
010b /3
011b /4
100b /5
101b /6
110b /7
111b /8

- Sept registres configurables de capture/comparaison (CCR0-6).


- Sorties configurables avec modulation de largeur d’impulsion (PWM)
- Verrouillage asynchrone des entrées et des sorties

9
Travail demandé
Changer l’état de la LED1 en utilisant l’interruption de Timer A0. Pour ce faire, vous allez suivre
les étapes ci-dessous :

1. Créer un nouveau projet.

2. Configurer LED1 comme sortie.

3. Configurer le clock système en sélectionnant la source DCO.

4. Configurer le Timer A :

- Sélectionner la source SMCLK.


- Choisir les différents diviseurs sachant que la fréquence DCO=3Mhz.
- Choisir le mode de contrôle « up ».
- Configurer les registres nécessaires

5. Activer l’interruption
- Activer l’interruption 9 (il faut mettre à 1 le bit correspondant dans le registre ISER).
- Activer les interruptions globales en faisant appel à la fonction __enable_irq().

6. Ajouter le code qui sera exécuté pendant cette interruption. Le prototype de la fonction
d’interruption est le suivant :
void TA0_N_IRQHandler(void)

7. Calculer la fréquence de toggling de la LED.


8. Changer les paramètres nécessaires pour toggler la LED chaque 3s.

10

Vous aimerez peut-être aussi