Vous êtes sur la page 1sur 6

Systèmes embarqués avec les microcontrôleurs STM32 C.

HEMDANI

Support de cours N°5 :


Gestion des GPIOs
Ce support nous introduit dans la HAL avec l’un de ses modules les plus simples à savoir :
HAL_GPIO. Il présente toutes les possibilités offertes par ce périphérique si simple et si couramment
utilisé qu’est le GPIO 1 .

1 Configuration des GPIOs


Les GPIOs sont la manière dont un microcontrôleur communique avec le monde extérieur.
Chaque carte utilise un nombre variable d’E/S pour piloter des périphériques externes (par exemple,
une LED) ou pour échanger des données via plusieurs types de périphériques de communication
(UART, USB, SPI, etc.).
Chaque fois que nous avons besoin de configurer un périphérique qui utilise des broches du mi-
crocontrôleur, nous devons configurer ses GPIOs correspondants en utilisant le module HAL_GPIO.

Remarque 1
La HAL est conçue de telle sorte qu’elle fasse abstraction du mappage mémoire spécifique du
périphérique. Elle fournit une manière générale et plus conviviale de configurer le périphérique,
sans forcer les programmeurs à connaître en détail ses registres, leur mappage mémoire et la
manière de les configurer. 2

Pour configurer un GPIO, nous utilisons la fonction :


HAL_GPIO_Init(GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init) ;
GPIO_InitTypeDef est la structure C utilisée pour configurer le GPIO ; elle est définie de la
manière suivante :

typedef struct {
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
} GPIO_InitTypeDef;

Les rôles des différents champs de la structure sont :


— Pin : spécifie les numéros (à partir de 0) des broches que nous allons configurer. Par
exemple, pour la broche PA2, il prend la valeur GPIO_PIN_2 2 .
Nous pouvons utiliser la même instance GPIO_InitTypeDef pour configurer plusieurs broches
à la fois, en faisant un OU binaire (par exemple GPIO_PIN_2 | GPIO_PIN_8 | GPIO_PIN_15).
— Mode : c’est le mode de fonctionnement de la broche, et il peut prendre l’une des valeurs de
la Table 1.
— Pull : spécifie l’activation Pull-up ou Pull-Down pour les broches sélectionnées, conformé-
ment à la Table 2.
— Speed : définit la vitesse de la broche.
— Alternate : spécifie le périphérique à associer à la broche.
1. General Purpose Input Output.
2. Notons que GPIO_PIN_x est un masque de bits, où la ième broche correspond au ième bit d’un type de données
uint16_t. Par exemple, le GPIO_PIN_2 a une valeur de 0x0004.

1
Mode de la broche Description
GPIO_MODE_INPUT Mode flottant d’entrée.
GPIO_MODE_OUTPUT_PP Mode Push Pull de sortie.
GPIO_MODE_OUTPUT_OD Mode Open Drain (drain ouvert) de sortie.
GPIO_MODE_AF_PP Fonction alternative en mode Push Pull.
GPIO_MODE_AF_OD Fonction alternative en mode Open Drain.
GPIO_MODE_ANALOG Mode analogique.
GPIO_MODE_IT_RISING Mode d’interruption externe avec détection de déclenche-
ment au front montant.
GPIO_MODE_IT_FALLING Mode d’interruption externe avec détection de déclenche-
ment au front descendant.
GPIO_MODE_IT_RISING_FALLING Mode d’interruption externe avec déclenchement au front
montant/descendant.
GPIO_MODE_EVT_RISING Mode événement externe avec détection de déclenchement
au front montant.
GPIO_MODE_EVT_FALLING Mode événement externe avec détection de déclenchement
au front descendant.
GPIO_MODE_EVT_RISING_FALLING Mode événement externe avec détection de déclenchement
au front montant/descendant.

T ABLE 1 – Valeurs possibles du champ Mode.

Pull de la broche Description


GPIO_NOPULL Activation par pull-up ou pull-down.
GPIO_PULLUP Activation par pull-up.
GPIO_PULLDOWN Activation par pull-down.

T ABLE 2 – Valeurs possibles du champ Pull.

1.1 Le mode d’un GPIO


Les microcontrôleurs STM32 fournissent une gestion vraiment souple des GPIOs. La Figure 1
montre la structure matérielle d’une E/S d’un microcontrôleur STM32F40x.

F IGURE 1 – Structure de base d’une broche d’E/S.

Selon la valeur du champ Mode du GPIO, le microcontrôleur modifie le fonctionnement du

2
matériel d’une E/S. Décrivons les principaux modes.

1. Lorsque l’E/S est configurée comme GPIO_MODE_INPUT :


— Le registre de sortie (Output data register ou ODR) est désactivé.
— L’entrée du trigger de Schmitt est activée.
— Les résistances pull-up et pull-down sont activées en fonction de la valeur du champ Pull.
— La donnée présente sur la broche d’E/S est échantillonnée dans le registre de donnée
d’entrée (Input data register ou IDR) à chaque cycle d’horloge.
— Un accès en lecture au registre de données d’entrée fournit l’état de l’E/S.

2. Lorsque l’E/S est configurée comme GPIO_MODE_ANALOG :


— Le registre de sortie est désactivé.
— L’entrée du trigger de Schmitt est désactivée, fournissant une consommation zéro pour
chaque valeur analogique de la broche d’E/S.
— Les résistances pull-up et pull-down sont désactivées par le matériel.
— L’accès en lecture au registre d’entrée obtient la valeur 0.

3. Lorsque le port d’E/S est programmé comme sortie :


— Le registre de sortie est activé comme suit :
— si le mode est GPIO_MODE_OUTPUT_OD : un 0 dans le registre de sortie active le N-MOS
tandis qu’un 1 laisse le port en Hi-Z (le P-MOS n’est jamais activé) ;
— si le mode est GPIO_MODE_OUTPUT_PP : un 0 dans ODR active le N-MOS tandis que un
1 active le P-MOS.
— L’entrée du trigger de Schmitt est activée.
— Les résistances pull-up et pull-down sont activées en fonction de la valeur du champ Pull.
— La donnée présente sur la broche d’E/S est échantillonnée dans le registre d’entrée à
chaque cycle d’horloge.
— Un accès en lecture au registre de données d’entrée obtient l’état E/S.
— Un accès en lecture au registre de sortie obtient la dernière valeur écrite.

4. Lorsque le port d’E/S est programmé comme fonction de alternative :


— Le registre de sortie peut être configurée en mode Open Drain ou en mode push-pull.
— Le registre de sortie est piloté par les signaux provenant du périphérique (activation du
transmetteur et données).
— L’entrée du trigger de Schmitt est activée.
— Les résistances de pull-up et pull-down dépendent de la valeur du champ Pull.
— Les données présentes sur la broche E/S sont échantillonnées dans le registre d’entrée à
chaque cycle d’horloge.
— Un accès en lecture au registre d’entrée obtient l’état de l’E/S.

Les modes GPIO_MODE_EVT_* sont liés aux modes veille. Lorsqu’une E/S est configurée pour
fonctionner dans l’un de ces modes, elle permet de réveiller le processeur (s’il est placé en mode
veille avec une instruction WFE) sans générer d’interruption. Les modes GPIO_MODE_IT_* sont liés
à la gestion des interruptions. Ces modes seront utilisés plus tard.
Il important de noter que cette flexibilité représente un avantage pour la conception maté-
rielle. Par exemple, il n’est pas nécessaire d’utiliser des résistances pull-up externes pour piloter
des périphériques I2C, car les broches correspondantes peuvent être configurées en configurant
GPIO_InitTypeDef.Mode = GPIO_MODE_OUTPUT_PP et GPIO_InitTypeDef.Pull = GPIO_PULLUP.
Cela permet d’économiser de l’espace sur la carte.

1.2 Configuration du mode d’E/S dans STM32CubeMX


Le mode d’E/S peut éventuellement être configuré à l’aide de l’outil CubeMX, comme le montre
la Figure 2. La boîte de dialogue Pin Configuration peut être atteinte dans la vue Configuration, en
cliquant sur le bouton GPIO.

3
F IGURE 2 – La boîte de dialogue Pin Configuration.

1.3 Fonction alternative d’un GPIO


La plupart des GPIOs ont des «fonctions alternatives», c’est-à-dire qu’ils peuvent être utilisés
comme broches d’E/S pour au moins un périphérique interne. Cependant, il faut garder à l’esprit
qu’une broche d’E/S ne peut être associée qu’à un seul périphérique à la fois.
Pour découvrir quels périphériques peuvent être liés à une E/S, on peut soit se référer à la fiche
technique (datasheet 3 ) du microcontrôleur ou simplement utiliser l’outil STM32CubeMX.
En cliquant sur une broche dans la vue Pinout, un menu contextuel apparaît. Dans ce menu,
nous pouvons définir la fonction alternative souhaitée. Par exemple, sur la Figure 3, on peut voir
que la broche PA3 peut être utilisée comme USART2_RX (c’est-à-dire qu’elle peut être utilisée comme
broche RX pour le périphérique USART2.

F IGURE 3 – Utiliser STM32CubeMX pour découvrir facilement d’autres fonctions d’une E/S.
3. Le fichier en.DM00037051.pdf

4
1.4 Vitesse d’un GPIO
Le champ Speed de la structure GPIO_InitTypeDef peut prendre les valeurs de la Table 3 et
n’a d’effet que lorsque la broche est configurée en mode sortie.

Vitesse d’un GPIO


GPIO_SPEED_FREQ_LOW
GPIO_SPEED_FREQ_MEDIUM
GPIO_SPEED_FREQ_HIGH
GPIO_SPEED_FREQ_VERY_HIGH

T ABLE 3 – Valeurs du champ Speed disponibles pour un GPIO.

Il est important ici de préciser que la vitesse d’une broche n’est pas liée à la fréquence de
commutation, c’est à dire combien de fois une broche passe de HIGH à LOW dans une unité
de temps. Le paramètre Speed, au contraire, définit le taux de balayage, c’est-à-dire la vitesse à
laquelle il passe du niveau 0V à VDD et vice versa.
La Figure 4 montre clairement ce phénomène. Le signal rouge est celui que nous obtiendrions
si la vitesse de réponse était maximale, et donc il n’y avait pas de délai de réponse. En pratique, ce
que nous obtenons est celui que montre le signal vert.

F IGURE 4 – Effet de la vitesse de balayage sur un signal carré.

Toutefois, garder à l’esprit que le pilotage «trop dur» d’une broche a un impact sur les émissions
globales d’EMI (Electromagnetic interference) de la carte. Il est de ce fait fortement recommandé de
laisser le paramètre Speed par défaut au niveau minimum, à moins qu’il ne soit absolument
nécessaire pour l’application de le modifier.
Qu’en est-il de la fréquence de commutation ? ST affirme dans ses fiches techniques que la
vitesse de commutation la plus rapide d’une broche de sortie est tous les deux cycles d’horloge. Le
bus AHB1, auquel est connecté le périphérique GPIO, fonctionne à 42MHz pour un microcontrô-
leur STM32F407VGT6. Donc, une broche devrait basculer dans environ 20MHz. Cependant, nous
devons ajouter un surcoût supplémentaire lié à l’exécution du code qui basculer la broche.

2 Piloter un GPIO
La bibliothèque HAL fournit quatre routines de manipulation pour lire, modifier et verrouiller
l’état d’une E/S. Pour lire l’état d’une E/S, nous pouvons utiliser la fonction :
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

qui accepte le descripteur de GPIO (GPIOA, GPIOB, GPIOC, ...) et le numéro de pin. Elle renvoie
GPIO_PIN_RESET lorsque l’E/S est au niveau logique bas ou GPIO_PIN_SET lorsqu’elle est au
niveau logique haut.
Pour changer l’état d’une E/S, nous avons la fonction :
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin,
GPIO_PinState PinState);
qui accepte le descripteur de GPIO, le numéro de pin et l’état souhaité. Si nous voulons inverser
simplement l’état d’E/S, nous pouvons utiliser la routine :
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

5
GPIO_PinState est une énumération définie comme suit :
typedef enum
{
GPIO_PIN_RESET = 0,
GPIO_PIN_SET
} GPIO_PinState;

Enfin, une caractéristique du périphérique GPIO est que nous pouvons verrouiller la configu-
ration d’une E/S. Toute tentative ultérieure de modification de sa configuration échouera, jusqu’à
ce qu’une réinitialisation se produise. Pour verrouiller une configuration de broche, nous pouvons
utiliser la routine :
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

HAL_StatusTypeDef est une énumération définie dans le header Inc/stm32XXxx_hal_def.h


comme suit :
typedef enum
{
HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U
} HAL_StatusTypeDef;

3 Dés-initialiser un GPIO
Il est possible de définir une broche GPIO à son état de réinitialisation par défaut (qui est le
mode analogique). La fonction :
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

fait automatiquement ce travail.


Cette fonction est vraiment pratique si nous n’avons plus besoin d’un périphérique donné, ou
pour éviter de gaspiller de l’énergie lorsque le processeur passe en mode veille.

Remarque 2
Toutes les constantes et fonctions portant sur les GPIOs et présentées dans ce document, sont
déclarées dans le header Inc/stm32XXxx_hal_gpio.h importé dans tout projet. 2

Vous aimerez peut-être aussi