Vous êtes sur la page 1sur 25

MICROCONTROLEUR – LP SESAM :

Partie 1 – En route vers les périphériques

Version 2.2
Mise à jour sept. 2020
Introduction
Systèmes Composants
Contrôlés numériques
par des
Capteurs

Systèmes robotiques (ex : drone) Processus industriels (ex : convoyeur) Actionneurs CPU, Flash, RAM, Interfaces E/S...

→ interprétation de valeurs binaires (0 ou 1)


→ utilisation de FPGA, microcontrôleurs, microprocesseurs, automates, …
Ce cours développe le cas des microcontrôleurs pour les systèmes
industriels embarqués
microcontrôleur : CPU, Flash (=ROM), RAM, port d’ES, … dans un seul et même boîtier
microprocesseur : seulement le CPU, l’ensemble est implanté sur une carte-mère

2
Introduction

Carte Keil MCB1700 utilisée en TP


Une carte possédant :
un microcontrôleur RS 232
(ici LPC1768)
et différentes interfaces
• USB
• Ethernet écran
• CAN LCD couleur
(et tactile)
• RS 232
• Port E/S TOR
• …

3
Objectif du cours

Ce microcontrôleur dispose de nombreux périphériques : vous allez


apprendre dans ce module à utiliser des périphériques usuels en
Informatique Embarquée : GPIO, Timers, contrôleur IT, CAN/CNA…
Chaque cours adoptera une démarche qui vous permettra d’utiliser
n’importe quel microcontrôleur :
→ Principe général de fonctionnement du périphérique
→ Application au uC Cortex de la carte MCB1768

Nous présenterons aussi les différentes approches possibles : de


l'approche “registres” à l'utilisation de bibliothèques

4
Notre microcontrôleur…

Doc. NXP, LPC1768

Architecture :
• Cortex ARM-M3 (CPU)
• RAM/ROM
• Plein de périphériques internes
Dans ce module, vous allez apprendre à mettre en
œuvre certains de ces périphériques :
• Port E/S TOR
• Timers
• Contrôleur d'interruption
• CAN/CNA (en TNS)
• ...

5
Notre microcontrôleur…

… en version simplifiée, ouf ! périphériques

→ Le “cerveau” (CPU) échange des informations avec les modules


(mémoires ou périphériques)
→ Le CPU joue le rôle de chef d’orchestre : il décide avec qui il échange
des données
→ A un instant t, il est connecté à un seul de ces modules

6
Le processeur ARM cortex M3

• Le LPC1768 est un processeur qui traite des nombres entiers de 8,


16 ou 32 bits
• Le processeur est doté d’une UAL pour les calculs sur les entiers
mais ne possède pas de FPU (Floating Point Unit) pour les calculs sur
les flottants : il n’est pas capable de traiter les nombres réels (ou
flottants) de façon matérielle (mais il les traite de façon logicielle, cf
prochains cours)
• Rappels : en langage C – char : 8 bits (octet - byte)
– short : 16 bits (mot - word)
– int : 32 bits (long)
– float : 32 bits Nombres non
– double : 64 bits entiers

7
Le processeur ARM cortex M3

• Le processeur n’interprète pas directement le langage C, il a son


propre jeu d’instructions, qui peuvent être décrites en langage
assembleur (ASM)
• En mémoire, le programme est codé en binaire
• C’est le compilateur qui traduit le C en langage machine

Codes source C compilation codes ASM assemblage codes machine


LPC_GPIO2->FIODIR1 = 0x00; LDR R0, =GPIO2 00CC F0 4F 01 00
MOVS R4, #0x00 00D0 F2 C2 01 09
LPC_GPIO2→FIODIR0 = 0xFF; STRB R4, [R0, #FIODIR1]
LPC_GPIO2->FIODIR0 = 0x7C; MOVS 00D4 F4 4F 43 40
R4, #0xFF
... STRB R4, [R0, #FIODIR0] 00D8 44 19
00DA …

8
L’exécution d’un programme
Exécution d’un programme (en informatique embarquée)
Le programme est stocké en mémoire morte… pourquoi ?

A la mise sous tension :


- lecture dans la mémoire morte (de la Flash par le CPU)
du premier code de votre programme (début du main)

temps
- décodage et exécution interne au microcontrôleur

- lecture/écriture dans les interfaces

Ensuite, lecture du code suivant dans la mémoire morte ...


et ainsi de suite ...
9
Autour du CPU
• Le processeur doit discuter avec de la mémoire (RAM, flash) et des
périphériques (internes, mais parfois externes) : Timer, ports E/S, ...

• A chaque périphérique est associé une plage d'adresses, dans


laquelle il faut aller « sonner » pour discuter avec le périphérique

• le contrôle des périphériques se fait par le contrôle de registres


(petite mémoire) associés aux périphériques : chaque registre a une
adresse précise entrées
D3 D2 D1 D0
10

Un registre est
un ensemble de RAZ/ RAZ/ RAZ/ RAZ/

bascules D :
H Q3 Q2 Q1 Q0

Sortie « retenue »
Plan mémoire du LPC1768

• Le constructeur du microcontrôleur a découpé le plan mémoire


(ensemble de la mémoire accessible, ici 32 bits donc 4Go) en
différentes « zones »

• Certaines parties seront réservées pour les programmes (dans la


flash), d’autres pour stocker des variables statiques, …

• D’autres parties seront réservées pour les registres des différents


périphériques

11
Plan mémoire du LPC1768

Liaison CPU/Mémoire ? Et avec les périphériques ?


12
Liaison processeur - mémoire

Décodeur /CS
/CS

Flash
CPU Bus d’adresses RAM
Bus de contrôle R/W

Bus de données
Chip Select /CS : chaque périphérique peut être activé ou non pour se
connecter sur le bus de données
Si le Chip Select désactive un composant, ce composant se comporte
comme s’il n’existait pas
13
Liaison processeur - mémoire
Bus d’adresses Bus d’adresses
an-1
an-1
.
.
.
.
a4
a4
a3
a3
a2
a2
a1 RAM a1 ROM
a0
a0
R/W
Bus de
d7 d6 d5 d4 d3 d2 d1 d0 d7 d6 d5 d4 d3 d2 d1 d0
contrôle R/W

Bus de données Bus de données


RAM ROM
lecture et écriture possibles, Lecture seule possible :
choix avec le signal R/W pas de signal R/W
Dans notre µC, on utilisera surtout la Flash
EEPROM pour y stocker le programme:
èlecture ET écriture possible

14
Périphériques

• Les périphériques sont des modules capables d’effectuer des tâches


spécifiques sans utiliser en permanence les ressources du processeur

• Par exemple, un Timer une fois lancé nous permet de générer des
signaux PWM pendant que le processeur peut s’occuper d’autres tâches

• Le fonctionnement des périphériques s’appuie sur des registres

• Le processeur contrôle ces registres et y accède exactement comme


pour une mémoire RAM (lecture/écriture) : avec une adresse !

15
Périphériques

• Le processeur ne communique qu’avec des registres


• Il ne communique pas avec les bascules qui réalisent les fonctions
attendues (timers, E/S, …)
/CS
/CS
/CS Bidule
Décodeur /CS Timer
Flash
CPU RAM
Bus d’adresses

Bus de données

16
Périphériques

• Le processeur contrôle le contenu des registres en R/W


• Le périphérique lit et écrit dans ses registres suivant la demande du CPU

Décodeur /CS Circuits assurant les


fonctions du périphérique

CPU
Registres
Bus d’adresses

Bus de données

17
Mise en œuvre d’un périphérique

Initialisation = 3 étapes nécessaires avant d’utiliser un périphérique


Pour économiser de l’énergie, les périphériques ne sont pas
nécessairement activés (en particulier chez ARM)
Activer le périphérique
INITIALISATION

Une broche d'un microcontrôleur est généralement


Configurer le mode des reliée à différents périphériques (pourquoi?) : il faut choisir
broches (GPIO, Timer...) la liaison avec le périphérique qui nous intéresse

Configurer le périphérique

Certains registres ont un rôle de configuration du


périphérique
Utiliser le périphérique D'autres registres ont un rôle d’utilisation du périphérique

18
Mon premier périphérique: le GPIO

GPIO (General Purpose Input Output) = Port d’E/S Tout Ou Rien (TOR)
Décodeur
Bus
d'adresses /CS
Entrées

CPU Bus GPIO


de données
8bits

Sorties
Bus
de contrôle

19
Mon premier périphérique: le GPIO

Pour utiliser un GPIO d’un µC, on a généralement 2 registres importants à


utiliser :
→ un registre de direction : il permet de définir pour chaque broche si
c'est une entrée ou une sortie
On modifie souvent ce registre dans la partie d'initialisation du programme
(pas dans la boucle infinie)
→ un registre de données : il permet de venir chercher les valeurs du port
d'entrée, ou d'écrire sur le port de sortie
On modifie souvent ce registre dans la boucle infinie du programme

Pour le LPC1768 : 5 GPIOs nommés GPIO0 à GPIO4


Chaque GPIO est découpé en 4 ports E/S de 8 bits

20
Les GPIO du LPC1768

Pour notre µC utilisé en TP, on a pour chaque GPIO :

FIODIR (32 bits [31:0])

FIODIR3 (8 bits [31:24]) FIODIR2 (8 bits [23:16]) FIODIR1 (8 bits [15:8]) FIODIR0 (8 bits [7:0])

FIODIR indique la direction des 8 broches : 0 = Entrée ou 1 = Sortie

FIOPIN (32 bits [31:0])

FIOPIN3 (8 bits [31:24]) FIOPIN2 (8 bits [23:16]) FIOPIN1 (8 bits [15:8]) FIOPIN0 (8 bits [7:0])

FIOPIN permet de lire ou écrire sur les 8 broches du port 8 bits


21
Les GPIO du LPC1768
Utilisation du GPIO :
Pour économiser de l’énergie, les périphériques ne sont pas
nécessairement activés (en particulier chez ARM)
Activer le périphérique
→ on active le GPIO
INITIALISATION

Une broche d'un microcontrôleur est généralement


Configurer le mode des reliée à différents périphériques (pourquoi?) : il faut choisir
broches (GPIO, Timer...) la liaison avec le périphérique qui nous intéresse

→ on connecte
Configurer le périphérique les P0.x (GPIO0)
Certains registres ont un rôle de configuration du
périphérique → réglage de FIODIR
Utiliser le périphérique D'autres registres ont un rôle d’utilisation du périphérique
→ réglage de FIOPIN

22
Registres du GPIO
• Grâce aux adresses de ces registres, on est capable de lire et d’écrire
dans ces registres ( par ex. à l’aide d’un pointeur en langage C)

La documentation (digérée) de NXP nous indique que pour le GPIO 0 :

@ de FIODIR0

@ de FIOPIN0

23
Utilisation du GPIO

• Un fichier LPC17xx.h à charger dans Keil µVision permet d'accéder aux


registres directement par leurs noms… sans connaître les adresses, ouf !

Lire les 8 broches de poids faible du GPIO 0 (le uC en dispose de 5) :


Suivant les bits à considérer
char valeur;
LPC_GPIO0->FIODIR0 = 0x00; // P0.0 à P0.7 en entrées
valeur = LPC_GPIO0->FIOPIN0; // lecture du port 8bits

Le compilateur interprète ce programme et “retrouve” tout seul les


adresses des registres → l’écriture est bien plus simple et claire !

Retenez là bien, elle nous suivra pendant tout le module !

24
Autre exemple

Forcer à 1 l’état des sorties P0.07 à P0.04 et forcer à 0 l’état des sorties P0.03 à
P0.00

LPC_GPIO0->FIODIR0 = 0xFF; //P0.07 à P0.00 configurés en sortie


LPC_GPIO0->FIOPIN0 = 0xF0; //écriture de l’état de GPIO0 bits [7:0]

Faire une boucle recopiant à l'infini les entrées P2.0 à P2.7 sur les sorties P3.16
à P3.23
LPC_GPIO2->FIODIR0 = 0x00; //P2.0 à P2.7 configurés en entrées
LPC_GPIO3->FIODIR2 = 0xFF; //P3.16 à P3.23 configurés en sorties

while (1)
{
LPC_GPIO3->FIOPIN2 = LPC_GPIO2->FIOPIN0;
}

25

Vous aimerez peut-être aussi