| ... | ... | @@ -15,39 +15,45 @@ Vous utiliserez : |
|
|
|
| LED2 | PA_5 |
|
|
|
|
| USER_BUTTON | PC_13 |
|
|
|
|
|
|
|
|
## Utilisation du bouton en scrutation
|
|
|
|
## Exercice1 : Utilisation du bouton en scrutation
|
|
|
|
|
|
|
|
Ecrire la fonction TP_GPIO() permettant d'allumer la LED LED2, selon l'état du bouton poussoir USER_BUTTON.
|
|
|
|
Ecrire la fonction GpioInit() permettant de configurer la LED LED2 et le bouton poussoir.
|
|
|
|
|
|
|
|
Prototype de la fonction :
|
|
|
|
````
|
|
|
|
void TP02_GPIO(void)
|
|
|
|
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
|
|
|
|
- dans une boucle infinie
|
|
|
|
- lire la valeur du bouton
|
|
|
|
- changer l'état de la led si bouton appuyé.
|
|
|
|
Vous compléterez le prototype de fonction directement dans le fichier main.
|
|
|
|
La valeur d’entrée est-elle à 0 ou à 1 quand le bouton est pressé ?
|
|
|
|
|
|
|
|
## Utilisation d'une interruption (à la place de la scrutation)
|
|
|
|
----
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
## 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.
|
|
|
|
|
|
|
|
On doit d’abord configurer l’interruption, au niveau du périphérique **SYSCFG** et au niveau du processeur, puis compléter la routine. Dès que l’IT est autorisée, un évènement sur la broche doit déclencher l’appel de la routine.
|
|
|
|
### Compléter la fonction `void InterruptInit(void)`
|
|
|
|
|
|
|
|
Pour ce faire, On doit d’abord configurer l’interruption, au niveau du périphérique **SYSCFG** et au niveau du processeur, puis compléter la routine. Dès que l’IT est autorisée, un évènement sur la broche doit déclencher l’appel de la routine.
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
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. Configurez 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)
|
|
|
|
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**).
|
|
|
|
|
| ... | ... | @@ -56,11 +62,17 @@ Plusieurs GPIO peuvent partager la même ligne d’interruption, il faudra en te |
|
|
|
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
|
|
|
|
- Cette fonction est nommée `void EXTI15_10_IRQHandler(void)`
|
|
|
|
|
|
|
|
### Executer le programme
|
|
|
|
Avant l'exécution du programme, il conviendra de commenter l'appel à la fonction Exercise1 dans le programme principal 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)
|
|
|
|
## 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).
|
|
|
|
|
| ... | ... | |
| ... | ... | |