Vous êtes sur la page 1sur 4

Chapitre 4 Entrées Sorties du STM32 : GPIO Chapitre 4 Entrées Sorties du STM32 : GPIO

Chaque port GPIO possède son propre signal d’horloge et contient des registres de contrôle
qui déterminent le mode de fonctionnement des pins (Parag. 2) ainsi que des registres permettant de
lire l’état binaire des pins en entrée et d’imposer l’état des pins en sortie.
Chapitre 2 Ces pins sont également reliés aux différents périphériques du microcontrôleur (USART,
Entrées Sorties GPIO du STM32 : Timer, ..) à travers l’AFIO (Auxiliary Function Input Output). L’AFIO permet de multiplexer les
connexions entre pins et périphériques. Il offre ainsi une flexibilité au niveau du choix du pin à utiliser
Présentation & Programmation par accès aux registres
pour véhiculer un signal donné. Quand l’AFIO est désactivé, les connexions par défaut entre pins et
Par Damergi Emir
périphériques sont établies. Une fois l’AFIO activé, il est possible de remapper (multiplexer) les pins
(voir Chapitre AFIO).

2. Architecture d’un port GPIO & modes de fonctionnement des IO

1. Introduction Chaque port GPIO est constitué de :


x 16 cellules identiques « Figure-2 » consistant chacune en une circuiterie électronique connectée à
Pour la commande, l’acquisition ou la communication, les microcontrôleurs disposent de pins un pin externe et pouvant être configurée afin de déterminer le sens (Entrée ou sortie) ainsi que
(broches) permettant de véhiculer les signaux électriques du microcontrôleur vers l’extérieur (Sortie
les caractéristiques électriques du pin. Il est à noter que chaque pin d’un port peut être configuré
ou Output) et de l’extérieur vers le microcontrôleur (Entrée ou Input) : on parle d’Entrées-sorties à
en entré ou sortie indépendamment des autres pins du même port.
usage général (GPIO : General Purpose Inputs Outupts).
Ces entrées-sorties (IO) sont regroupées en ports de 16 IO. On peut trouver jusqu’à 7 ports
dans un microcontrôleur STM32 (notés GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF et
GPIOG), soit jusqu’à 112 IO « figure -1 ».
.
Jusqu’à 7 ports - jusqu’à 112 IO
16 IO (pins) par port

Port Port Port


Enable Enable
GPIOA GPIO…. GPIO…

AFIO Enable
(Pin Remapping if Enabled)

Pin (broche) Default connexion


Peripherals
IO Cell (USART, Timer, ADC, SPI, etc..) Pin Remapping
(Cellule E/S) (Multiplexage)

Figure -2- Structure d’un Port GPIO (Une seule cellule est représentée parmi les 16)
Figure 1- Structure du périphérique GPIO

Damergi Emir 2012 Damergi Emir 2012


Chapitre 4 Entrées Sorties du STM32 : GPIO Chapitre 4 Entrées Sorties du STM32 : GPIO

Les IO du STM32 sont de type Five Volt Tolerant (FT), c'est-à-dire qu’ils peuvent supporter ƒ Un registre de verrouillage de la configuration (Configuration Locking Register) utilisé
une tension d’entrée de 5V sans dommage ou dysfonctionnement. pour interdire la modification du contenu des registres de configuration (CRH et CRL) sauf
après un reset. Ceci protège contre les manipulations involontaires et les perturbations
Des registres occupant des adresses de la zone BitBanding et pouvant être accédés comme
électromagnétiques.
mots de 32 bits :
ƒ Un registre d’entrées (Input Data Register : IDR) de 32 bits. Les 16 bits poids faible étant 3. Accès atomique aux registres
utilisés pour la lecture des valeurs logiques issues des 16 pins du port.
ƒ Un registre de sorties (Output Data Register : ODR) de 32 bits. Les 16 bits poids faible étant Pour la lecture du contenu des registres d’entrée IDR des ports GPIO, il est possible de lire

utilisés pour imposer les valeurs logiques au niveau des 16 pins du port. l’état d’un bit unique en une seule instruction (1 cycle) en utilisant le mécanisme du Bitbanding.

ƒ Un registres de Mise à 1 ( Bit Set Reset Register : BSRR) et un registre de remise à 0 et (Bit Pour l’écriture dans les registres de sortie ODR, même si ces registres font partie de la zone

Reset Register : BRR). Par le biais de ces registres, il est possible de changer l’état d’un ou BitBanding, le microcontrôleur STM32 offre un mécanisme plus performant pour la mise à jour de la

plusieurs bits du registre ODR, et par conséquent les sorties GPIOs, en en un seul cycle : on valeur d’un ou plusieurs bits en un seul cycle. Ceci est assuré par l’utilisation des registres BSRR et

parle d’accès atomique [voir paragraphe ]. BRR.

ƒ 2 registres de configuration (Control Register High /Low : CRH/CRL) permettant de Supposons que le registre ODR contient la donnée suivante (0x8F0B)

déterminer le sens, le mode de fonctionnement et la fréquence de commutation des GPIOs. A b31 b16 b15 ……… …… b0
1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1
cette fin, 4 bits sont utilisés pour chaque IO, et donc 64 bits (4*16) pour la totalité des 16 IOs
d’un GPIO. D’où la nécessité d’utiliser 2 registres de 32 bits.
x Et qu’on veut mettre à 1 les valeurs des bits b14, b13 et b2 qui sont à 0. Dans ce cas, il suffit d’écrire
Les différentes configurations possibles en fonction des valeurs des 4 bits sont données dans le
dans le registre BSRR les bits correspondants ( b14, b13 et b2 ) à 1 indiquant qu’on veut mettre à 1
tableau1. A l’initialisation, tous les IO sont configurés en ‘Input Floating’.
les bits du registre ODR :

Configurations Bit3 Bit2 Bit1 Bit0 Speed Au départ le registre ODR contient avec la valeur (0x8F0B) et BSRR avec 0x0000 :
(Mhz) b31 b16 b15 b2 b1 b0
……… ……
Entrée Analogique vers Pour les IO en
Anlog Input 00 BSRR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
le convertisseur A/N 00 entrée, la vitesse
Entrées

(par est déterminée par


Entrées vers Registre Input Floating 01 ODR Å 0x8F0B
IDR & défaut l’extérieur et non ODR 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1
Input Pull-Up 10
vers périphériques après pas par le STM32
Input Pull-down 11
(Alternate Functions) reset) (toujours 00)

Output 01 10 Mhz
00 Après l’exécution de l’instruction permettant de mettre b14, b13 et b2 de BSRR à 1
Sorties à partir du Push-Pull 10 2 Mhz
11 50 Mhz
registre ODR Output 01 10 Mhz b31 b16 b15 ……… …… b2 b1 b0
01 10 2 Mhz
Open-Drain
BSRR Å 0x6004
Sorties

11 50 Mhz BSRR 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0

Alternate Function 01 10 Mhz


10 10 2 Mhz
Sorties à partir des push-pull
11 50 Mhz ODR 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1
périphériques Alternate Function 01 10 Mhz
(Alternate Functions) 11 10 2 Mhz
open drain
11 50 Mhz Æ On trouve que les bits correspondants dans ODR ont été également mis à 1, et ceci en un
cycle (Une instruction) uniquement. Ceci aurait pris 3 cycles (3 bits) avec la technique Bitbanding.
Tableau 1 : Configurations possibles des Entrées-sorties du STM32

Damergi Emir 2012 Damergi Emir 2012


Chapitre 4 Entrées Sorties du STM32 : GPIO Chapitre 4 Entrées Sorties du STM32 : GPIO

x De même, si on veut mettre des bits à 0 (exemple : les bits b0, b1 et b15), c’est le registre de reset Pour l’activation de l’horloge du port GPIOA, c’est le bit 2 du registre RCC_APB2ENR (voir
BRR qu’on doit utiliser en mettant à 1 les bits correspondants : figure ci-dessous) qui doit être mis à 1.
b31 b16 b15 ……… …… b2 b1 b0
BRR Å 0x8003 BRR 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

ODR 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 0

4. Exemple de programmation des GPIO

Prenons le cas ou on doit faire clignoter deux Leds connectées au pin3 et 4 du port GPIOA
Figure 3- Registre RCC_APB2ENR
(figure suivante)

x Déterminer la séquence de manipulations à faire au niveau des registres pour assurer le


fonctionnement désiré :

Pour arriver à assurer ce fonctionnement, il faut :


Connaître les adresses et le format des différents registres du port GPIOA à utiliser ainsi que
Activer l’horloge du Bit 2 du RCC_APB2ENR RCC_APB2ENR=
le registre d’activation des horloges des périphériques connectés au bus APB2 [RM0008 Reference port GPIOA 0…..0000100 = 0x0004
=1
manual]
Configurer les pins 3
BRR bits 12..15 CRL = 0001 CRL=0x 0001 1000
Registre CRL CRH ODR BSRR RCC_APB2ENR et 4 du GPIOA en
bits 16..19 CRL = 0001
Adresse sortie push-pull
4001 0800 4001 0804 4001 080C 4001 0810 4001 0814 40021018
(Hex)

Tableau 2 : Registres du port GPIOC et leurs adresses Mettre PA3 et 4 à 1 Bit 3 et 4 de BSRR * BSRR =
(Allumer) =1 00..00000011000 = 0X0018
Pour les registres ODR, BSRR et BRR, ce sont les bits ayant les positions 3 et 4 dans chaque
registre qui agit directement sur PA3 et PA4. Delay Delay Delay
Pour les registres de configuration qui ont la structure présentée ci-dessous, il s’agit des 4 bits
12..15 du registre CRL qui vont permettre de configurer le fonctionnement de PA3 et les 4 bits du Mettre PA3 et 4 à 0 Bit 3 et 4 de BRR* BRR =
suivants du registre CRL 16..19 pour PA4. (Eteindre) =1 00..00000011000 =0X0018

* : On aurait pu utiliser le registre ODR, mais on a utilisé les registres BSRR et BRR pour montrer l’accès atomique à un bit
sans changer les valeurs des autres bits de ODR.

Tableau 3 : Registres CRH et CRL

Damergi Emir 2012 Damergi Emir 2012


Chapitre 4 Entrées Sorties du STM32 : GPIO Chapitre 4 Entrées Sorties du STM32 : GPIO

Maintenant, il faut coder l’algorithme présenté par l’organigramme ci-dessus en C :

#define RCC_APB2ENR (uint32_t*) 0x40021018 Déclarer des pointeurs sur les


registres (cases mémoires) 32
#define CRL (uint32_t*) 0x40010800 bits et spécifier leurs adresses
#define BSRR (uint32_t*) 0x40010810 (Exemple : CRL est un
pointeur sur un registre 32 bits
#define BRR (uint32_t*) 0x40010814 ayant l’adresse 40010800 Hex)
int i ;
main ( )
{
*RCC_APB2ENR = (uint32_t) 0x0004;
*CRL = 0x00011000; Ecrire des données 32 bits dans
*BSRR = (uint32_t) 0x0018; les registres pointés par (ayant
les adresses) les variables
for(i=0xFFFFFF; i != 0; i--); // Delay déclarées ci-dessus.
*BRR = (uint32_t) 0x0018;
}

En analysant le code assembleur généré, on trouve pour la première instruction C :

// Charger la valeur 0x40010810 dans R1


// Charger la valeur 0x0300 dans R0
// Sauvegarder dans le registre (RCC_APB2ENR) ayant l’adresse
// 0x40011010 (R1+0x0010) la valeur de R0 = 0x0300

Donc, l’instruction C ne prend que 3 cycles (3 instructions assembleur) et l’opération d’accès


en écriture des deux bits 8 et 9 (STR r0, [r1, #0x10]) ne prend qu’un cycle (une instruction). L’accès
se fait donc d’une façon atomique.
Certes, cette approche est optimale au niveau de la taille du code généré, mais il faut connaître
un grand nombre de détails (adresses des registres, leur structure, etc.…); ce qui est pénible et
demande un long temps de développement.
Pour accélérer le développement, ST offre une « Firmware Library » contenant l’ensemble de
drivers permettant un accès plus simple et transparent aux périphériques du microcontrôleur STM32.
Les paragraphes suivants détailleront la structure générale de cette librairie ainsi que la façon de
l’utiliser.

Damergi Emir 2012 Damergi Emir 2012

Vous aimerez peut-être aussi