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

De Wiki L.A.B
Aller à : navigation, rechercher
Ligne 20 : Ligne 20 :
 
<br>- Sélectionner la carte Nucleo64-L476RG
 
<br>- Sélectionner la carte Nucleo64-L476RG
 
<br>
 
<br>
<b>Configuration du GPIO input </b>
+
<b>Configuration du Pinout </b>
 
<br>- Cliquer sur le PC13
 
<br>- Cliquer sur le PC13
 
<br>- Séléctionner GPIO_Input
 
<br>- Séléctionner GPIO_Input
Ligne 66 : Ligne 66 :
 
=== Utiliser le bouton poussoir en mode "interrupt" ===
 
=== Utiliser le bouton poussoir en mode "interrupt" ===
  
Il n'est pas acceptable
 
  
Création du Projet  
+
<b> Création du Projet </b>
- Créer un nouveau projet dans STM32CubeMX  
+
<br>- Créer un nouveau projet dans STM32CubeMX  
- Sélectionner la carte Nucleo64-L476RG  
+
<br>- Sélectionner la carte Nucleo64-L476RG  
Configuration du GPIO input
+
<br>
- Cliquer sur le PC13  
+
 
- Séléctionner GPIO_Input
+
<b>Configuration du Pinout </b>
 +
<br>- Cliquer sur le PC13  
 +
<br>- Séléctionner GPIO_EXTI13
 +
<br>
 +
 
 +
[[Fichier:STM32CubeMX_BouttonPoussoir_GPIOEXTI13.png]]
 +
 
 +
<br>
 +
 
 +
<b>Configuration du NVIC </b>
 +
<br>- Cliquer sur l'onglet "Configuration"
 +
<br>- Cliquer sur "NVIC"
 +
<br>- Cocher la case correspondant à la ligne "EXTI line interrupts" pour l'activer
 +
<br>
 +
[[Fichier:STM32CubeMX_BouttonPoussoir_GPIOEXTI13_NVIC.png]]
 +
<br>
 +
 
 +
<b>Configuration du GPIO </b>
 +
 
 +
 
 +
 
  
 
   void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)   
 
   void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)   

Version du 2 janvier 2018 à 17:56

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

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

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



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