CH 4 Les Entrées - Sorties

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 75

CH 4

Les entrées/Sorties (GPIO)


Rappel

2
Rappel

3
Rappel
Mode de sortie


1

0

4
Rappel
Mode d’entrée


0

1

5
Rappel

Push-Pull

1
1 0 1

6
Rappel

Push-Pull

0
0 1 0

7
Rappel

Push-Pull

1
0 1
1

8
Rappel

Push-Pull

0
1 0
0

9
Rappel

Push-Pull

10
Rappel

Push-Pull

Haute impédance
État HI Z
État flottante
Pin à l’air

11
Rappel

Push-Pull

12
Rappel

Drain ouvert

0 0
1
1

13
Rappel

Drain ouvert

1 Flottante
0
0

En mode drain ouvert la sortie est 0 ou bien flottante


14
Rappel

Drain ouvert avec résistance de Pull-UP

Résistance de Pull-Up interne Résistance de Pull-Up externe

15
Rappel

Résistance de Pull-Up interne

0

16
Rappel

Résistance de Pull-Up interne

1

17
General-Purpose I/O (GPIO)
 E/S bidirectionnels de STM32
 9 ports de GPIO standard (GPIOA..GPIOI) (1 port = 16 pines d’E/S)
 Chaque pin est librement programmable
 GPIO standard (tolère une valeur de 5v en entrée) et génère une sortie de 3.3v.
 Chaque GPIO délivre un courant maximal de 25mA.
 Temps de montée en sorite configurable (max 100 MHz)
états de sortie: (push-pull ou bien drain ouvert) et Pull-up/down
 états d’entrées : Flottante, Pull-up/down
 Toutes les pines peuvent être programmeés en fonctions alternés (USARTx, TIMx,
I2Cx, SPIx,…)
 Toute entrée pourrait être configurée comme source d’interruption
 Registre de mise à 1 ou bien à 0 pour avoir un accès en écriture atomique au niveau
du bit pour éviter la modification classique avec read-modify-write.

18
Structure de base d’une broche d’E/S

19
Structure de base d’une broche d’E/S

20
Mode Entrée flottante

21
Mode Entrée flottante

 Le registre de sortie est désactivé lorsque le GPIO est configuré comme entrée.
 L'entrée de trigger de Schmitt est activée.
 Des résistances Pull-Up ou Pull-Down sont disponibles pour être activées.
 Les données présentes sur le port peuvent être lues et sont échantillonnées aussi
vite que la vitesse du port est configurée.
 Lorsqu'une broche GPIO est en mode d'entrée, les données présentes sur la broche
d'E / S sont échantillonnées dans le registre de données d'entrée à chaque cycle
d'horloge APB1. Cela signifie que la vitesse du bus APB1 détermine la vitesse
d'échantillonnage d'entrée pour les broches GPIO

22
Mode Analogique (Analog)

23
Mode Analogique (Analog)

 Lorsque le GPIO est configuré comme analogique:


 Le registre de sortie est désactivé.
 L'entrée de Trigger Schmitt est désactivée et une valeur de "0" est forcée à la sortie.
 La lecture de registre d'entrée permet d’avoir toujours la valeur "0".
 Les résistances Pull-Up ou Pull-Down sont désactivées.
Remarque: Pour la configuration analogique, le GPIO n'est pas tolérant à 5v,
la tension maximale prise en charge est de 3,3v.

24
Mode sortie

 Si une broche GPIO est définie en sortie, on a la possibilité de configurer sa vitesse en


programmant les bits respectifs dans les registres de configuration.
 En utilisant un GPIO comme sortie, nous pourrions utiliser n'importe quel GPIO en
mode Open Drain ou en push pull.
25
Mode sortie

Lorsque le GPIO est configuré en tant que sortie:


 Le registre de sortie est activé.
 Mode de drain ouvert:
 Un "0" dans le registre de sortie active le N-MOS
 Un "1" dans le registre de sortie laisse le port en haute impédance (le P-
MOS ne s'active jamais).
 Mode push-pull:
 Un "0" dans le registre de sortie active le N-MOS
 Un "1" dans le registre de sortie active le P-MOS
 L'entrée Schmitt Trigger est activée.
 Des résistances Pull-Up ou Pull-Down sont disponibles pour être activées.
 La valeur actuelle peut être lue à partir du GPIO.
 La dernière valeur écrite dans le GPIO peut être lue.
 Les données présentes sur le port peuvent être lues et sont échantillonnées par la
vitesse du port par la quelle est configurée.

26
Mode alternative

27
Mode fonction alternative

 Lorsque le GPIO est configuré comme une fonction alternative:


 Le registre de sortie peut être configuré comme Open-Drain ou Push-Pull.
 Le registre de sortie est contrôlé par le signal du périphérique sélectionné.
 L'entrée Schmitt Trigger est activée.
 Des résistances Pull-Up ou Pull-Down sont disponibles pour être activées.
 La valeur actuelle peut être lue à partir du GPIO.
 Les données présentes sur le port peuvent être lues et sont échantillonnées aussi
vite que la vitesse du port est configurée.

28
Multiplexage des broches
 Chaque broche I/O peut être reliée à l’une de seize fonctions secondaires (Alternate
Function AF0 .. AF15) à travers les registres GPIOx_AFRL et GPIO_AFRH :

29
Multiplexage des broches
 Le tableau montre les fonctions alternatives disponibles pour le port A
du STM32F407VG

30
Caractéristiques électriques
VIL et VIH
 V IL est la tension maximale d'un signal d'entrée pour être considéré comme un signal
logique bas .
 V IH est la tension minimale d'un signal d'entrée considéré comme un signal logique haut.

31
Caractéristiques électriques

 Dans le cas ci-dessus, V IH est de 0,45 * VDD + 0,3, VDD étant la tension d’alimentation
de microcontrôleur.
 Pour un VDD = 3,3 V :
V IH = 0,45 * 3,3 V + 0,3 = 1,785 V
 Autrement dit, un signal qui va de bas en haut est considéré comme logiquement
élevé lorsqu'il dépasse 1,785 V.
 Pour V IL, nous avons 0,35 * VDD - 0,04.
 Pour un VDD = 3,3V, V IL serait :
VIL = 0,35 * 3,3 V - 0,04 = 1,115 V
 Ainsi, pour un signal allant de haut en bas , il est considéré comme logiquement bas
lorsqu'il descend en dessous de 1,115 V.

32
Caractéristiques électriques
Valeurs des résistances pull-up/pull-down
 On souhaite connaître les valeurs des résistances pull-up/pull-down, par exemple
dans les cas où il y a une autre résistance en série connectée à la broche (et vous ferez
donc un diviseur de tension et on doit savoir le signal rencontrera V IL et V IH ) ou en
parallèle pour calculer si le signal rencontrera le courant que la broche peut piloter.

 Les valeurs des résistances pull-up et pull-down sont généralement de 40 kΩ.

33
Caractéristiques électriques
Courant électrique
 Il peut y avoir un tableau ou une valeur unique dans la fiche technique de votre
microcontrôleur, mais dans le cas du STM32F401 nous avons ce paragraphe :

 Le courant qu'une broche peut générer ou absorber jusqu'à 8 mA, ou jusqu'à 20 mA


avec V IL et V IH détendus (V IL devient inférieur et V IH supérieur),
 Et que la somme des courants entraînés ou absorbés par toutes les broches ne doit
pas être supérieure ou inférieure à 120 mA et -120 mA respectivement.
34
Caractéristiques électriques
Courant électrique

 Une LED de couleur blanc a besoin d'un courant typique d'environ 20 mA sous une
alimentation typique de 3,5 V (4 V max.).
 Comme le courant absorbé maximum des appareils STM32 est de 25 mA, il n'y a pas
assez de marge pour piloter directement une LED.
 Deux options, utilisant un MOSFET externe (ou BJT) ou pilotant au moyen de deux
GPIO

35
Activation d’horloge d’un GPIO
 Le registre RCC AHB1 peripheral clock register (RCC_AHB1ENR) permet d’activer
l’horloge d’un port connecté au bus AHB1

36
Activation d’horloge d’un GPIO
Le registre RCC AHB1 peripheral clock enable in low power mode register
(RCC_AHB1LPENR) permet d’activer l’horloge d’un port lorsque le processeur en mode
SLEEP.

37
Configuration des broches

 Chaque broche du port I/O peut être configurée selon les modes suivants :
 Entrée flottante
 Entrée pull-up (PU)
 Entrée pull-down (PD)
 Analogique
 Sorite drain ouvert (OD) avec résistance pull-up ou pull-down
 Sortie push-pull (PP) avec résistance pull-up ou pull-down
 Alternate Function push-pull avec résistance pull-up ou pull-down
 Alternate Function drain ouvert avec résistance pull-up ou pull-down

38
Les registres attribués à un GPIO

 STM32F407 dispose de 9 ports d’entrées/sorties de 16 bits (dénommés GPIOA à


GPIOI), partagés avec d’autres périphériques,.
 A chaque port I/O est associé:
 quatre registres de configuration 32 bits (GPIOx_MODER,
GPIOx_OTYPER, GPIOx_OSPEEDR et GPIOx_PUPDR),
 deux registres de données 32bits (GPIOx_IDR et GPIOx_ODR),
 un register de 32bits set/reset (GPIOx_BSRR),
 un registre 32bits de verrouillage (GPIOx_LCKR) et
 deux registres 32 bits pour les fonctions secondaire (Alternate function)
(GPIOx_AFRH et GPIOx_AFRL).

39
Registres de contrôle des GPIOs

 Pour la manipulation des 9 GPIOx(x=A..I), on a recours à l’utilisation des registres de


contrôle suivants:
 GPIOx_MODER: registre utilisé pour sélectionner la direction (Entrée ou
Sortie), Fonction alternée et analogique (input, output, AF, analog)
 GPIOx_OTYPER: Registre utilisé pour sélectionner le type de sortie
PP(pushpull ) ou OD (open-drain)
 GPIOx_OSPEEDR: Registre utilisé pour sélectionner la vitesse quelque soit la
direction I/O
 GPIOx_PUPDR: Registre utilisé pour la sélection du mode PU ou PD ( pull-
up/pull-down) quelque soit la direction I/O

40
GPIO port mode register (GPIOx_MODER) (x = A..I/J/K)

Ce registre permet de configurer le mode de chaque broche du port x (x = A..I/J/K) vue


que chaque port contient 16 broches.

41
GPIO port output type register (GPIOx_OTYPER) (x = A..I/J/K)

Ce registre est utilisé uniquement pour configurer les sorties en push-Pull qui est l’état
par défaut après un RESET ou bien drain ouvert

42
GPIO port output speed register (GPIOx_OSPEEDR) (x = A..I/J/K)

-‘00’ Low speed (max [2-8]MHz)


-‘01’ Medium speed (max [12,5-50]MHz)
-‘10’ Fast speed (max [25-100]MHz)
-‘11’ High speed (max [50-180]MHz)

43
GPIO port output speed register (GPIOx_OSPEEDR) (x = A..I/J/K)

LOW

MEDIUM

HIGH

VERY HIGH

44
La cellule de compensation d‘E/S (Compensation cell)
 Un ajustement automatique de la vitesse de balayage pour le basculement IO haute
fréquence:
 Les pentes de montée et de descente lors de changement d’état pour les broches
des ports sont ajustées en fonction de la tension d'alimentation et de la température
 Recommandé lorsque la fréquence d’horloge est de 50 MHz à 100 MHz
 Permet une plus grande immunité aux bruits d'E / S contre VDD
 La fonction est activée par le logiciel (désactivée par défaut) et désactivée en
mode basse consommation (SLEEP mode)
 Doit être activé si la plage de fonctionnement VDD: 2,4 V-3,6 V
 La consommation d'énergie est augmentée lorsqu'elle est activée

45
Activation du cellule de compensation d‘E/S (Compensation cell)

 L’activation de la cellule de compensation d’E/S se via le system configuration


controller (SYSCFG)

 Il tout d’abord activer l’horloge de syscfg.


 Après l’activation de cellule de compensation par le bit 0 (CMP_PD) il faut attendre
quelques instants et tester si elle est prête ou non par le teste du bit 8 (READY)
46
GPIO port pull-up/pull-down register (GPIOx_PUPDR) (x = A..I/)

Ce registre est utilisé en entré comme en sortie

47
Registres des données

 GPIOx_IDR(x=A..I): récupérer les données entrantes du port x, accédé en lecture seule

 GPIOx_ODR(x=A..I): envoyer les données en sorties du port x, accédé en écriture et

en lecture

48
GPIO port input data register (GPIOx_IDR) (x = A..I)

 Tout les Bits sont en mode lecture seulement dans ce registre.


 Dans ce registre on trouve l’information qui vienne de l’extérieur.
 Ce registre permet de déterminer l’état de chaque broche configuré en entrée.
 Si le bit à 1 c’est-à-dire qu’on reçu un 1 sur cette broche et 0 sinon.

49
GPIO port output data register (GPIOx_ODR) (x = A..I)

 Ce registre pour faire sortir les informations via les broches du port.
 Chaque broche est en mode read/write.
 Si on fait la lecture de ce registre on lit la dernière information écrite dans ce registre.
 L’écriture dans ce registre se fait par la procédure Lire-modifier-écrire
 Il ne sera pas recommandé d’utiliser ce registre si on veut faire sortir une valeur car il
ne favorise pas la procédure d’opération bit à bit atomique

50
GPIO port bit set/reset register (GPIOx_BSRR)(x = A..I)

 Ce registre sera utiliser si on veut faire un set ou bien reset de chaque broche à la sortie.
 Ce registre est divisé en deux parties
 Les 16 bits supérieur de 16 à 31 pour le forçage à 0 (RESET) d’une broche
 Les 16 bits inférieur de 0 à 15 pour le forçage à 1 (SET) d’une broche
 L’utilisation de ce registre favorise la procédure d’opération bit à bit atomique .

51
GPIO port configuration lock register (GPIOx_LCKR)(x = A..I)

Liste des registres


verrouillés:
 GPIOx_moder
 GPIOx_Otyper
 GPIOx_Ospeed
 GPIOx_PUPDR
 GPIOx_AFRL
 GPIOx_AFRH

52
GPIO port configuration lock register (GPIOx_LCKR)(x = A..I)

 Ce registre est utilisé pour verrouiller la configuration des bits du port lorsqu'une
séquence d'écriture correcte est appliquée au bit 16 (LCKK).
 La valeur de bits [15: 0] est utilisée pour verrouiller la configuration du GPIO.
 Pendant la séquence d'écriture, la valeur de LCKR [15: 0] ne doit pas changer.
 Lorsque la séquence LOCK a été appliquée sur un bit de port, la valeur de ce bit de port
ne peut plus être modifiée jusqu'à la prochaine réinitialisation MCU ou périphérique.

Remarque: Une séquence d'écriture spécifique est utilisée pour écrire dans le registre
GPIOx_LCKR. Seul l'accès aux mots (32 bits) est autorisé pendant cette séquence
d'écriture. Chaque bit de verrouillage fige un registre de configuration spécifique
(commande et fonction alternative registres).

53
GPIO alternate function low register (GPIOx_AFRL) (x = A..I)

54
GPIO alternate function high register (GPIOx_AFRH) (x = A..I)

55
Organigramme de configuration des E/S
Activer
Sélectionner le
l’horloge du
mode de GPIO
port

Sortie AF
Sélection de AF
requis

Sortie GP

Sélectionner le type Activer la Sélectionner


Sélectionner la
de sortie (push-pull, compensation pull-up ou bien
vitesse de sortie
drain ouvert) cellule si nécessaire pull-down

Entrée AF

Sélection de AF
requis

Entrée GP
Sélectionner
pull-up ou bien
pull-down

analogique

FIN 56
Calcul des adresses des registres GPIO

 L’adresse physique d’un registre d’un périphérique est la somme de:


 l’adresse de base du périphérique
 l’adresse d’offset du registre

 L’adresse de base d’un périphérique est définie dans le memory map (définie par la
datasheet STM32F40x)
 Les adresses d’offset des registres sont définies dans la description des registres du
RM (Table 32 pages 203/204 du fichier «ReferenceManual» de STM32F40x)

Remarque: Les adresses de base des GPIO et d’offset des principaux registres sont
présentées par la suite

57
Calcul des adresses des registres GPIO : Adresse de base

Adresses de base des ports GPIO

58
Calcul des adresses des registres GPIO : Offset des registres

59
Exemples de calcul des adresses des registres GPIO

 On désire Calculer les adresses des registres suivants:


 GPIOC_ODR
 GPIOA_AFRH
 GPIOH_PUPDR

@GPIOC_ODR = @GPIOC_BASE + @OFSET_ODR


= 0x4002 0800 + 0x14
= 0x4002 0814

@GPIOA_AFRH = @GPIOA_BASE + @OFSET_AFRH


= 0x4002 0000 + 0x24
= 0x4002 0024

@GPIOH_PUPDR = @GPIOH_BASE + @OFSET_PUPDR


= 0x4002 1C00 + 0x0C
= 0x4002 1C0C

60
Activation de l’horloge via RCC

 RCC ( Reset ClockControl) est le registre de configuration de la circuiterie de Reset est


d’horloge.
 Permet de synchroniser les trois bus du Cortex-M4 (AHB, APB1 et APB2) avec le bus
interne du système le bus matrix
 Les GPIO sont montés sur le bus AHB1.
 Tout GPIO (composant en général) doit être activé par le registre RCC avant son
utilisation.
 L’avantage de RCC est la possibilité d’activer, suivant le besoin de l’application, les
composants nécessaires à l’application.
 Ce qui résulte une bonne gestion de la consommation du système embarqué.

61
RCC AHB1 peripheral clock register (RCC_AHB1ENR)

@ RCC_AHB1ENR = @base_RCC + @offset AHB1ENR


= 0x4002 3800 + 0x30
= 0x4002 3830

62
RCC AHB1 peripheral reset register (RCC_AHB1RSTR)

@ RCC_AHB1RSTR = @base_RCC + @offset AHB1ENR


= 0x4002 3800 + 0x10
= 0x4002 3800

 Ce registre permet de remettre à l’état initial le périphérique à utiliser par une écriture de 1.
 Suite à cette écriture de 1, il faut écrire 0 pour que le périphérique sorte de son état de
reset.

63
Principe de programmation à base des registres

 Ecrire un programme en C qui utilise uniquement la notion des registres d’un


périphérique pourrait être considérer comme étant une fonction de registres mise en jeu.
PROG = f(registres)

 La programmation consiste alors :


ETAPE 1: Définir les registres à utiliser pour l’application. Chaque registre est
équivalent à une adresse et par la suite la manipulation nécessite un pointeur en C
 ETAPE 2: Initialiser ces pointeurs par leurs adresses adéquates
 ETAPE 3: Lecture et/ou écriture des contenus des registres
 Lecture: Cette opération permet de lire l’état du système
 Ecriture: Cette opération permet de commander le système

64
ETAPE 1: Définir les adresses des registres
 Les périphériques à utiliser dans notre cas sont :
RCC (Reset and ClockControl): pour activer l’horloge
 Les registres à utiliser de l’RCC est RCC_AHB1ENR + RCC_AHB1RSTR
 GPIOD: pour commander la broche PD12 connectée au LED4
 Les registres à utiliser du périphérique GPIOD sont MODREG , DOTYPE ,
DSPEED, PUPPDR et ODR (de même pour les autres)

RCC adresse de base: GPIOD adresse de base:


0x4002 3800 @ 0x4002 0C00

AHB1ENR: AHB1RSTR: MODREG : @offset= 0x00


@offset= 0x30 @offset= 0x10
ODR: @offset= 0x14
@ AHB1RSTR = 0x40023810

@ AHB1ENR = 0x40023830 @ DMODREG = 0x40020C00

@DODR= 0x40020C14
65
ETAPE 2: définir des pointeurs et les initialiser

 Déclaration et initialisation des pointeurs des registres

volatile unsigned int* MODREG = (unsignedint*) 0x40020C00;


volatile unsigned int* DOTYPE = (unsignedint*) 0x40020C04;
volatile unsigned int* DSPEED = (unsignedint*) 0x40020C08;
volatile unsigned int* DODR = (unsignedint*) 0x40020C14;
volatile unsigned int* PUPPDR = (unsignedint*) 0x40020C0C;
//RCC_AHB1ENR
volatile unsigned int* AHB1_ENR =(unsignedint*) 0x40023830;
//RCC_AHB1ENR
volatile unsigned int* AHB1_RSTR =(unsignedint*) 0x40023810;

Attention: volatile empêche l’effet de l’optimisation (taille du code + Speed) sur


les variables déclarées qui sont ici les adresses des registres.

66
ETAPE 3: Lecture/écriture dans les registres

Réinitialiser le GPIOD Mettre le Bit3 de AHB1_RSTR à 1 puis 0


Activer l’horloge de GPIOD Mettre le Bit3 de AHB1_ENR à 1

Configurer la broche PD12 en mode General Purpose Output Push Pull (GP Output 50
Mhz):

Bits [25- Bit [12] =0 Bits [25-24]


Bits [25-24]
=01
24] =01 =01=50Mhz

67
ETAPE 3: Lecture/écriture dans les registres

Int main() {
// SET GPIOD DENIT
*AHB1_RSTR |= 1<<3;
// RESET GPIOD DENIT
*AHB1_RSTR &= ~(1<<3);
// EnableGPIOD Clock ….
*AHB1_ENR |= 1<<3; // SPEED = 50 Mhz bits 25-24 = 0-1
// Configuration MODREG *DSPEED &= 0xFCFFFFFF;
// bits 25-24 = 01 *DSPEED |= 0x01000000;
*MODREG &= 0xFCFFFFFF; // Bits 25-24 = 00
*MODREG |= 0x01000000; *PUPPDR &= 0xFCFFFFFF;
// Bit 12 = 0
*DOTYPE &= ~(1<<12);

68
ETAPE 3: Lecture/écriture dans les registres

 Mettre à 1 la sortie PD12 :


 Mettre le bit 12 à 1 dans le registre DODR
Ecriture dans le registre DODR
 Ajouter un delay en utilisant la boucle for

 Mettre à 0 la sortie PD12 :


 Mettre le bit 12 à 0 dans le registre EODR Ecriture dans le registre DODR
 Ajouter un delay en utilisant la boucle for

while(1){
*DODR |= 1<<12;
tempo(0xffffff);
*DODR &= ~(1<<12);
tempo(0xffffff);
}

69
Code complet de l’application
volatile unsignedint* MODREG = (unsignedint*) 0x40020C00;
volatile unsignedint* DOTYPE = (unsignedint*) 0x40020C04;
volatile unsignedint* DSPEED = (unsignedint*) 0x40020C08;
volatile unsignedint* DODR = (unsignedint*) 0x40020C14;
volatile unsignedint* PUPPDR = (unsignedint*) 0x40020C0C;
volatile unsignedint* AHB1_ENR=(unsignedint*) 0x40023830;
volatile unsignedint* AHB1_RSTR=(unsignedint*) 0x40023810;
Void tempo(volatile unsigned int CNT)
{
for(; CNT > 0 ;CNT --);
}
Int main() {
// SET GPIOD DENIT // Bit 12 = 0 while(1)
*AHB1_RSTR |= 1<<3; *DOTYPE &= ~(1<<12); {
// RESET GPIOD DENIT // SPEED = 50 Mhz bits 25-24 *DODR |= 1<<12;
*AHB1_RSTR &= ~(1<<3); //= 0-1 tempo(0xffffff);
// EnableGPIOD Clock *DSPEED &= 0xFCFFFFFF; *DODR &= ~(1<<12);
*AHB1_ENR |= 1<<3; *DSPEED |= 0x01000000; tempo(0xffffff);
// Configuration MODREG bits // Bits 25-24 = 00 }
//25-24=01 *PUPPDR &= 0xFCFFFFFF; }
*MODREG &= 0xFCFFFFFF;
*MODREG |= 0x01000000; 70
DÉFINITION DES REGISTRES DANS
LA BIBLIOTHÈQUE DE STM32

71
Interprétation des macros dans STM32F4xx.h

#define PERIPH_BASE 0x40000000U


#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000U)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00U)
#define GPIOD ((GPIO_TypeDef*) GPIOD_BASE)

 AHB1PERIPH_BASE sera remplacé par l’adresse 0x40000000U + 0x00020000U =


0x40020000U. L’utilisation de suffixe U est pour forcer le compilateur à utiliser pour une
constante le type Unsigned int .
 GPIOD_BASE sera remplacé par l’adresse 0x40020000U + 0x0C00U = 0x40020C00U
 GPIOD remplacée par 0x40020C00U. Cette valeur sera convertie en une adresse sur la
structure GPIO_TypeDef:
#define GPIOD (GPIO_TypeDef*) 0x40020C00U
(suite ...)

72
Interprétation des macros dans STM32F4xx.h
GPIOD: 0x40020C00U
GPIOD: une case mémoire quelconque
0xXXXXXXXX
… …
0x40020C00U MODER
+0x04 OTYPER
typedef struct {
+0x08 DSPEEDR __IO uint32_t MODER; /* Address offset: 0x00 */
__IO uint32_t OTYPER; /* Address offset: 0x04 */
+0x0C PUPDR __IO uint32_t OSPEEDR; /*Address offset: 0x08 */
En
__IO uint32_t PUPDR; /*Address offset: 0x0C */
+0x10 IDR mémoire __IO uint32_t IDR; /*Address offset: 0x10 */
__IO uint32_t ODR; /*Address offset: 0x14 */
+0x14 ODR __IO uint16_t BSRRL; /* Address offset: 0x18 */
__IO uint16_t BSRRH; /* Address offset: 0x1A */
+0x18 BSRRL __IO uint32_t LCKR; /* Address offset: 0x1C */
__IO uint32_t AFRL; /* Address offset: 0x20*/
+0x1A BSSRH __IO uint32_t AFRH; /* Address offset: 0x24 */
} GPIO_TypeDef;
+0x1C LCKR
+0x20 AFRL
 Chaque case est 32 bits (4 octets) ainsi les
+0x24 AFRH offsets 0x04, 0x08 … 0x18.
 Les adresses des registres attribuées à chaque GPIO sont vérifiées.
 Par exemple ici GPIOD est un pointeur sur la structure GPIO_TypeDef.
 L’accès à un champ de la structure comme IDR (ou autre) par exemple se fait comme
suit: (*GPIOD).IDR ou encore GPIOD->IDR si en utilise l’écriture simplifiée. 73
Le principe de la programmation

 Sans Bibliothèque
Volatile unsigned int* DIDR = 0x40020C10U
if ((*DIDR & 0xFFFF) == 0x0000) …..

 Avec Bibliothèque
#include"STM32F4xx.h"
if (GPIOD->IDR & 0xFFFF) == 0x0000) …..

74
Exemple

1. Configurer la broche PB12 en sortie.


2. Clignoter la LED pendant 500 ms.

RCC->AHB1ENR |= (1<<3);
GPIOB->MODER |= 0x55000000;
GPIOB->MODER &= 0x55FFFFFF;
GPIOB->OTYPER &= 0x0FFF;
GPIOB->OSPEEDR &=0x00FFFFFF;
Code :
Masquage
GPIOB->ODR &=0x0FFF;
HAL_Delay(500);
GPIOB->ODR |=0xF000;
HAL_Delay(500);
Bit SET/RESET
GPIOB->BSRR = (uint32_t)(0xF<<12);
HAL_Delay(500);
GPIOB->BSRR = (uint32_t)(0xF<<28);
HAL_Delay(500);

75

Vous aimerez peut-être aussi