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, on va regarder comment utiliser des GPIO in pour connecter un bouton poussoir.
Dans notre exemple nous allons utiliser la carte “Nucleo64” de référence “NUCLEO-L476RE”.
NUCLEO476.jpg
Cette carte embarque un bouton bleu appelé "USER BUTTON" connecté au pin2 (I/O PC13) dans la doc. Ainsi on peut l'utiliser sans hardware 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

Il y a deux possibilités d'utiliser les boutons poussoir:

  • en 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 avoir les états "poussé" et "non poussé"). Le programme attend d’exécuter les instructions tant qu'un état de périphérique n'est pas détécté. Ainsi le code devient bloquant et ne peut pas exécuter d'autres taches. Cette signification ne convient seulement aux situations simples (ou si le programme fonctionne en "multi thread").
  • avec des interruptions: 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 button poussoir en mode "polling"

Création du Projet
- Créer un nouveau projet dans STM32CubeMX
- Sélectionner la carte Nucleo64-L476RG
Configuration du GPIO input
- Cliquer sur le PC13
- Séléctionner GPIO_Input
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"
- Créer la variable ButtonPressed et l'initialiser à l'état 0

 /* USER CODE BEGIN 0 */
 uint8_t ButtonPressed;


- 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)


 while ( ButtonPressed == 0 )                        // block until button pressed
 {
  GPIO_PinState PinState;
  PinState = HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13);  // get current state of pin
  if ( PinState == GPIO_PIN_RESET )
   ButtonPressed = 1;
  else
   ButtonPressed = 0;
 }
 HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
 while ( ButtonPressed == 1 )                        
 {
  GPIO_PinState PinState;
  PinState = HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13); 
  if ( PinState == GPIO_PIN_RESET )
   ButtonPressed = 1;
  else
   ButtonPressed = 0;
 }
 HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

- 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 conformément à ce que nous avons écrit dans nos 2 boucles while

Utiliser le bouton poussoir en mode "interrupt"

Il n'est pas acceptable

Création du Projet - Créer un nouveau projet dans STM32CubeMX - Sélectionner la carte Nucleo64-L476RG Configuration du GPIO input - Cliquer sur le PC13 - Séléctionner GPIO_Input

 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
 {
  if ( GPIO_Pin == GPIO_PIN_13 )
  {
   GPIO_PinState PinState;
   PinState = HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13);
   if ( PinState == GPIO_PIN_RESET )
    ButtonPressed = 1;
   else
    ButtonPressed = 0;
  } 
 }