Académique Documents
Professionnel Documents
Culture Documents
HEMDANI
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
typedef struct {
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
} GPIO_InitTypeDef;
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.
2
matériel d’une E/S. Décrivons les principaux modes.
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.
3
F IGURE 2 – La boîte de dialogue Pin Configuration.
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.
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.
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);
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);
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