5 - Utiliser un "bouton poussoir" avec un "GPIO in"

De Wiki L.A.B
Aller à : navigation, rechercher

Utiliser un "bouton poussoir" avec un "GPIO IN"

Dans cet atelier, nous allon utiliser des GPIO : IN (bouton poussoir) et OUT (LED).
Dans notre exemple nous allons utiliser la carte “Nucleo64” de référence “NUCLEO-L476RE”.
NUCLEO476.jpg
Cette carte comporte un bouton bleu appelé "USER BUTTON" connecté au pin2 (I/O PC13) dans la doc. Ainsi on peut l'utiliser sans matériel supplémentaire.
Pour info: Il y a aussi un bouton noir sur la carte. Ceci reset la carte et fait redémarrer le code ("reboot").
UserButton Pin2 PC13.jpg

nous allons aborder deux modes d'utilisation du bouton poussoir :

  • polling: On appelle un fonctionnement de code "en polling", si le code lit à l’intérieur d'une boucle l'état d'un périphérique (par exemple notre bouton, qui peut prendre les états "appuyé" et "non appuyé").
  • interrupt: Les microcontrôleurs implémentent une technique dit "interrupt": Le code peut exécuter d'autres taches, mais le code va être interrompu dès que le bouton est poussé. Une fonction spéciale (appelé "interrupt handler" ou "interrupt service routine") est exécuté. Après la fin de cette fonction, le code interrompu reprend la main et continue son exécution.

Utiliser le bouton poussoir en mode "polling"

Création du Projet
- Créer un nouveau projet dans STM32CubeMX
- Sélectionner la carte Nucleo64-L476RG
Configuration du Pinout
- Cliquer sur le PC13
- Sélectionner GPIO_Input
- Cliquer sur PA5
- Sélectionner GPIO_Output
STM32CubeMX BouttonPoussoir GPIOInputPC13.png
Générer le code
- Cliquer sur "Project" > "Settings"
- Choisissez l'emplacement approprié (sous votre espace de travail ou workspace sous Eclipse) et assurez vous que le "Toolchain/IDE" soit bien configuré en tant que "SW4STM32" avant de valider.

Ouvrir votre workspace sous Eclipse
- Ouvrir le fichier "main.c"


- Entrer le code qui permet d'allumer la LED selon l'action sur le bouton poussoir. Remplacer la boucle infinie while(1) par les lignes suivantes :

 GPIO_PinState PinState;
  while (1)
  {
    PinState = HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13);  // get current state of pin
    if ( PinState == 0 )
        HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, 1);
    else
        HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, 0);

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }

- On observe que la LED s’éteint dès qu'on appuie sur le bouton poussoir et s'allume dès qu'on le relâche.

Utiliser le bouton poussoir en mode "interrupt"

Création du Projet
- Créer un nouveau projet dans STM32CubeMX
- Sélectionner la carte Nucleo64-L476RG

Configuration du Pinout
- Cliquer sur le PC13
- Séléctionner GPIO_EXTI13
- Cliquer sur PA5
- Sélectionner GPIO_Output

STM32CubeMX BouttonPoussoir GPIOEXTI13.png


Configuration du NVIC
- Cliquer sur l'onglet "Configuration"
- Cliquer sur "NVIC"
- Cocher la case correspondant à la ligne "EXTI line interrupts" pour l'activer
STM32CubeMX BouttonPoussoir GPIOEXTI13 NVIC.png

Configuration du GPIO
- Sous l'onglet "Configuration", cliquer sur "GPIO"
- Configurer le PC13 comme suit (le label PUSH_BUTTON permettra de faciliter l'identification du bouton poussoir dans notre programme plutôt que d'avoir à se rappeler du pin associé):
GPIO mode : External Interrupt Mode with Rising/Falling edge trigger detection
GPIO Pull-up/Pull-down : No pull-up and no pull-down
User Label : PUSH_BUTTON
- Cliquer "Apply" et "OK"



STM32CubeMX BouttonPoussoir GPIOConf.png
Générer le code
- Cliquer sur "Project" > "Settings"
- Choisissez l'emplacement approprié (sous votre espace de travail ou workspace sous Eclipse) et assurez vous que le "Toolchain/IDE" soit bien configuré en tant que "SW4STM32" avant de valider.


Ouvrir votre workspace sous Eclipse
- Ouvrir le fichier "main.c"
- Créer la variable ButtonPressed et l'initialiser à l'état 0

 /* USER CODE BEGIN 0 */
 uint8_t ButtonPressed=0;


- Ecrire la fonction qui value la valeur de la variable booléenne ButtonPressed en fonction de l'état du bouton poussoir.

 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 {
  if ( GPIO_Pin == PUSH_BUTTON_Pin )
    GPIO_PinState PinState;
    //PinState = HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13);
    PinState = HAL_GPIO_ReadPin( PUSH_BUTTON_GPIO_Port, PUSH_BUTTON_Pin); // on retrouve la correspondante entre GPIO_PIN_13 et PUSH_BUTTON_Pin dans le fichier main.h
    if ( PinState == GPIO_PIN_RESET )
      ButtonPressed = 1;
    else
      ButtonPressed = 0;
 }


- Créer les boucles permettant de régir l'état de la LED selon l'action sur le bouton poussoir. Ajouter les lignes suivantes sous la boucle infinie while(1)
- A COMPLETER