Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

GPIO ( General Purpose Input / Output )

Back                  << Index >>


DOCUMENTATION


Des Leds et des Boutons

Les microcontrôleurs disposent de Broches ( Pins ) pour interragir avec l’extérieur.

Le forçage à l’état logique 0/1 de ces broches, ou la lecture de l’état logique sur ces broches se fait par l’intermédiaire du périphérique GPIO.

Une broche fait partie d’un port.
Un port contient 16 broches numérotées de 0 à 15.
La broche N°5 du port B sera donc appelée PB5.

Nous considèrons l’exemple suivant :

L’objectif est d’allumer la LED rouge reliée à la broche PB4
et de récupérer l’état du bouton SW_RIGHT relié à la broche PC0.

REMARQUE : Le document Datasheet_mbed_shield.pdf permet de faire le lien entre le nom des broches du microcontrôleur et les éléments de la carte d’extension.

Pour allumer la LED, il me faut une différence de potentiel pour qu’il y ait circulation d’un courant.
Je dois donc commander mon périphérique de tel sorte qu’il impose l’état logique 0 sur la broche PB4.

Pour récupérer l’état d’un bouton poussoir, Je dois déjà considérer la broche comme une entrée.
Donc l’étage de sortie du périphérique ( output driver ) doit être en haute impédance( déconnecté ).
L’état du bouton est enregisré dans un registre ( plus précisément dans le bit GPIOC_IDR0 du Registre GPIOC_IDR ).
La consultation de ce registre permet au processeur de savoir si on a appuyé sur le bouton.


Le périphérique GPIO

Configuration en Sortie ( OUTPUT )

Un ensemble de registres permettent de configurer le périphérique GPIO.
Ces registres sont propres à chaques port ( GPIOA, GPIOB, GPIOC, … ), et chaque bit de ces registres configure alors une broche en particulier dans ce registre.

RAPPEL : Un montage push pull utilise 2 tansistors, un montage open drain un seul. Dans ce dernier cas il faut alimenter ce transistor via une résistance de pull up ( qui peut être externe au microcontrôleur ).

Une fois la configuration effectuée ( à l’intialisation, en début de programme ), le registre GPIOxODR ( OUTPUT DATA REGISTER ) permet de choisir l’état logique à imposer en sortie.

Configuration en Entrée ( INPUT )

A partir du moment où on a indiqué dans GPIOx_MODER une configuration en input, l’état de sortie est en haute impédance.

Configuration en Sortie Alternate Function

Prenons le cas de la génération d’un signal PWM ( MLI ). Ce genre de signaux est produit par un périphérique TIMER.
Si l’on veut que ce signal soit présent sur une broche, il faut configurer le périphérique GPIO en mode alternate function.

Supposons que je veuille faire varier l’intensité de l’éclairage de la led bleue avec un signal PWM.
La led bleue est reliée à la broche PA9.

Pour connaitre les périphériques utilisables pour une broche donnée, il faut consulter les tableaux à partir de la p.47 du document DataSheet_STM32F411.pdf

Ce tableau m’indique que sur PA9, je peux aiguiller le signal TIM1_CH2 issu du TIMER1.


Programmation du périphérique GPIO

Activation des périphériques GPIO

Le registre RCC_AHB1ENR doit être configuré pour autoriser l’utilisation des périphériques GPIOB et GPIOC.

Les macros __GPIOB_CLK_ENABLE() et __GPIOC_CLK_ENABLE() permettent de réaliser cette configuration.

Configuration d’une broche en sortie logique

On considère la LED ROUGE, reliée à PB4.

Le type GPIO_TypeDef, dont fait partie _GPIOB permet d’accéder aux différents registres du périphérique GPIO :

stm32f411xe.h

Pour allumer la LED, il faut réaliser les initialisations suivantes :

main.c

REMARQUE : Chaque bit de ces différents registres permet de configurer une broche.
Il faut donc veiller à utiliser des masques pour effectuer nos initialisations sans affecter les autres broches.

Pour forcer à 0, je fais un ET LOGIQUE AVEC 0:

\( x \& 1 = x \)
\( x \& 0 = 0 \)

Pour forcer à 1, je fais un OU LOGIQUE AVEC 1:

\( x | 0 = x \)
\( x | 1 = 1 \)

Le ~ correspond à la fonction logique complément.

Pour forcer l’état de la broche, on utilise le registre ODR :

main.c

Configuration d’une broche en entrée logique

Pour récupérer l’état logique du bouton poussoir SW_RIGHT, relié à la broche PC0 :

main.c

Pour récupérer l’état de du bouton, il faut alors lire le registre IDR, et dans notre cas viser le bit 0 :

main.c

Application

Q1. Compléter la fonction main() du projet ci dessous afin de contrôler l’allumage de la LED rouge avec le bouton Switch Right.


WORKSPACE_F411_HAL_STM32CUBE



Organisation des Fichiers avec l’IDE ST

Système de Fichiers

Afin de ranger nos fonctions relatives aux périphériques, en respectant la nomenclature ‘Hardware Abstraction Layer’ (HAL) de chez ST, nous placerons toutes les fonctions de configuration et d’utilisation des périphériques dans le répertoire STM32F4xx_HAL_Driver.

A plus haut niveau, nous retrouvons dans le répertoire mbed_shield les fonctions relatives aux éléments de la carte mbed ( leds, boutons, capteurs … )

Cette rédaction de fonctions à différents niveaux permettra de composer une API( Interface logicielle de Prograamation d’Application ). Les fonctions de ‘haut niveau’ dans mbed_shield utiliseront les fonctions de ‘bas niveau’ contenues dans STM32F4xx_HAL_Driver.

le fichier stm32f4xx_hal_msp.c ( MSP = MCU Support Package ) contient tout ce qui est relatif aux initialisations des broches.

La fonction HAL_GPIO_Init()

La fonction HAL_GPIO_Init() explicitée dans stm32f4xx_hal_gpio.c permet de configurer les broches.

Ainsi la configuration de la broche PB4 pour la led rouge peut être désormais réalisée ainsi ( dans le fichier stm32f4xx_hal_msp.c) :

stm32f4xx_hal_msp.c

Pour le bouton poussoir switch right ( PC0 ) :

stm32f4xx_hal_msp.c

TRAVAUX PRATIQUE : Ecriture de Drivers pour le périphérique GPIO

PROJET SOURCE


WORKSPACE_F411_HAL_STM32CUBE


Q1. Compléter le fichier stm32f4xx_hal_msp.c afin que les 3 broches reliées aux leds de la cartes mbed shield soit configurées en sorties logiques, et que les 5 broches reliés aux boutons de la carte mbed shield soit configurées en entrées logiques.

Q2. Compléter les fonctions suivantes ( dans stm32f4xx_hal_gpio.c ) :

Q3. Compléter les fonctions suivantes ( dans leds.c et sw.c ), en faisant appel aux fonctions de la question précédente :

Q4. En faisant appel aux fonctions ci dessus, compléter le fichier main.c afin de contrôler l’allumage des leds RGB avec les boutons LEFT, UP, RIGHT.

Q5. On souhaite désormais avoir le fonctionnement suivant :

Ce fonctionnement peut être décrit par un diagramme d’états :

Le codage d’une machine d’états en langage C se fait avec un switch case :

Q6. Proposer un programme permettant de réaliser à la fois le fonctionnement de la question Q4 et celui de la question Q5, à savoir :

Même si de nombreuses solutions sont possibles, il est demandé de proposer un diagramme d’états pour décrire ce fonctionnement.


Back                  << Index >>