Vous êtes sur la page 1sur 25

Chapitre II

Architecture des microcontrôleurs


STM32F407

2
I. Micro-processeur Cortex-M
I.1. Architecture
Mémoire
adresses Flash
Données

: :
0x300C 5
0x3008 2
0x3000 : D-bus
: Retrouver ou
: Cortex-M
:
: S-bus Périphériques
: : processor core
Envoyer des
: E0835001 Données
I-bus
0x2008 E5923000
0x2004 E5901000
0x2000 :
:
Instructions

3
Pré-exécution du programme Exécution du programme
I. Micro-processeur Cortex-M
I.2. Intégration dans un microcontrôleur STM32F407

ROM

4
II. Le microcontrôleur STM32F407

package

Die : puce

Bond wire

Pins
II. Le microcontrôleur
STM32F407
Périphériques accessibles via les
bus AHB et APB.
Horloge

• AHB (Advanced High


GPIO L
performance Bus)
• APB (Advanced Peripheral Bus)

Utilisés dans tout système basé


sur microprocesseur ARM TIMER

TIMER

DAC
ADC
6
III. Interface entre μP et périphérique
Périphérique I-bus

Registre
Cortex-M paramétrage
processor
Registre

mécanisme
Core
donnée
AHB/APB
Registre
synchronisation

Registre pour
autres fcts

• Le μP configure les registres du périphérique suivant le besoin (I/O, données, clock


frequency, …).
• Chaque registre possède une adresse mémoire appelé adresse offset
• Adresse registre = adresse de base + adresse offset 7
IV. Plage mémoire
Plage d’adresses Interfaces Périphériques BUS
(memory map)
0xA000 0000 - 0xA000 0FFF Autres périphériques AHB3
0x5000 0000 - 0X5006 0BFF Autres périphériques AHB2
La mémoire programme, la 0x4002 3C00 - 0x4002 4000
Autres périphériques
mémoire donnée, les
registres des périphériques 0x4002 3800 - 0x4002 3BFF RCC AHB1
tous sont organisées dans un 0x4002 3000 - 0x4002 33FF Autre périphérique
même espace d’adressage. 0x4002 0000 - 0x4002 23FF Tous les GPIO’s
0x4001 4000 - 0x4001 4BFF TIM9, 10 et 11

0x4001 2C00 - 0x4001 3FFF Autres périphériques


Adresse de base: APB2
0x4001 2000 - 0x4001 23FF ADC1, 2 et 3
Utilisée dans la programmation
0x4001 1000 - 0x4001 17FF USART 1 et 6
du périphérique.
0x4001 0000 - 0x4001 07FF TIM1 et 8
0x4000 7400 - 0x4000 77FF DAC
• L’adresse offset d’un registre
est ajouté à l’adresse de base. 0x4000 2800 - 0x4000 73FF USART, SPI, I2C , CAN,
RTC et autres APB1
• μP utilise l’adresse de base + 0x4000 1800 - 0x4000 23FF TIM12, 13 et 14
offset pour accéder au registre 0x4000 0000 - 0x4000 17FF TIM2 jusqu’à 7
d’un périphérique 0x2000 0000 - 0x3FFF FFFF SRAM AHB2,
8
0x0000 0000 - 0x1FFF FFFF Mémoire Flash D, I
Chapitre III
Les périphériques
Horloge et GPIO
STM32F407

9
I. L’Horloge (Clock)

Horloge interne

Horloge externe

• Tous les périphériques ne fonctionnent que s’ils sont connectés à l’horloge.

• Horloge interne utilise un circuit RLC générant un signal oscillant périodique.

• Horloge externe utilisant un quartz 10


I. L’Horloge (Clock)
I.1. Diagramme

11
Clock tree
I. L’Horloge (Clock)
I. 2. Registres de control et de paramétrage
• Clock configuration register (RCC_CFGR) (adress offset: 0x08) (reset value: 0x00000000)
unsigned int *RCC_CFGR = (unsigned int *) (adresse de base+ 0x08); // code Initialisation du pointeur

1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
B 8 0 0

RCC_CFGR[4:7] RCC_CFGR[10:12
]
RCC_CFGR[4:7]

RCC_CFGR[13:14
]

RCC_CFGR[0:1]

RCC_CFGR[10:12
]RCC_CFGR[13:14
]

Quel est le masque (mot binaire dans le registre ) correspondant à la figure? 12


* RCC_CFGR = * RCC_CFGR & 0x????????
0x0000B800; ; // code chargement du masque
I. L’Horloge (Clock)
I. 2. Registres de control et de paramétrage
• Clock configuration register (RCC_CFGR) (adress offset: 0x08) (reset value: 0x00000000)

• *RCC_CFGR = * RCC_CFGR & 0x0000B800;

Initialement le registre
contient le mot suivant 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
&
|
1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
= 10 0 10 10 10 0 0 0 0 0 0 0 0 0 0 0

• *RCC_CFGR = * RCC_CFGR | 0x0000B800;

13
I. L’Horloge (Clock)
I. 2. Registres de control et de paramétrage
• Clock configuration register (RCC_CFGR) (adress offset: 0x08) (reset value: 0x00000000)

• Supposant qu’on ne connait pas la valeur initiale dans le registre, on applique la ligne de commande:

*RCC_CFGR = * RCC_CFGR | 0x0000B80C;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
|
1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0

= 1 ? 1 1 1 ? ? ? ? ? ? ? 1 1 ? ?
&
1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0
= 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0
• On ajoute alors la ligne de commande suivante:
14
*RCC_CFGR = * RCC_CFGR & 0x0000B80C;//Il faut 2 lignes de commande pour charger le masque.
I. L’Horloge (Clock)
I. 2. Registres de control et de paramétrage
• Peripheral clock register (RCC_AHB1ENR) (adress offset: 0x30) (reset value: 0x00100000)
Rôle: connecter les périphériques au signal d’horloge.

unsigned int *RCC_AHB1ENR = (unsigned int *) (adresse de base+ 0x30); // Initialisation du pointeur

0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 8

Quel est le masque permettant de connecter le signal d’horloge au port D? ;

* RCC_AHB1ENR = * RCC_AHB1ENR| 0x????????


0x0008 ; ; // ha // half word access

* RCC_AHB1ENR = * RCC_AHB1ENR& 0x????????


0x0008 ; ; // half word access

Remarque: On peut modifier une partie du masque par accès d’un demi-mot ou même par octet.
15
II. General Purpose Input Output (GPIO)

GPIO

• 9 ports A, B, C, …, I.

• Chaque port possède 16 pins I/O sauf le port I qui possède 12.

• Possibilité de connexion avec d’autres périphériques : ADC, TIMER, UART, …. 16


II. General Purpose Input Output (GPIO)
II.1. Architecture et registres (x = A..I)
GPIOx_MODER: sélection du mode
(Input, Output, Analog or Alternate fonction )

GPIOx_IDR GPIOx_PUPDR: sélection pull up, pull down, no PULL

GPIOx_ODR
GPIOx_OTYPER: sélection Push pull ou open drain
• Push pull: 0 binaire active le N-MOS et 1 binaire active le P-MOS.
• Open drain: 0 active le N-MOS et 1 le désactive, P-MOS est 17
toujours désactivé
II. General Purpose Input Output (GPIO)
II.1. Architecture et registres
• GPIO port output speed register (GPIOx_OSPEEDR) (x = A..I)

• GPIO port mode register (GPIOx_MODER) (x = A..I)

18
II. General Purpose Input Output (GPIO)
II.1. Architecture et registres
• GPIO port output type register (GPIOx_OTYPER) (x = A..I)

VDD VDD
1
0 0
1 1
0 0
M

1 1
0 0
Vss
Push pull Open Drain

19
II. General Purpose Input Output (GPIO)
II.1. Architecture et registres
• GPIO port pull-up/pull-down register (GPIOx_PUPDR) (x = A..I)

Pull-up Pull-down

Vers μC Vers μC 0
1

Rôle : en mode input, sélection d’une valeur à vide quand la pin n’est pas connecté 20
II. General Purpose Input Output (GPIO)
II.1. Architecture et registres
• GPIO port output data register (GPIOx_ODR) (x = A..I)

• GPIO port mode register (GPIOx_IDR) (x = A..I)


II. General Purpose Input Output (GPIO)
II.2. Exemple d’application: Mise à 1 de PD12
• On se propose de mettre au niveau haut le pin 12 du port D, on
supposera que la programmation de RCC_CFGR a déjà été réalisé.
1) Quelle sont les périphériques concernés par cette application.
2) Quelle sont les registres concernés par cette application.
3) Affectez les adresses de chaque un de ces registres à des
pointeurs.
4) Quelle sont les masques de chaque registre permettant de
réaliser l’application.
5) Donnez les lignes de commandes permettant d’exécuter
l’application.
6) Donnez les lignes de commandes permettant de mettre PD12 au
niveau bas.
7) Donnez le programme permettant de générer un signal carré sur
PD12. 22
II. General Purpose Input Output (GPIO)
II.3. Exemple d’application: Lecture d’un signal sur PA0
• On se propose de lire la valeur d’un signal binaire connecté au pin
0 du port A, on supposera que la programmation de RCC_CFGR
ainsi que l’initialisation de PD12 ont déjà été effectuées.

1) Quelle sont les registres concernés par cette application.


2) Affectez les adresses de chaque un de ces registres à des
pointeurs.
3) Quelle sont les masques de chaque registre permettant de
réaliser l’application.
4) Donnez le programme permettant de mettre PD12 au niveau
haut lorsqu’on détecte un signal de niveau haut sur PA0.

23
1) Donnez le programme permettant de mettre PD12 au niveau haut lorsqu’on détecte
un signal de niveau haut sur PA0.

PA 0
1
0
micro
PD12 1
0
Donnez le programme permettant de mettre PD12 au niveau haut lorsqu’on détecte un signal de niveau haut sur
PA0.

unsigned int *……….= (unsigned int *) (…….. + …….);


unsigned int *………….= (unsigned int *) (……… + ………);
unsigned int *……….= (unsigned int *) (………… + ………..);
unsigned int *………..= (unsigned int *) (……….+ …………); adres
sage
int main()
{

initia
While(1)
lisati
{
on
else
}}

appli
catio
n

Vous aimerez peut-être aussi