Vous êtes sur la page 1sur 37

Introduction :

Interfaces d’Entrées/Sorties

1
Contenu:

• Architecture d’un système à Processeur.

• SOCs & Microcontrôleurs.

• Interfaçage Processeur – Mémoires.

• Interfaçage Processeur - Interface d’E/S

• Accès aux registres des Interfaces d’E/S.

• Exemples: Commande Leds / Afficheur 7 segments.

2
Introduction
Un “Système à processeur” (exple: PC) possède l’architecture suivante:

Mémoire Program Memory


(SRAM) (Flash, Eeprom, Rom)

Processeur BUS

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

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

GPIO (General Purpose Input Output) « Periph Interfaces »


Introduction
Les systèmes embarqués posent des contraintes au niveau:
• Taille.
• Poids.
• Consommation.
Regrouper les composants au niveau d’un seul circuit intégré

qq 100 kBytes  qq MBytes

qq 10 MHz  qq 100 MHz

On parle de SOC (System On Chip)


« Système sur puce »
Introduction
On distingue principalement deux catégories de SOCs:

• SP-SOC: Single Purpose SOC. (« SOC » tout court)


Les composants (Interfaces de périphériques)
sont choisis en fonction de l’application ciblée.

• GP-SOC: General Purpose SOC.


Un grand nombre d’interfaces de périphériques
sont disponibles et peuvent supporter plusieurs types
d’applications
Introduction
SP-SOC: STB de ST-Microelectronics: STi5518 OMEGA
Conçu pour les récepteurs satellite numériques.

les interfaces sont


responsables pour:
 L’encodage numérique.
 Le décodage vidéo/
audio.
 L ’accès au Flash /
Disque dur / carte à puce /
Télécommande / moteur.

Processeur
(80 Mhz)
Introduction
Les microcontrôleurs (µc): Des SOCs à usage général

Mémoire Mémoire programme


(RAM) (Flash, Eeprom, Rom)

Processeur BUS

Entrées /Sorties
Ces périphériques sont ajoutés
Timer(s)
Parallèles
Périphériques selon l’application ciblée:
Convertisseur(s) Communication additionnels On trouve:
A/N & N/A série  Périph. Ethernet pour les
applications réseaux.
 Périph. CAN pour les application
Ces périphériques qui se Automobiles.
trouvent pratiquement dans  Périph PWM pour les application
tous µc en nombres de commande de moteurs.
différents.
Introduction
La programmation d’un système embarqué :

• Une partie traitement (algorithmes basés sur des conditions


+ opérations arithmétiques, ) : programmation standard

• Une partie « Accès aux Interfaces de Périphériques » afin


de communiquer avec l’extérieur.
INTRODUCTION

Dans un système à processeur, Le microprocesseur est relié aux autres


composants (Mémoire, Interfaces d’Entrées/Sorties (Série, USB, Réseau, etc.)par:
• Bus de contrôle unidirectionnel (μp : transportant les signaux de contrôle
(Read (Lecture) et Write (écriture) indiquant le type d’opération à effectuer.

• Bus d’adresses unidirectionnel (μ p  ): transportant l’adresse dont


le contenu doit être lu ou modifié.
• Bus de données bidirectionnel : transportant les données lues
(des composants vers le μ p) ou écrites (du μ p vers les composants).

Bus de contrôle

Bus d’adresses

Interface Interface Interface Interface


Microprocesseur Mémoire
série parallèle USB …..

Bus de données
Les mémoires

CS
AN-1
Une mémoire est caractérisée par : AN-2
. Mémoire
• N lignes d’adresses: AN-1 AN-2 …..A0 .
A0
• M lignes de données DM-1DM-2……D0

• Des lignes de contrôle (Lecture ‘RD’ et écriture’ WR’).


• Une ligne de validation qui permet d’activer DM-1 DM-2……D0
ou désactiver la mémoire (notée CS :Chip select ou
CE: Chip Enable).

La mémoire contient 2N mots et occupe un espace de 2N adresses


• Commençant par l’adresse 0 …jusqu’à 2N-1.
• Chaque mot (donc adresse) représentant un registre de M bits (8 généralement)
Les mémoires

Une mémoire ayant:


- 3 lignes d’adresses : A2A1A0.
- 4 ligne de données : D3D2D1D0.

Adresse Contenu
A2 A1 A0 D3 D2 D1 D0
Cette mémoire contient: 1 1 1 (07) 1 1 0 1
1 1 0 (06) 1 0 0 1
A2
• 23 = 8 mots occupant 8 adresses : [0..7]. 1 0 1 (05) 0 1 0 0
A1
A0 1 0 0 (04) 1 1 0 0
• Chaque mot (adresse) ayant une taille
0 1 1 (03) 0 0 0 0
de 4 bits.
0 1 0 (02) 1 0 0 0
0 0 1 (01) 0 1 1 0
0 0 0 (00) 1 1 1 0

D3D2D1D0
Les mémoires

Pour une lecture à partir de la mémoire du mot ayant l’adresse 06 = 110:

1) Le µp active le signal READ (lecture).


2) Le µp émet l’adresse du mot à lire .
3) La mémoire émet le contenu de l’adresse 06
(110) sur le bus de données vers le µp.
Adresse Contenu
Microprocesseur A2 A1 A0 D3 D2 D1 D0
1 RD 1 1 1 (07) 1 1 0 1
READ
1 1 0 (06) 1 00 00 11
WRITE WR
1 0 1 (05) 0 1 0 0
1 A2 1 0 0 (04) 1 1 0 0
A2
1 A1 0 1 1 (03) 0 0 0 0
A1
0 1 0 (02) 1 0 0 0
0 A0
A0 0 0 1 (01) 0 1 1 0
0 0 0 (00) 1 1 1 0
D3 D2 D1 D0
D3 D2 D1 D0
Bus de données
Les mémoires

Pour une écriture de la donnée 1111dans la mémoire du mot ayant l’adresse 06 = 110:

1) Le µp active le signal WRITE (Écriture).


2) Le µp émet l’adresse du mot à modifier 110 = 06.
3) La µp émet la donnée (1111) à écrire dans sur
le bus de données vers la mémoire.
Adresse Contenu
Microprocesseur A2 A1 A0 D3 D2 D1 D0
RD 1 1 1 (07) 1 1 0 1
READ
1 1 0 (06) 1 0 0 1
WRITE
1 WR
1 0 1 (05) 0 1 0 0
1 A2 1 0 0 (04) 1 1 0 0
A2
1 A1 0 1 1 (03) 0 0 0 0
A1
0 1 0 (02) 1 0 0 0
0 A0
1 1 1 1 A0 0 0 1 (01) 0 1 1 0
0 0 0 (00) 1 1 1 0
D3 D2 D1 D0
D3 D2 D1 D0
Bus de données
Interfaces d’Entrées/Sorties (1)

Une interface E/S (Entrées/Sorties) est le moyen pour le microprocesseur de


communiquer avec le monde externe (Périphériques).
Relativement à un microprocesseur, une interface E/S est un circuit considéré comme
étant une mémoire dont le contenu peut être lu (READ) et modifié (WRITE):
• Ayant N lignes d’adresses.
• Ayant M lignes de données?
• contenant 2N registres (mots de M bits, avec M=8 généralement)).
• Occupant un espace de 2N adresses: 0..2N-1.

Microprocesseur
RD
READ Circuit d’interface
WR E/S
WRITE
Registre 2N-1
AN-1
AN-1 ……..
..
. Registre 1
. A0
A0 Registre 0

DM DM-1… D0
DM-1 …………… D0
Bus de données
Interfaces d’Entrées/Sorties (2) : Connexion externe

Vue de l’extérieur, une interface d’entrée/Sortie est un connecteur contenant un


certain nombre de pins (broches).
Chaque bit de l’un des registres du
circuit d’interface étant connecté à
un pin (broche) du connecteur.
Circuit d’interface
E/S

RD

b7 b6 b5 b4 b3 b2 b1 b0
WR
Registre i

AN-1
.. b7 b6 b5 b4 b3 b2 b1 b0

A0 Registre i-1

DM-1 …………… D0

Circuit d’interface
E/S (Interne) Interface E/S vu de l’extérieur
Interfaces d’Entrées/Sorties (3) : Sortie

Un registre de l’interface d’E/S peut être utilisé en SORTIE pour une communication du
µp vers l’extérieur  Écriture dans le registre
La valeur de chacun des bits de la donnée écrite dans le registre est transformée:
• en un niveau de tension(V+ = 5V) au niveau du pin si le bit = ‘1’.

• en un niveau de tension(V- = 0V) au niveau du pin si le bit = ‘0’.

Circuit d’interface
E/S 5V
μP
RD
READ
WR
WRITE
0V
AN-1 ‘1’
b b b b b b
‘0’
b b
AN-1 .. 7 6 5 4 3 2 1 0

.
1 0 1 1 0 0 1 0 Registre E/S
. A0
A0

D7 D6… ..D0
D7 …. …………… D0
Bus de données
16
Interfaces d’Entrées/Sorties (4) : Entrée

Un registre de l’interface d’E/S peut être utilisé en ENTREE (communication de l’extérieur vers le µp):
L’application d’un niveau de tension quelconque sur les pins du connecteur se traduit par:
• Apparition d’un ‘ 0 ’ au niveau du bit si on applique au pin une tension de 0V.
• Apparition d’un ‘ 1 ’ au niveau du bit si on applique au pin une tension de +5V.

 Le µp effectue une opération de Lecture depuis le registre

Circuit d’interface
E/S 0V
μP
RD
READ
WR
WRITE

AN-1 +5V
b b b b b b b b
AN-1 .. 7 6 5 4 3 2 1 0

. ‘0‘ ‘1‘
0 X X X X X X 1 . A0 Registre E/S
A0

D7 D6… ..D0
D7 …. …………… D0

Bus de données
Interfaces d’Entrées/Sorties (5) : Programmation en ‘C’

La programmation des interfaces d’E/S en langage ‘C’:

• Pour l’accès en écriture à un registre d’E/S :

#define Reg_name (type_data*) adr;

// Déclaration d’un registre Reg_name de taille type_data et occupant l’adresse adr

*Reg_name = valeur;

// Ecrire une valeur dans le registre Reg_name.


Interfaces d’Entrées/Sorties (5) : Programmation en ‘C’

La programmation des interfaces d’E/S en langage ‘C’:

• Pour l’accès en Lecture à un registre d’E/S :

#define Reg_name (type_data*) adr;

// Déclaration d’un registre Reg_name de taille type_data et occupant l’adresse adr

Variable = *Reg_name ;

// Lire le contenu de l’emplacement du registre Reg_name.


Application commande Leds (1)

Exemple1: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant un registre 8 bits
(Port A) occupant l’ adresse 300 Hexa et connecté à 8 Diodes Leds (voir figure).
Ces Leds s’allument quand on leur applique V=+5V et s’éteignent quand on leur applique V = 0V.
 Écrire un programme en ‘C’ qui permet de faire clignoter continuellement les 8 Leds.
(ne pas tenir compte de la configuration des pins du port)

8255
PA7 Led7
.
μP RD PA6
.
READ PA5 .
WR .
PA4
WRITE .
PA3
.
A1 PA2 .
A1
.
A0 PA1
.
A0
PA0 Led0
D7 D6… ..D0
D7 …. …………… D0
Bus de données
Application commande Leds (2) : solution

Commençons par modéliser le Fonctionnement du système par un diagramme:

Appliquer des ‘1’ à toutes


Les Leds pour les allumer.
PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
Allumer les
Leds 1 1 1 1 1 1 1 1
= FF Hexa
F F

Appliquer des ‘0’ à toutes


Allumer les Les Leds pour les éteindre.
Leds PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0

0 0 0 0 0 0 1 0
0 0
= 00 Hexa
Application commande Leds (3) : solution

Le programme en ‘C’ :

#define PortA (uint8_t*) 0x300;

// Répéter continuellement
While (1)
{
8255
// Allumer les Leds 1
PA7 Led7
.
*PortA = 0x0FF; μP RD 1
PA6
.
READ 1
PA5 .
// Éteindre les Leds WR .
1
PA4
.
*portA = 0x00; WRITE
1
PA3 .
} A1 .
A1 1
PA2
.
A0 1
PA1
.
A0
1
PA0 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (4) : solution

Le programme en ‘C’ :

#define PortA (uint8_t*) 0x300

// Répéter continuellement
While (1)
{
8255
// Allumer les Leds PA7 1 Led7
*PortA = 0x0FF; .
μP RD PA6 1 .
READ PA5 1 .
// Éteindre les Leds WR .
*portA = 0x00;
PA4 1
WRITE .
PA3 1 .
} A1 PA2 1 .
A1
.
A0 PA1 1 .
A0
PA0
1 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (5) : solution

#define PortA (uint8_t*) 0x300;

// Répéter continuellement
While (1)
{
// Allumer les Leds
*PortA = 0x0FF; 8255
0
PA7 1 Led7
.
// Éteindre les Leds μP RD 0
PA6 1 .
*portA = 0x00; READ 0
PA5 1 .
WR .
} 0
PA4 1
WRITE .
0
PA3 1 .
A1 1 .
A1 0
PA2
.
A0 0
PA1 1 .
A0
0
PA0
1 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (6) : solution

#define PortA (uint8_t*) 0x300;

// Répéter continuellement
While (1)
{
8255
// Allumer les Leds PA7 0 Led7
*PortA = 0x0FF; 0 .
μP RD PA6
.
// Éteindre les Leds READ PA5 0 .
WR .
*portA = 0x00; PA4 0
WRITE .
PA3 0 .
} A1
A1 PA2 0 .
.
A0 PA1 0 .
A0
PA0
0 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application Afficheur ‘7’ segments (1)

Exemple2: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant un registre 8 bits
(noté port C) occupant l’ adresses 30E Hexa et connecté à un afficheur 7 segments (voir figure).

Chacun des segments s’allume quand on lui applique +5V et s’éteint quand on lui applique 0V.
 De telle sorte à pouvoir afficher n’importe quel nombre entre 0 et 9.
 Écrire un programme en ‘C’ qui permet d’afficher ‘3’. (ne pas tenir compte de la configuration)

8255
PC7 a a
b
μP RD PC6

READ PC5 c f b
WR
PC4 d g
WRITE PC3 e e c
A1 PC2
A1 f
A0 PC1
g d h
A0
PC0
h
D7 D6… ..D0
D7 …. …………… D0
Bus de données
Application Afficheur ‘7’ segments (2) : solution

Commençons par modéliser le fonctionnement


du système par un diagramme:

PC7 a a
PC6 b Mettre à ‘1’ les segments
devant être allumés
PC5 c f b
PC4 d g

PC3 e e c Afficher ‘3’ PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
 Allumer les (a) (b) (c) (d) (e) (f) (g) (h)
PC2 f d h Segments: 1 1 1 1 0 0 1 0
PC1 g
a, b, c, d et g F 2
= F2 Hexa
PC0
h
Application Afficheur ‘7’ segments (3) : solution

#define PortC (uint8_t*) 0x30E;

// Allumer les segments a,b,c,d & g


*PortC = 0x0F2;
8255
1
PC7 a a
RD 1
PC6 b
1
PC5 c f b
WR
1
PC4 d g
0
PC3 e e c
A1 0
PC2 f
A0 1
PC1
g d h
0
PC0
h

D7 …. …………… D0
Application Afficheur ‘7’ segments (4) : solution

#define PortC (uint8_t*) 0x30E;

// Allumer les segments a,b,c,d & g


*PortC = 0x0F2;
8255
PC7 1a a
RD PC6 1b
PC5 1c f b
WR
PC4 1d g
PC3 0e e c
A1 PC2 0f
A0 PC1 1g d h
PC0 0h

D7 …. …………… D0
Application Boutons Poussoir + Leds (1)
Exemple3: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant deux registres 8
bits: Port A occupant l’ adresse 0x300 et le Port C occupant l’adresse 0x30E
Le port A à 2 Diodes Leds et le port C à deux boutons poussoir (voir figure).
 Écrire un programme en ‘C’ qui permet de Tester l’état des deux boutons poussoirs BP0
et BP1 et: - allumer la Led0 si le bouton BP0 est appuyé.
- allumer la Led1 si le bouton BP1 est appuyé.
- éteindre les 2 Leds sinon.
(ne pas tenir compte de la configuration des pins du port)

8255
PA7

μP RD …

READ PA1 Led1


WR Led0
PA0
WRITE
A1 PC7
A1 …
A0 BP1 Un bouton poussoir génère
A0 PC1
0V au repos et +5V quand
PC0
D7 D6… ..D0 BP0 il est appuyé
D7 …. …………… D0 30
Bus de données Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (2): solution

Commençons par modéliser le


Fonctionnement du système par
un diagramme:

Configurer
l’interface 8255

Lire Etat BPs


 Lire Port C
BP1 BP0
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
Appui BP0 Sinon Appui BP0 0 1 = 01 Hexa
Appui BP1 1 0 = 02 hexa
Appui BP1

Led1 Led0
Allumer Allumer Éteindre PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
Led 0 Led 1 Leds Allumer Led0 0 1 = 01 H
Allumer Led1 1 0 = 02 H
Éteindre Leds 0 0 = 00 H
31
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (2): solution

Le programme en ‘C’:
// Déclaration des pointeurs
#define PortA (uint8_t*) 0x300;
#define PortC (uint8_t*) 0x30E;
Lire Port C
(30Eh)
Uint8_t etat_bouton; // variable 8 bits

// Lire État des Boutons Poussoir (Port C)


etat_bouton = * portC ;
Port C = 01 h Sinon

// Test et traitement
Port C = 02 h
switch (etat_bouton)
{
case 0x01: *portA = 0x01;
Port A (300h) Port A (300h) Port A (300h) case 0x02: *portA = 0x02);
= 01 h = 02 h = 00 h default : *portA = 0x00);
}

32
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (3): Poblème lecture d’un bit

Dans la solution proposée, on a testé juste les


Lire Port C
(30Eh)
valeurs 01 et 02 H en supposant que les autres
Valeurs sont à 0.

Port C = 01 h Sinon
?
Port C = 02 h
Ceci n’est pas vrai car les autres
entrées du port C peuvent prendre des
valeurs aléatoires inconnues

PC7

PC6
etat_bouton: à tester
PC5 ?
PC4
donnée b7 b6 b5 b4 b3 b2 b1 b0
PC3
Bits à masquer Bits à
AND garder
PC2

PC1 BP1
variable 0 0 0 0 0 0 1 1 = 03h
PC0
BP0

Résultat 0 0 0 0 0 0 b1 b0
33
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (4): Solution corrigée

La solution est de forcer les valeurs des bits non utilisés à ‘0’
 On parle d’opération de masquage

Il s’agit d’effectuer une opération de ET logique entre la donnée à tester


et une variable binaire dont la valeur est déterminée comme suit:
- 0 pour chaque bit occupant la même position d’un bit à masquer.
- 1 pour les autres bits

Dans notre exemple, on s’intéresse aux bits b1


et b0 et on veut masquer les autres bits b7..b2

etat_bouton: à tester
// Lire État des Boutons Poussoir
(Port C)
donnée b7 b6 b5 b4 b3 b2 b1 b0
etat_bouton = *PortC AND 0x03;
Bits à masquer Bits à
AND garder

variable 0 0 0 0 0 0 1 1 = 03h

Résultat 0 0 0 0 0 0 b1 b0
34
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (1)
Exemple3: Le port A à 2 Diodes Leds et le port C à deux
Le programme en ‘C’:
boutons poussoir // Déclaration des pointeurs
Tester l’état des deux boutons poussoirs BP0 et BP1 et: #define PortA (uint8_t*) 0x300;
#define PortC (uint8_t*) 0x30E;

- allumer la Led0 si le bouton BP0 est appuyé. Uint8_t etat_bouton; // variable 8 bits

- allumer la Led1 si le bouton BP1 est appuyé.


- éteindre les 2 Leds sinon.
// Lire État des Boutons Poussoir (Port C)

etat_bouton = * portC & 0x03;

8255 // Test et traitement


PA7 switch (etat_bouton)
{
μP RD …
case 0x01: *portA = 0x01; //allumer led0
READ PA1 Led1
WR Led0 case 0x02: *portA = 0x02; //allumer led1
PA0
WRITE
A1 PC7 default : *portA = 0x00;//éteindre 2leds
A1 … }
A0 BP1
A0 PC1

PC0
D7 D6… ..D0 BP0
D7 …. …………… D0 35
Bus de données Damergi Emir - INSAT 2018/19
Application Boutons Poussoir + Leds (5): Poblème Imposer valeurs de bits

Dans la solution proposée, on a allumé resp. les 0


leds 1 et 2 en utilisant les valeurs 01 (bit 0=1) et 02 0
0
(Bit 1 = 1)
0
On a ainsi forcé tous les autres bits (2 ..7) à 0 !! 0
(qui sont probablement utilisés pour contrôler d’autres 0
périphs )

36
Embedded Training
Application Boutons Poussoir + Leds (6): Solution = masquage logique

• Lecture du contenu du registre (dont le contenu est à

modifier)

• Imposer les valeurs ‘0’ et ‘1’ dans des positions précises.

 Masquage logique

• Ecrire la nouvelle valeur dans la registre.

37
Damergi Emir - INSAT 2018/19

Vous aimerez peut-être aussi