Vous êtes sur la page 1sur 50

The Cortex-M3 MCUs:

STM32 GPIO
DAMERGI Emir
2018/19
SOC Architecture
Un “System On Chip” (ou même un PC) possède l’architecture suivante:

Mémoire Program Memory


(SRAM) (Flash, Eeprom, Rom)

Processeur BUS

GPIO GPIO GPIO GPIO

Interfaces de périphériques (Peripheral Interfaces, Peripherals)

Interfaces de contrôle (Contrôleur d’interruption, DMA)

GPIO GPIO (General Purpose Input Output) « Periph Interfaces »


2
SOC Architecture
Du point de vue du processeur, chaque interface de périph. est un
ensemble de registres qui peuvent êtres accédés en écriture et en lecture.

Peripheral Interface

@ Register
i
i+4
i+8
Processor
….

BUS (Control bus + Data bus + Addr Bus)

3
SOC Architecture: memory map
Chaque mémoire ou périph. Occupe une zone d’adresses précise dans
l’espace d’adressage du processeur: MEMORY MAP

0 Base Address
Adr_x
RAM L’adresse à partir de
Adr_y
FLASH laquelle est placée
Adr_z
GPIO x
une mémoire ou un
Processor GPIO y
périph est appelée
Periph x
adresse de base
(Base Address)

max
4
SOC Architecture: memory map
Chaque registre faisant partie d’un périph du SOC possède un offset
(déplacement) précis et fixe.
Base Address
0 Offset * Registre
Adr_x
0 Reg_a
RAM Adr_y 4 Reg_b
FLASH Adr_z 8 Reg_c

GPIO x …. ….
….. …
Processor GPIO y
Periph x
L’adresse d’un registre i d’un periph x =
Base Address (Periph i)+ Offset (Reg i)
 Adr (Reg_b de GPIO x) = Adr_z + 4
max
* : for 32 bits registers
5
Architecture du STM32 – F1 (1)
Cortex-M3 AHB: Advanced High Bus – APB : Advanced Peripheral Bus

USART 2/6
RCC ADC 3
Ethernet TIM1/8/9/10/11
USB SPI1

BUS AHB AHB/APB APB1(36 Mhz)


Matrix (72 Mhz) Bridge APB2 (72 MHz)

GPIO A/B/C/…/I
USART 1
ADC 1/2

6
STM32 – F1 : Memory Map
Chaque Interface de Périphérique occupe
une plage d’adresse commençant à partir Chaque Registre faisant partie d’un
d’une adresse de base précise périphérique possède un offset

Adresse (RegX ,Periph i) =

Adresse de base(Periph i) + Offset (Reg X)

7
STM32 Architecture overview

RCC

8
RCC: Reset & Clock Circuit
Par défaut, après le démarrage du mc, toutes les interfaces de périphériques sont
désactivés à l’exception du RCC (Reset & Control Clock)  Optimisation de la
consommation.

En fait, c’est son rôle d’activer les interfaces d’E/S par mise à 1 d’un signal ENABLE
Chaque interface de périphérique ayant sont propre signal d’activation.

9
Le RCC: Reset Control Clock

Le module RCC (@ de base = 0x4002 1000) contient un ensemble


de registres 32 bits, contrôlant chacun les interfaces E/S de l’un des
BUS:

0x4002 1014

0x4002 1018

0x4002 101C

ENR : ENable Register

10
RCC: RCC_APB2 ENR
Chacun des 32 bits étant directement connecté à l’une des interfaces d’E/S.
Une mise à « 1 » du bit active l’interface E/S associé. Un « 0 » le désactive.

RCC_APB2 ENR
31 30 .. .. .. .. .. .. 1 9 8 7 6 5 4 3 2 1 0
0

GPIOG EN
GPIOH EN

GPIOD EN

GPIOC EN

GPIOB EN

GPIOA EN
GPIOE EN
GPIOF EN
……

……

……

……

……

……

……

……

……
……
APB2

GPIO G

GPIO C

GPIO A

11
STM32 Architecture overview

GPIO:
General Purpose
Input Output

12
GPIOS: General Purpose Inputs Outputs
Each pin is connected to 2
Regs(IDR / ODR)

pins

IDR: Input Data Register


ODR: Output Data Register 13
GPIOS: General Purpose Inputs Outputs

16 I/O BITS per GPIO


GPIOB

GPIOx GPIOA
Processor
(Cortex_M)

Microcontroller Pins
GPIOx

• Up to 10 GPIOs (160 I/O bits): GPIOA , GPIOB, …, GPIOI


• Each bit can be configured individually
14
GPIOS: General Purpose Inputs Outputs
Les GPIOs, sont les interfaces E/S de base permettant la communication entre le
système (Processeur / autres Interfaces E/S (UART, SPI, etc..) et les périphériques
externes.
Microcontrôleur 16 BITS E/S (pins) par GPIO

Processeur GPIOx

Pins du
microcontrôleur

Interface Interface
E/S E/S

Toute communication avec l’extérieur passe obligatoirement par un GPIO


(Connexions physiques existent entre les BITS du GPIO et les interfaces E/S)
GPIOS: General Purpose Inputs Outputs

GPIOx
I/O Signal 1
Peripheral …….
I/O signal i

GPIOx
I/O Signal 1
Peripheral …….
I/O signal i

• Chaque signal d’E/S d’un périph. peut communiquer avec l’extérieur à travers un
pin GPIO parmi plusieurs (2 à 3) possibles. Le choix se fait par programmation.

• Chaque pin GPIO peut être connecté à un parmi plusieurs signaux E/S.
16
GPIOs: General Purpose Inputs Outputs
Chaque port GPIO contient :
• Un registre d’entrée (IDR: Input Data Register)
• Un registre de sortie (ODR: Output Data Register)
• Des registres de configuration.
• 16 ports E/S (1 bit) permettant la connexion avec les pins du microcontrôleur

16 « 1 bit Ports » E/S

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi

Interface
bi Pins du
E/S
microcontrôleur

BRR BSRR
GPIO: Structure d’un port (1 bit) E/S
Chaque bit (cellule) E/S d’un GPIO possède la structure suivante.

Chaque « 1 bit port » E/S peut être configuré en un des 4 modes possibles.
Modes GPIO: Output
Configuration d’un bit en Sortie: On retrouve au niveau du Pin, le niveau de tension
correspondant à l’état binaire du bit bi du registre de sortie ODR.
Celui-ci est imposé par le processeur

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi
CONFIG

Interface OUTPUT
bi Pins du
E/S microcontrôleur

BRR BSRR
Modes GPIO: Input
Configuration d’un bit en Entrée: On retrouve au niveau du bit bi du registre d’entrée
IDR, le niveau logique correspondant à la tension appliquée au pin.
Celui-ci peut être lu par le processeur

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi
CONFIG

Interface INPUT
bi Pins du
E/S microcontrôleur

BRR BSRR
Modes GPIO: Alternate Function
Configuration en ALTERNATE FUNCTION: Dans cette configuration, le pin est
directement relié à l’un des signaux d’une interface E/S (tel que USART, ETHERNET,..)

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi
CONFIG

Interface Pins du
bi
E/S microcontrôleur
ALTERNATE
FUNCTION
BRR BSRR

Rq: Toute connexion des Interfaces E/S avec l’extèrieur se fait par le biais d’un pin
de l’un des ports GIPO .
Modes GPIO: Analog
Configuration en ANALOG mode: Dans cette configuration, le pin est directement
connecté aux interfaces E/S analogiques (ADC/DAC).

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi
CONFIG

Interface Pins du
bi
E/S microcontrôleur
Analog mode
ADC/DAC BRR BSRR
GPIOS: General Purpose Inputs Outputs
Chaque port GPIO (16 BITS E/S) contient :
• Un registre d’entrée (IDR: Input Data Register)
• Un registre de sortie (ODR: Output Data Register)
• Des registres de configuration. 16 BITS E/S

GPIOx Configuration Regs


ODR
Processeur bi

IDR
bi
CONFIG

Interface OUTPUT INPUT


ALTERNATE bi Pins du
E/S microcontrôleur
FUNCTION

Analog mode BRR BSRR


ADC/DAC
GPIO: Structure d’un port (1 bit) E/S
Chaque bit (cellule) E/S d’un GPIO possède la structure suivante.

Analog mode (To ADC)

ALTERNATE FUNCTION
(To I/O Interfaces)

To Processor
INPUT

From Processor
OUTPUT

Analog mode
ALTERNATE FUNCTION (From DAC)
(From I/O Interfaces)

Chaque « 1 bit port » E/S peut être configuré en un des 4 modes possibles.
GPIO: Cellule (Bit) E/S
En plus des modes, il est également possible de configurer la structure électrique
même à partir des registres de configuration:

Résistances
Pull-up/Pull-down

Transistors
N-MOS/P-MOS
GPIO: Configuration électrique
1. Configuration des résistances pull-up/pull-down

Pull UP

Pull Down

No Pull
GPIO: Configuration électrique
1. Configuration des Transistors N-MOS/P-MOS

Push Pull

Ces configurations
ne sont valables que
si le Pin est en mode
OUTPUT

Open drain
Configuration des GPIOs: Fréquence
Quand un « port 1 bit » est configuré en sortie, il est possible de choisir la
fréquence avec laquelle il peut commuter d’un niveau logique à un autre.

Tc = Temps de commutation Fréquence de commutation = 1/Tc

Les valeurs possibles pour la fréquence de commutation sont:


• 2 Mhz
• 10 Mhz
• 50 Mhz

Remarque : Une fréquence basse permet de limiter la consommation

28
Configuration des GPIOs: valeurs
Les différentes configurations possibles sont données dans le tableau.
A l’initialisation, tous les IO sont configurés en ‘Input Floating’.

29
Configuration des GPIOs: CRL/CRH
La configuration de chacun des 16 bits d’un GPIO dépend d’une valeur de 4 bits
 16*4 = 64 bits = 2 registres de 32 bits : CRL/CRH

30
GPIOS: Memory Map

31
Programmation GPIO: Accès direct aux registres
Ainsi, pour programmer un Pin (en lecture ou écriture) d’un GPIO, il
faut suivre les étapes suivantes:

Définir les registres à


1 utiliser (taille, adresses)

Activer l’interface E/S


2
(GPIOx)

3 Configurer le Pin

Imposer (ou lire) la valeur


4 d’un bit (Pin)
Exemple: Clignotement led

La carte Discovery F1 contient une Led:


connectée au pin 9 du port GPIOC

Ecrire un programme permettant


de faire clignoter la diode Led.
Rq: Configurer le pin en sortie
/Push-pull.
Exemple: solution

1 Définir les registres à utiliser (taille, adresses)

// Le registre du module RCC permettant d’activer les interface E/S

#define RCC_APB2ENR (uint32_t*) 40021018

// Le registre de configuration CRH du port GPIOC

#define GPIOC_CRH (uint32_t*) 0x40011004

// Le registre ODR du port GPIOC

#define GPIOC_ODR (uint32_t*) 0x4001100C


Exemple: solution

2 Activer l’interface E/S (GPIOx)

RCC_APB2ENR
31 30 .. .. .. .. .. .. .. .. 8 7 6 5 4 3 2 1 0

GPIOG EN
GPIOH EN

GPIOD EN

GPIOC EN

GPIOB EN

GPIOA EN
GPIOE EN
GPIOF EN
GPIOI EN

AFIOEN
……

……

……

……

……

……

……

……

……

……

0 0 0 … … … … … … … 0 0 0 0 1 0 0 0 0 = 0x00000010

// Initialiser le registre RCC_APB2ENR pour activer GPIOC

*RCC_APB2ENR |= 0x00000010;
Exemple: solution

3 Configurer Pin 9 (GPIOC en Sortie PP: 0001)

0001 = 0x01

à partir de la

position 4.

*GPIOC_CRH &= ~ ( (uint32_t) 0x0F << 4 );


*GPIOC_CRH |= 0x01 << 4;
Exemple: solution
4 Imposer (ou lire) la valeur d’un bit (Pin)

GPIOC (Registre ODR)


3 3 . . .. 1 1 1 1 9 8 7 6 5 4 3 2 1 0
1 0 . . 3 2 1 0
Allumer Led:
pin 9 (ODR/GPIOC) = 1 0 0 . . .. . 0 0 0 0 0 0 0 0 0 0 0 0
1

Éteindre Led: 0 0 . . .. … 0 0 0 0 0 0 0 0 0 0 0 0
0
pin 9 (ODR/GPIOC) = 0

// allumer Led // éteindre Led


*GPIOC_ODR|= 0x01 << 9; *GPIOC_ODR &= ~ ( (uint32_t) 0x01 << 9);
Exemple: Clignotement led
#define RCC_APB2ENR (uint32_t*) 40021018

#define GPIOC_CRH (uint32_t*) 0x40011004

#define GPIOC_ODR (uint32_t*) 0x4001100C

*RCC_APB2ENR |= 0x00000004; // activer GPIOC Clock

*GPIOC_CRH &= ~ ( (uint32_t) 0x0F << 4 );


*GPIOC_CRH |= 0x01 << 4;

While(1) {
*GPIOC_ODR |= 0x01 << 9; //PC9 = 1 (Led ON)
Delay();
*GPIOC_ODR &= ~ ( (uint32_t) 0x01 << 9); // PC9 = 0 (Led OFF)
Delay(); }
Masquage logique: Inconvénient
variable = *Registre;
variable |=0x00000080
*Registre variable;
*Registre |= 0x0000080;
*Registre &=0xFFFFFFBF; variable = *Registre;
variable &=0xFFFFFFBF;
*Registre variable;

Effectivement chaque opération de masquage s’exécute en 3 instructions:


• Lecture à partir du registre
• opération logique
• Ecriture dans le registre

+ Taille code , + temps d’exécution


Masquage logique: Hardwired
Pour le registre ODR, il est possible de mettre un bit à 1 ou à 0 en une seule
instruction (en passant par les registres BSRR et BRR)

BSRR bi BRR bi

OR
AND

ODR bi
ODR bi

• En imposant un «1» au bit bi du BSRR • En imposant un «1» au bit bi du BRR 


 le bit bi de ODR = “1” le bit bi de ODR = “0”
• Un «0» au bit bi du BSRR • Un «0» au bit bi du BRR
 le bit bi de ODR garde sa valeur  le bit bi de ODR garde sa valeur

BSRR: Bit Set Register


BRR: Bit Reset Register
Masquage logique: Hardwired solution
Imposer la valeur d’un bit (Pin):
1 resp 0 au niveau du bit 9 du registre ODR
ODR

3 3 . . .. 1 1 1 1 9 8 7 6 5 4 3 2 1 0
1 0 . . 3 2 1 0 *BSRR= 0x000000200;
b b b b b 1 b b b b b b b b b ou
3 3 . . .. . 1 1 1 8 7 6 5 4 3 2 1 0
1 0 2 1 0
*BSRR= 0x01 <<9;

1 instruction pour chaque


opération de masquage
ODR
3 3 . . .. 1 1 1 1 9 8 7 6 5 4 3 2 1 0 *BRR = 0x00000200;
1 0 . . 3 2 1 0
ou
b b b b b 0 b b b b b b b b b
3 3 . . .. . 1 1 1 8 7 6 5 4 3 2 1 0
1 0 2 1 0
*BRR = 0x01 <<9;

Remarque: Ceci n’est valable que pour les registres ODR


Exemple: Clignotement led
#define RCC_APB2ENR (uint32_t*) 0x40021018

#define GPIOC_CRH (uint32_t*) 0x40011004

#define GPIOC_BSRR (uint32_t*) 0x40011010

#define GPIOC_BRR (uint32_t*) 0x40011014

*RCC_APB2ENR |= 0x00000004; // activer GPIOC Clock

*GPIOC_CRH &= ~ ( (uint32_t) 0x0F << 4 );


*GPIOC_CRH |= 0x01 << 4;

While(1) {
*GPIOC_BSRR = 0x01 << 9; //PC9 = 1 (Led ON) BSRR, BRR:
Delay(); Hardwired Mask
*GPIOC_BRR = 0x01 << 9; // PC9 = 0 (Led OFF)
Delay(); }
Exemple: Appui + Contrôle led

La carte Discovery F1 contient une Led:


connectée au pin 9 du port GPIOC

Ecrire un programme permettant


d’allumer la diode Led si le bouton
est appuyé, sinon l’éteindre
Rq: Pour les pin en sortie /Push-pull 2 MHz
Pour les pin en entrée Input Floating

La carte Discovery F1 contient un Bouton poussoir:


connectée au pin 0 du port GPIOA
Exemple: solution

1 Définir les registres à utiliser (taille, adresses)

#define RCC_APB2ENR (uint32_t*) 0x40021018

#define GPIOC_CRH (uint32_t*) 0x40011004 GPIOC (Pin9)

#define GPIOC_BSRR (uint32_t*) 0x40011010

#define GPIOC_BRR (uint32_t*) 0x40011014

#define GPIOA_CRL (uint32_t*) 0x40010800 GPIOA (Pin0)

#define GPIOA_IDR (uint32_t*) 0x40010800


Exemple: solution

2 Activer l’interface E/S (GPIOx)

RCC_APB2ENR
31 30 .. .. .. .. .. .. .. .. 8 7 6 5 4 3 2 1 0

GPIOG EN
GPIOH EN

GPIOD EN

GPIOC EN

GPIOB EN

GPIOA EN
GPIOE EN
GPIOF EN
GPIOI EN

AFIOEN
……

……

……

……

……

……

……

……

……

……

0 0 0 … … … … … … … 0 0 0 0 1 0 1 0 0 = 0x00000014

// Initialiser le registre RCC_APB2ENR pour activer GPIOC

*RCC_APB2ENR |= 0x00000014;
Exemple: solution

3-a Configurer Pin 9 (GPIOC en Sortie PP: 0010)

0010 = 0x02

à partir de la

position 4.

*GPIOC_CRH &= ~ ( (uint32_t) 0x0F << 4 );


*GPIOC_CRH |= 0x02 << 4;
Exemple: solution

3-b Configurer Pin 0 (GPIOA en Input Floating: 0100)

0100 = 0x04

à partir de la

position 0.

*GPIOA_CRL &= ~ ( (uint32_t) 0x0F );


*GPIOA_CRL |= 0x04;
Exemple: solution
4 Lire la valeur d’un bit (Pin0 du GPIOA)

GPIOA (Registre IDR)


3 3 . . .. 1 1 1 1 9 8 7 6 5 4 3 2 1 0
1 0 . . 3 2 1 0

0 0 . . .. . 0 0 0 0 0 0 0 0 0 0 0 0 Lire Etat Bouton

// Lire Bouton
Uint8_t etat_bouton = *GPIOA_IDR & 0x01 ;
Exemple: solution
4 Imposer (ou lire) la valeur d’un bit (Pin)

GPIOC (Registre ODR)


3 3 . . .. 1 1 1 1 9 8 7 6 5 4 3 2 1 0
1 0 . . 3 2 1 0
Allumer Led:
pin 9 (ODR/GPIOC) = 1 0 0 . . .. . 0 0 0 0 0 0 0 0 0 0 0 0
1

Éteindre Led: 0 0 . . .. … 0 0 0 0 0 0 0 0 0 0 0 0
0
pin 9 (ODR/GPIOC) = 0

// allumer Led // éteindre Led


*GPIOC_BSRR= 0x01 << 9; *GPIOC_BRR = 0x01 << 9 ;
(0x200) (0x200)
Exemple: solution
#define RCC_APB2ENR (uint32_t*) 0x40021018 While (1) {

// Lire Bouton
#define GPIOC_CRH (uint32_t*) 0x40011004
Uint8_t etat_bouton = *GPIOA_IDR & 0x01;
#define GPIOC_BSRR (uint32_t*) 0x40011010
If (etat_bouton==0)
#define GPIOC_BRR (uint32_t*) 0x40011014
*GPIOC_BRR = 0x200;

else
#define GPIOA_CRL (uint32_t*) 0x40010800
*GPIOC_BSRR = 0x200;
#define GPIOA_IDR (uint32_t*) 0x40010800
}

Vous aimerez peut-être aussi