|  | # Configuration des GPIOs et des interruptions |  | # Configuration des GPIOs et des interruptions | 
|  |  |  |  | 
|  | ## Présentation |  | ## 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. |  | 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. | ... | @@ -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. |  | 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 |  | Le projet est disponible dans TP2 et porte l'extension .uvprojx | 
|  |  |  |  | 
|  |  |  |  | 
|  | ## Analyse des fonctions de la bibliothèque fournie |  | ## Analyse des fonctions de la bibliothèque fournie | 
|  |  |  |  | 
|  | Avant de commencer, il est nécessaire de bien comprendre le code fourni. |  | 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. |  | - 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. | ... | @@ -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 ? |  | - A quel instant activer l'horloge sur un port ? Doit-on l'activer sur tous les ports ? | 
|  |  |  |  | 
|  | Vous utiliserez : |  | Vous utiliserez : | 
|  |  |  |  | 
|  | | Label | GPIO name | |  | | Label | GPIO name | | 
|  | | ------ | ------ | |  | |-------|-----------| | 
|  | | LED2 | PA_5 | |  | | LED2 | PA_5 | | 
|  | | USER_BUTTON | PC_13 | |  | | USER_BUTTON | PC_13 | | 
|  |  |  |  | 
| ... | @@ -37,26 +40,31 @@ Vous utiliserez : | ... | @@ -37,26 +40,31 @@ Vous utiliserez : | 
|  | Ecrire la fonction GpioInit() permettant de configurer la LED LED2 et le bouton poussoir. |  | Ecrire la fonction GpioInit() permettant de configurer la LED LED2 et le bouton poussoir. | 
|  |  |  |  | 
|  | Prototype de la fonction : |  | Prototype de la fonction : | 
|  | ```` |  |  | 
|  |  |  | ``` | 
|  | void GpioInit(void) |  | void GpioInit(void) | 
|  | ```` |  | ``` | 
|  |  |  |  | 
|  | La fonction doit : |  | La fonction doit : | 
|  |  |  |  | 
|  | - autoriser l'horloge sur le(s) port(s) correspondant(s) |  | - 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 LED2 : en sortie, vitesse low, no pull-up/down, pushpull | 
|  | - configurer la pin USER_BUTTON : en entrée, vitesse low, pull-up, pushpull |  | - configurer la pin USER_BUTTON : en entrée, vitesse low, pull-up, pushpull | 
|  |  |  |  | 
|  | ---- |  | --- | 
|  |  |  |  | 
|  | Compléter la fonction `void Exercise1(void)` |  | 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. |  | 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 |  | ### 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`. |  | 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) |  | ## 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. |  | 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 | ... | @@ -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 : |  | 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 ) |  | 1. Activer l’interruption au niveau du processeur (vous trouverez la référence exacte dans stm32f446xx.h ) NVIC_EnableIRQ(EXTIk_IRQn); | 
|  | 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. |  | 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) |  | 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) |  | 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**). |  | 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. |  | 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 |  | ### 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` |  | - 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 |  | ### 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`. |  | 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. |  | - 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). |  | 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 |  |  | 
|  |  |  |  | 
|  |  |  |  |