Back | << | Index | >> |
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.
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.
A partir du moment où on a indiqué dans GPIOx_MODER une configuration en input, l’état de sortie est en haute impédance.
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.
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.
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 :
Pour allumer la LED, il faut réaliser les initialisations suivantes :
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 :
Pour récupérer l’état logique du bouton poussoir SW_RIGHT, relié à la broche PC0 :
Pour récupérer l’état de du bouton, il faut alors lire le registre IDR, et dans notre cas viser le bit 0 :
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.
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() 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) :
Pour le bouton poussoir switch right ( PC0 ) :
PROJET SOURCE
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 :
void green_led(uint32_t on) : si on=1, led verte allumée, sinon led éteinte
uint32_t sw_down_raw(void) : retourne 1 si switch down est appuyé, 0 sinon.
Q4. En faisant appel aux fonctions ci dessus, compléter le fichier main.c afin de :
Back | << | Index | >> |