5 - Utiliser un "bouton poussoir" avec un "GPIO in" : Différence entre versions

De Wiki L.A.B
Aller à : navigation, rechercher
Ligne 8 : Ligne 8 :
 
[[Fichier:UserButton_Pin2_PC13.jpg]]
 
[[Fichier:UserButton_Pin2_PC13.jpg]]
  
 +
<b> Création du Projet </b>
 +
<br>- Créer un nouveau projet dans STM32CubeMX
 +
<br>- Sélectionner la carte Nucleo64-L476RG
 +
<br>
 +
<b>Configuration du GPIO input </b>
 +
<br>- Cliquer sur le PC13
 +
<br>- Séléctionner GPIO_Input
 +
<br>
 +
[[Fichier:STM32CubeMX_BouttonPoussoir_GPIOInputPC13.png]]
 +
<br>
 +
<b>Générer le code</b>
 +
<br>- Cliquer sur "Project" > "Settings"
 +
<br>- 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".
  
 +
<b> Ouvrir votre workspace sous Eclipse </b>
  
  

Version du 2 janvier 2018 à 16:52

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

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".

Ouvrir votre workspace sous Eclipse


Il y a deux possibilité d'utiliser les bouton 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é"), jusque le périphérique se met à l'état "poussé". Ainsi le code devient bloquant et ne peut pas executer d'autres taches. Cette signification ne convient seulement au 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 reprends la main et continue.

Utiliser le button poussoir "en polling"

 uint8_t ButtonPressed = 0;


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

Utiliser le button poussoir "avec des interrupt"

 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;
  } 
 }