0% ont trouvé ce document utile (0 vote)
31 vues6 pages

Ie S2 Gpio

Ce document présente un travail pratique pour les étudiants en Génie Électrique, axé sur l'utilisation des périphériques via un microcontrôleur. Les objectifs incluent la maîtrise de l'adressage des périphériques, la lecture/écriture sur des ports E/S, et le développement d'un jeu basé sur Zelda. Les étudiants doivent également rédiger un compte rendu et valider leurs compétences à la fin de la séance.

Transféré par

skiideoffi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
31 vues6 pages

Ie S2 Gpio

Ce document présente un travail pratique pour les étudiants en Génie Électrique, axé sur l'utilisation des périphériques via un microcontrôleur. Les objectifs incluent la maîtrise de l'adressage des périphériques, la lecture/écriture sur des ports E/S, et le développement d'un jeu basé sur Zelda. Les étudiants doivent également rédiger un compte rendu et valider leurs compétences à la fin de la séance.

Transféré par

skiideoffi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

DUT Génie Électrique – Département GEII2

IE – S2
Travaux pratiques n°4
The Legend of Drivers:
A Link to the Peripheral
Auteur(s) : Team IE
Date – Version : Mars 2025 – V.1
Référence : IE S2– Accès aux périphériques et fonctions

Les objectifs listés ci-dessous présentent ce qui doit savoir être fait en sortant de ce TP pour pouvoir
traiter les TP qui suivront. A la fin de cette séance, mettre des « OK » ou « non OK » dans la
colonne de droite du tableau. Si un objectif n'est pas atteint, il faudra mettre tout en œuvre pour
s'approprier la compétence correspondante avant le prochain TP.

LISTE DES OBJECTIFS


Validation en fin de TP ?
Savoir adresser un périphérique à l'aide d'un pointeur
Savoir lire et écrire sur un port E/S TOR
Maîtriser l'écriture de code utilisant les noms de registres
Savoir écrire une fonction avec des arguments en entrée et/ou en sortie
Savoir créer et utiliser une bibliothèque de fonctions personnalisée
Jouer à Zelda

LOGICIEL ET MATÉRIEL UTILISÉS


Software : Logiciel de développement KEIL uVision 5
Hardware : Carte KEIL « MCB1700 » avec bloc adaptateur « ULINK 2 »
CONSIGNES
La partie PREPARATION est à traiter avant la séance de TP. Elle sera évaluée par le professeur
avant de commencer le TP.
Un compte rendu par personne est à rédiger pendant la séance. Ce compte rendu sera à remettre
au professeur en fin de séance.
Demander au professeur un coffret KEIL, contenant la carte microcontrôleur, l’adaptateur et
2 câbles USB. Ce coffret sera à rendre rangé en fin de séance.

Participer au développement d’un jeu Zelda, ça vous tente ? C’est ce


que l’on se propose de faire dans ce TP IE sur les périphériques.
Vous êtes prêts pour l’aventure ? C’est parti !

1. Préparation : Rappels sur l'utilisation des ports TOR


E/S

Rappel : le microcontrôleur LPC1768 présent sur les cartes de TP IENA dispose


de nombreuses broches d’entrée/sortie TOR. Celles-ci sont regroupées sur 5
ports de 32 bits, nommés P0, P1, P2, P3 et P4. Il s’agit de ports parallèles (dits
« GPIO » pour General Purpose Input/Output). Pour identifier une broche d'un
port, on désigne son emplacement sur le port : Par exemple P2.3 désigne la
broche n°3 du port P2.

Q1. Certaines broches du microcontrôleur de notre carte KEIL ont été câblées à un ensemble de 8
LEDs (placées vers le bas de la carte). Selon les indications notées sur le circuit imprimé
suivant, retrouver les ports et broches associées à ces LEDs.
Page - 1
Une solution sera d’utiliser les pointeurs ou les structures pour
contrôler ces ports. Le microcontrôleur dispose de registres
spécifiques, localisés dans l’espace adressable à partir de l’adresse
de base 0x2009C000. Dans ce TP, ces registres sont adressés par
octet.

Toutes les adresses nécessaires pour atteindre les différents registres


sont détaillées en annexe à la fin du sujet.

Réglage de la direction des ports E/S :


A l’adresse 0x2009C040 (offset de 0x40 par rapport à l’adresse de
base) se trouve le 1er registre de direction du port P2 appelé
FIODIR0. Ce registre 8 bits permet de choisir le sens (entrée ou
sortie) des 8 premières broches du port P2.

@0x2009C000+0x40 FIODIR0 du port 2

Bit 7 pour broche P2.7 Bit 0 pour broche P2.0

Un 0 (valeur par défaut) permet de définir une broche en entrée, un 1 pour la définir en sortie.

Q2. Ecrire un programme qui déclare un pointeur volatile char *base_gpio et l'initialise sur
l'adresse de base 0x2009C000. Rédiger ensuite le code permettant de configurer le registre de
direction FIODIR0 pour que les 5 broches du port 2 reliées aux LEDs soient définies comme
des sorties.

Lecture/écriture sur un port E/S :


A l’adresse 0x2009C054 (offset de 0x40 + 0x14 par rapport à l’adresse de base) se trouve le 1 er
registre de donnée du port P2 appelé FIOPIN0. Ce registre permet une lecture ou une écriture sur
le port : lecture des états des broches qu'elles soient configurées en entrée ou en sortie, ou seulement
écriture de l'état des broches configurées en sortie.

Page - 2
0x2009C000+0x40+0x14 FIOPIN0 du port 2

Bit 7 pour broche P2.7 Bit 0 pour broche P2.0

→ Si broche en entrée : à chaque bit correspond l’état de la broche associée.


→ Si broche en sortie : chaque bit permet de mettre à 0 ou 1 la broche associée.

Q3. A l'aide du pointeur défini en Q2, écrire les lignes de code permettant d'allumer les 4 LEDs
placées le plus à droite sur la carte, la 5ème LED reliée au port P2 restant éteinte, cette fois-ci
en utilisant le pointeur et pas les fonctions comme Q3.

On va jouer maintenant avec un joystick ! La touche « joystick gauche » de notre carte Keil (placé à
droite sur l’image de la page précédente) est reliée à P1.23. Attention, le câblage est de type « pull-
up », la broche du microcontrôleur reçoit donc un niveau logique 0 lorsque le joystick est enfoncé.

Q4. A l'aide de l'annexe, chercher les adresses nécessaires pour atteindre le registre de direction
FIODIR2 du port 1 et le registre de donnée FIOPIN2 du port P1, et rédiger le code qui
définit la broche associée au joystick gauche comme une entrée, et récupère ensuite son état
dans une variable de type char.

Q5. Pour finir, écrire un programme qui allume la LED P2.6 lorsque le joueur appuie sur le
Joystick gauche (la LED doit s’éteindre quand on relâche le joystick).

Fin de la partie préparation, mais il est fortement conseillé de lire la suite avant la séance de TP…

2. Contrôle des périphériques via des pointeurs

Si ce n’est pas déjà fait, demander au professeur un coffret KEIL, contenant la carte
microcontrôleur, l’adaptateur et 2 câbles USB. Ce coffret sera à rendre rangé en fin de séance.

Q6. Créer un nouveau projet en allant jusqu’à la partie saisie du programme (Voir le sujet du TP2
si vous avez oublié les étapes). Écrire alors le programme proposé en Q5 de la partie
« Préparation », le compiler, puis le tester sur la carte microcontrôleur.
Faire valider le fonctionnement par le professeur.

3. Peut-on faire plus « simple » ? Changement d'écriture


Maintenant que vous avez compris qu'en informatique embarquée tout fonctionne en traitant des
adresses (atteignables avec des pointeurs), nous allons voir une solution plus généralement retenue
en milieu professionnel : elle évite d'avoir à chercher les « bonnes adresses », et cache la notion de
pointeur, même si cela revient au final au même.

Un fichier système appelé LPC17xx.h contient la définition de tous les registres du microcontrôleur.
Ce fichier contenant la correspondance entre les noms et les adresses, il devient possible d’accéder
aux registres directement à partir de leur nom (en réalité en passant par des structures comme on
a vu en cours). Pour cela, il faut indiquer dans votre code le port et le registre utilisé.

Exemple : LPC_GPIO2 indique le port utilisé (ici P2) et ->FIODIR0 précise le registre visé (ici de
direction n°0, celui associé aux 5 premières LEDs de la prépa).
Pour configurer en sortie les broches du port 2 reliées aux 5 LEDs, on pourra alors remplacer
l'écriture :
Page - 3
*(BASE_GPIO+0x40) = *(BASE_GPIO+0x40) | 0x7C ;
par LPC_GPIO2->FIODIR0 = LPC_GPIO2->FIODIR0 | 0x7C ;

Q7. Ajouter en début de code ce fichier LPC17xx.h avec un clic droit dans la fenêtre du fichier
main → Insert ‘#include file’ → LPC17xx.h

Adapter alors le programme développé en question Q6 avec les pointeurs, mais cette fois en
utilisant les noms des registres (il n'y a donc plus de pointeur dans le programme). Compiler
le programme, puis le tester sur la carte microcontrôleur.
Faire valider le fonctionnement par le professeur.

3. Utilisation de fonctions : écriture de petits drivers


Quand un programmeur veut utiliser une fonction de la carte (ex : les LEDs), l'idéal pour lui est de
ne pas directement avoir à considérer le périphérique (ex : les GPIO associés au LED). Dans ce
cas, on peut fournir au programmeur un « driver » (ou pilote en français), qui met à sa disposition
des fonctions s'occupant d'aller modifier les bons registres. Du coup c'est plus simple !

Q8. On se propose dans un premier temps de fournir un driver permettant d'initialiser les ports E/S
TOR de notre carte microcontrôleur. Ecrire une fonction void Initialise_GPIO (void)
permettant de configurer les 5 broches associées au LEDs en sorties, et la broche associée au
Joystick gauche P1.23 comme une entrée. On utilisera l'écriture précédente (->).

Q9. La deuxième fonction à rédiger est celle permettant de récupérer la valeur du Joystick gauche.
Proposer une fonction char Valeur_JG (void) qui renvoie 1 si le Joystick gauche est enfoncé,
0 sinon.

Q10. On passe ensuite au LEDs, que l'on va gérer dans un premier temps de manière indépendante
les unes des autres. Le numéro de la LED considérée est alors donné comme argument
d'entrée de la fonction (de 0 pour la LED de droite P2.6 jusqu’à 4 pour la LED associée à
P2.2).
- Ecrire la fonction void Allumer_1LED (char Num_LED) qui allume la LED numéro
« Num_LED » (entre 0 et 4 donc) sans toucher à l'état des autres LEDs.
Ex : Allumer_1LED (1) allumera la LED connectée à P2.5.
- Faire de même pour la fonction void Eteindre_1LED (char Num_LED) permettant d'éteindre
une LED choisie (toujours entre 0 et 7).

Q11. Pour la validation des points précédents, réécrire une nouvelle fois un programme répondant
au cahier des charges de la Q6 de la prépa, mais cette fois en utilisant les fonctions que vous
avez rédigées. Après validation, le comparer en termes de lisibilité par rapport à vos premières
solutions.
Faire valider le fonctionnement par le professeur.

Attention, gardez bien vos codes, nous en aurons besoin par la suite !

Ok, et ça sert à quoi tout cela ? Regardons un exemple qui devrait vous parler.

Page - 4
4. Fonctions et jeu « Zelda »
Dans la suite, on revient sur l’application « Zelda » découverte dans le TP précédent.

Q12. Recopier le répertoire « Zelda » du disque \\Commun\IE\IE\semaine8\ dans votre répertoire


personnel. Compiler le code sans l’avoir modifié pour le moment et le téléverser sur la cible.
Pour le moment, les développeur ont uniquement géré les graphismes. Le Joystick permet-il
de déplacer le personnage ?

Pour aider Link à attraper les rubis, nous allons intégrer les fonctions développées en partie 3.

Q13. Copier les fonctions void Initialise_GPIO (void) et char Valeur_JG (void) des questions
Q8/Q9 et les coller dans le fichier main du projet zelda. Appeler ensuite la fonction
d’initialisation au début du main. Dans la boucle infinie, appeler la fonction link_left si le
Joystick gauche est enfoncé, ou link_stop dans le cas contraire. Compiler et tester ce code.

Aller vers la gauche, c’est sympa, mais ça limite un peu les choses quand même !

Q14. En suivant la même démarche, implémenter les 3 fonctions des directions manquantes. La
fonction link_stop ne doit être appelée que si aucune direction du Joystick n’est enfoncée.
Attention, il est également nécessaire de compléter la fonction d’initialisation. Tester le code,
et attraper le maximum de rubis !
Faire valider le fonctionnement par le professeur.

Pour aller plus loin

Avez-vous vu qu’il y a un coffre dans la grotte ?

Q15. En s’inspirant de ce qui a été fait pour le Joystick, implémenter une fonction char
Appui_BP(void) qui retourne 1 si le bouton poussoir INT0 (placé à côté du Joystick), connecté
à P2.10, est enfoncé, 0 sinon.

Q16. Dans la boucle infinie, rajouter la gestion du bouton poussoir, qui doit appeler la fonction
link_action lorsque INT0 est enfoncé. Vérifier ce qu’il se passe lorsque le personnage est à
côté du coffre et que l’on appuie sur INT0.

Vous pouvez maintenant vous rendre dans la maison, où vous rencontrez un étrange personnage. Il
semble avoir une énigme à vous proposer.

Q17. Pour la résoudre, il va falloir jouer avec les interrupteurs de votre carte afin d’allumer les
« bonnes » LED. A vous donc d’écrire :

• la fonction de lecture de l’octet associé aux switchs de la carte d’extension ;

• dans la boucle infinie, le code pour lire les entrées, et allumer/éteindre les LED
correspondantes (penser aux fonctions de la Q10) afin de résoudre l’énigme.

Parlez ensuite à l’ancien pour vérifier que vous avez complété la quête.

Fin de la partie pratique !

Page - 5
ANNEXE – Registres GPIO du Microcontrôleur LPC 1768

Le tableau ci-dessous montre l’ensemble des registres 8 bits permettant de contrôler les ports
d’entrée/sortie (GPIO) du microcontrôleur LPC 1768. L’adresse de base est : 0x2009C000.

Adresse Offset Registre Fonction


0x2009 C000 0x00 FIODIR0
Registres de direction. Un 0 (valeur par défaut) pour définir une
0x2009 C001 0x01 FIODIR1 broche en entrée, un 1 pour la définir en sortie.
0x2009 C002 0x02 FIODIR2 FIODIR0 pour P0.0 à P0.7, FIODIR1 pour P0.8 à P0.15,
FIODIR2 pour P0.16 à P0.23 et FIODIR3 pour P0.24 à P0.31
0x2009 C003 0x03 FIODIR3
0x2009 C004
à 12 octets non utilisés
0x2009 C00F
0x2009 C010 0x10 FIOMASK0
Registres de masque. Un 0 (valeur par défaut) autorise le
0x2009 C011 0x11 FIOMASK1 fonctionnement.
0x2009 C012 0x12 FIOMASK2 FIOMASK0 pour P0.0 à P0.7, FIOMASK1 pour P0.8 à P0.15,
PORT P0

FIOMASK2 pour P0.16 à P0.23 et FIOMASK3 pour P0.24 à P0.31


0x2009 C013 0x13 FIOMASK3
0x2009 C014 0x14 FIOPIN0 Lecture/écriture sur le port, suivant le sens défini par FIODIR :
0x2009 C015 0x15 FIOPIN1 - Si en entrée : à chaque bit correspond l’état de chaque broche.
- Si en sortie : chaque bit permet d’activer ou désactiver la broche associée.
0x2009 C016 0x16 FIOPIN2 FIOPIN0 pour P0.0 à P0.7, FIOPIN1 pour P0.8 à P0.15,
0x2009 C017 0x17 FIOPIN3 FIOPIN2 pour P0.16 à P0.23 et FIOPIN3 pour P0.24 à P0.31
0x2009 C018 0x18 FIOSET1
0x2009 C019 0x19 FIOSET2 Un 1 active une broche déclarée en sortie. Un 0 est sans effet.
FIOSET0 pour P0.0 à P0.7, FIOSET1 pour P0.8 à P0.15,
0x2009 C01A 0x1A FIOSET3 FIOSET2 pour P0.16 à P0.23 et FIOSET3 pour P0.24 à P0.31
0x2009 C01B 0x1B FIOSET4
0x2009 C01C 0x1C FIOCLR0
0x2009 C01D 0x1D FIOCLR1 Un 1 désactive une broche déclarée en sortie. Un 0 est sans effet.
FIOCLR0 pour P0.0 à P0.7, FIOCLR1 pour P0.8 à P0.15,
0x2009 C01E 0x1E FIOCLR2 FIOCLR2 pour P0.16 à P0.23 et FIOCLR3 pour P0.24 à P0.31
0x2009 C01F 0x1F FIOCLR3
0x2009 C020 0x20 FIODIR0
P1

à … … Idem port P0 avec un offset augmenté de 0x20


0x2009 C03F 0x3F FIOCLR3
0x2009 C040 0x40 FIODIR0
P2

à … … Idem port P0 avec un offset augmenté de 0x40


0x2009 C05F 0x5F FIOCLR3
0x2009 C060 0x60 FIODIR0
P3

à … … Idem port P0 avec un offset augmenté de 0x60


0x2009 C07F 0x7F FIOCLR3
0x2009 C080 0x80 FIODIR0
P4

à … … Idem port P0 avec un offset augmenté de 0x80


0x2009 C09F 0x9F FIOCLR3

Exemples :

Adresse de FIODIR3 du port 1 = Adresse de FIODIR3 du port 0 + 0x20 = 0x2009 C023


Adresse de FIOPIN0 du port 2 = Adresse de FIOPIN0 du port 0 + 0x40 = 0x2009 C054
...

Page - 6

Vous aimerez peut-être aussi