|
|
|
# Configuration des GPIOs et des interruptions
|
|
|
|
|
|
|
|
## Présentation
|
|
|
|
Le TP 2 traite de l’utilisation des GPIOs et des interruptions. Sur la carte, nous utiliserons notamment la LED verte (LED2) et le bouton poussoir (USER_BUTTON).
|
|
|
|
Dans ce TP, nous chercherons à faire en sorte que la LED change d'état dès que le bouton poussoir est appuyé.
|
|
|
|
|
|
|
|
Le TP 2 traite de l’utilisation des GPIOs et des interruptions. Sur la carte, nous utiliserons notamment la LED verte (LED2) et le bouton poussoir (USER_BUTTON). Dans ce TP, nous chercherons à faire en sorte que la LED change d'état dès que le bouton poussoir est appuyé.
|
|
|
|
|
|
|
|
Nous allons entrevoir deux types de gestion des GPIOs à travers deux exercices différents.
|
|
|
|
|
| ... | ... | @@ -16,10 +16,12 @@ Dans l'exercice 2, nous mettrons en œuvre les interruptions du bouton poussoir. |
|
|
|
|
|
|
|
Remarque: vous devriez avoir déjà créé ces différents dossiers lors du TP précédent.
|
|
|
|
|
|
|
|
- ouvrir Keil µvision
|
|
|
|
- sélectionner Project->open project
|
|
|
|
Le projet est disponible dans TP2 et porte l'extension .uvprojx
|
|
|
|
|
|
|
|
|
|
|
|
## Analyse des fonctions de la bibliothèque fournie
|
|
|
|
|
|
|
|
Avant de commencer, il est nécessaire de bien comprendre le code fourni.
|
|
|
|
|
|
|
|
- Compiler le projet fourni, analyser les librairies associées au fichier main.
|
| ... | ... | @@ -27,8 +29,9 @@ Avant de commencer, il est nécessaire de bien comprendre le code fourni. |
|
|
|
- A quel instant activer l'horloge sur un port ? Doit-on l'activer sur tous les ports ?
|
|
|
|
|
|
|
|
Vous utiliserez :
|
|
|
|
|
|
|
|
| Label | GPIO name |
|
|
|
|
| ------ | ------ |
|
|
|
|
|-------|-----------|
|
|
|
|
| LED2 | PA_5 |
|
|
|
|
| USER_BUTTON | PC_13 |
|
|
|
|
|
| ... | ... | @@ -37,26 +40,31 @@ Vous utiliserez : |
|
|
|
Ecrire la fonction GpioInit() permettant de configurer la LED LED2 et le bouton poussoir.
|
|
|
|
|
|
|
|
Prototype de la fonction :
|
|
|
|
````
|
|
|
|
|
|
|
|
```
|
|
|
|
void GpioInit(void)
|
|
|
|
````
|
|
|
|
```
|
|
|
|
|
|
|
|
La fonction doit :
|
|
|
|
|
|
|
|
- autoriser l'horloge sur le(s) port(s) correspondant(s)
|
|
|
|
- configurer la pin LED2 : en sortie, vitesse low, no pull-up/down, pushpull
|
|
|
|
- configurer la pin USER_BUTTON : en entrée, vitesse low, pull-up, pushpull
|
|
|
|
|
|
|
|
----
|
|
|
|
---
|
|
|
|
|
|
|
|
Compléter la fonction `void Exercise1(void)`
|
|
|
|
|
|
|
|
Cette fonction va vérifier dans une boucle infine que le bouton a bien été appuyé. Si tel est le cas, la LED changera d'état.
|
|
|
|
|
|
|
|
### Exécuter le programme
|
|
|
|
|
|
|
|
Avant l'exécution du programme, il conviendra de commenter l'appel à la fonction `Exercise2` dans la fonction principale `main()` et dé-commenter l'appel à la fonction `Exercise1`.
|
|
|
|
|
|
|
|
- Tester le programme et valider votre mise en place d’interruption.
|
|
|
|
- Tester le programme et valider votre mise en place de la scrutation.
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
----
|
|
|
|
## Exercice 2 : Utilisation d'une interruption (à la place de la scrutation)
|
|
|
|
|
|
|
|
Afin d’éviter que le processeur ne scrute constamment la valeur de l’entrée PC_13, vous configurerez l’appui sur le bouton comme un évènement qui provoque une interruption.
|
| ... | ... | @@ -67,34 +75,26 @@ Pour ce faire, on doit d’abord configurer l’interruption, au niveau du péri |
|
|
|
|
|
|
|
Pour configurer l'interruption matérielle pour la ligne d'entrée EXTI k, la procédure générale est la suivante :
|
|
|
|
|
|
|
|
1. Activer l’interruption au niveau du processeur (vous trouverez la référence exacte dans stm32f446xx.h )
|
|
|
|
NVIC_EnableIRQ(EXTIk_IRQn);
|
|
|
|
1. Activer l’interruption au niveau du processeur (vous trouverez la référence exacte dans stm32f446xx.h ) NVIC_EnableIRQ(EXTIk_IRQn);
|
|
|
|
|
|
|
|
Plusieurs GPIO peuvent partager la même ligne d’interruption, il faudra en tenir compte dans la routine d’interruption et gérer le flag d’interruption correspondant.
|
|
|
|
|
|
|
|
2. Activer l'horloge au niveau du périphérique **SYSCFG** (APB2 bus)
|
|
|
|
|
|
|
|
3. Configurer le registre de configuration d'interruption externe **SYSCFG** pour connecter la broche GPIO k à la ligne d'entrée d'interruption externe correspondante EXTI k (**EXTICR** reg)
|
|
|
|
|
|
|
|
4. Sélectionnez un front de signal qui déclenchera l’interruption EXTI: un front montant, un front descendant ou les deux. Ceci est configuré par le registre de sélection de déclenchement de front (reg **EXTI_RTSR** ou **EXTI_FTSR**).
|
|
|
|
|
|
|
|
5. Réglez le kième bit dans le registre de masque d'interruption (reg **EXTI_IMR**) pour activer l'interruption EXTI pour la ligne d'entrée k.
|
|
|
|
|
|
|
|
6. Modifiez la routine d'interruption pour EXTI k. Le nom de la routine d'interruption est donné par le fichier de démarrage startup_stm32F446xx.s.
|
|
|
|
Le registre **EXTI_PR** enregistre la source de l'interruption. Pensez à l’effacer dans la routine. Le bit de statut en attente correspondant doit être effacé pour permettre une interruption future. **Étonnamment, le forcer à 1 efface le bit en attente. (reg EXTI_PR)**
|
|
|
|
6. Modifiez la routine d'interruption pour EXTI k. Le nom de la routine d'interruption est donné par le fichier de démarrage startup_stm32F446xx.s. Le registre **EXTI_PR** enregistre la source de l'interruption. Pensez à l’effacer dans la routine. Le bit de statut en attente correspondant doit être effacé pour permettre une interruption future. **Étonnamment, le forcer à 1 efface le bit en attente. (reg EXTI_PR)**
|
|
|
|
|
|
|
|
### Compléter la routine d'interruption
|
|
|
|
|
|
|
|
- Le prototype de cette fonction est `void EXTI15_10_IRQHandler(void)`. Son code est à compléter dans le fichier `main.c`
|
|
|
|
|
|
|
|
### Exécuter le programme
|
|
|
|
|
|
|
|
Avant l'exécution du programme, il conviendra de commenter l'appel à la fonction `Exercise1` dans la fonction principale `main()` et dé-commenter l'appel à la fonction `Exercise2`.
|
|
|
|
|
|
|
|
- Tester le programme et valider votre mise en place d’interruption.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Création d'API (pour les plus rapides)
|
|
|
|
|
|
|
|
Afin de faciliter la configuration des ports dans les prochains TPs, vous allez compléter la fonction générique `GPIOx_Pin_Configure()` qui permet de configurer une pin de n’importe quel port, notamment les 4 registres configurés précédemment. Le squelette de la fonction vous est proposé. Vous pourrez vous inspirer des fonctions proposées dans cette librairie (gpio.c). |
|
|
\ No newline at end of file |
|
|
|
|
|
|
|
|