CH 4 Les Entrées - Sorties
CH 4 Les Entrées - Sorties
CH 4 Les Entrées - Sorties
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
15
Rappel
0
16
Rappel
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)
24
Mode sortie
26
Mode alternative
27
Mode fonction alternative
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.
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 :
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
39
Registres de contrôle des GPIOs
40
GPIO port mode register (GPIOx_MODER) (x = A..I/J/K)
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)
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)
47
Registres des données
en lecture
48
GPIO port input data register (GPIOx_IDR) (x = A..I)
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)
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
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 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
58
Calcul des adresses des registres GPIO : Offset des registres
59
Exemples de calcul des adresses des registres GPIO
60
Activation de l’horloge via RCC
61
RCC AHB1 peripheral clock register (RCC_AHB1ENR)
62
RCC AHB1 peripheral reset register (RCC_AHB1RSTR)
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
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)
@DODR= 0x40020C14
65
ETAPE 2: définir des pointeurs et les initialiser
66
ETAPE 3: Lecture/écriture dans les registres
Configurer la broche PD12 en mode General Purpose Output Push Pull (GP Output 50
Mhz):
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
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
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
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