Vous êtes sur la page 1sur 16

COMPTE-RENDU

TP3 : Initiation à STM32-Discovery

INDP2-B

Realisé par :
Saidani Wael
Jmour Mohamed
TP0 : Initiation à STM32-Discovery
• Objectif
• Créer un projet Keil,

• Configurer le microcontrôleur cible,

• Manipuler les API destinées aux GPIO.

• Création d’un projet


• Démarrer le programme µVision .

• Sélectionner le menu Project, Puis la commande New µVision project.

• Choisir un nom et un répertoire pour le projet.

• Choisir la cible STM32F407VGTx.

• Une fois la cible choisie, la fenêtre «Manage Run-Time Environnement » s’ouvre


automatiquement. Elle permet de configurer la plateforme des composants logiciels qui seront
utilisés dans le projet.

Tout programme doit avoir des instructions de démarrage, pour cela il faut cocher « Startup »
sous « Device » (voir figure suivante).
La couleur orange signifie que d’autres composants softwares sont nécessaires. Ils sont affichés
dans la fenêtre « Validation Output ». (Voir figure précédente).

Il suffit alors d’appuyer sur le bouton « Resolve » pour ajouter automatiquement les composants
manquants. Une fois tous les composants nécessaires sont ajoutés et la couleur de la colonne
« selection » devient verte (voir figure suivante), il suffit d’appuyer sur le bouton « OK » pour
valider l’ajout.

• Les composants qui ont été ajoutés automatiquement sont affichés dans l’arborescence de
la fenêtre du projet sous des losanges verts.
• Faire un double clic sur le fichier assembleur « startup_stm32f407xx.s » pour avoir la
possibilité de modifier en mode texte le contenu de celui-ci. L’environnement offre aussi la
possibilité de modifier le contenu avec une interface « wizard ».

Cliquer sur « configuration Wizard » puis sur « expand all », pour visualiser toutes les options de
configuration.

Il est possible de changer la taille de la mémoire « Heap » et la taille de la pile d’exécution.

Pour les besoins du projet, garder les valeurs affichées par défaut.
Le fichier « System_stm32f4xx.c » contient le code en C pour l’initialisation des périphériques
systèmes, tels que l’horloge, l’interface PLL …

• Sous le menu « Project » -> « Manage » -> « Run-Time Environment », sélectionner « LED
API » et il est important de préciser la board « STM32F4-Discovery » (voir figure suivante).

Cliquer sur « Resolve » et cocher « Classic » sous « STM32Cube Framework (API) » (voir figure
suivante) puis sur « OK ».
• Tous les fichiers nécessaires à l’abstraction (HAL : Hardware Abstraction Layer) des GPIO de la
carte de développement sont ajoutés automatiquement au projet.

• Cliquer sur Target 1 et changer son nom à « Discovery » pour mieux indiquer aux autres
utilisateurs le type de la cible. Cliquer avec le bouton droit de la souris sur ce nouveau dossier
« Discovery » et sélectionner « Add Group ». Renommer les deux dossiers sous « Discovery » par
« Sources » et « Headers ». Le résultat est affiché dans la figure suivante.
• Cliquer, avec le bouton droit de la souris, sur le répertoire « Sources», et choisir « Add new
item to Groupe Sources ».

Une nouvelle fenêtre s’ouvre, dans laquelle il faut sélectionner l’icône « User code template ».
Dans la section « Device », choisir « STM32Cube Frame:Classic » « ‘main’ module for
STM32Cube » et cliquer sur « Add ».
Un fichier “main.c” s’ajoute au répertoire “sources” du projet.

• Cliquer avec le bouton droit de la souris sur le dossier « Header » puis « Add Existing Files to
Group ‘Headers’ (voir figure suivante).

Puis, sélectionner le ficher « main.h »


A ce niveau, le projet peut être compilé sans erreurs. Lancer “build project” en appuyant sur la
touche F7.

• Une fois la compilation réussie, aller sur sous l’onglet «{} Functions » et vérifier les fonctions
disponibles pour manipuler les IOs disponibles sur la carte d’évaluation. Faire un double clic sur
chacune de ces fonctions pour lire le code C de celles-ci.

NB : Parfois, il faut redémarrer le projet pour rafraichir la fenêtre (voir figure suivante).
• Dans le fichier « main.c » vers la ligne 43, cliquer sur le bouton droit de la souris et sélectionner
« Insert ‘#include file’ » puis « Board_LED.h ».

Le résultat est le suivant.

• Une fois le ficher « Board_LED.h » qui contient les déclarations des APIs énumérées dans le
point 13 est ajouté, il est possible de faire appel à ces fonctions dans la suite du fichier « main.c ».
Pour pouvoir utiliser les LEDs, il faut tout d’abord les initialiser. Pour cela, aller vers la ligne 108 du
fichier « main.c », taper « led » et une liste de suggestions apparaitra automatiquement. Puis,
choisir « LED_Initialize ».
Il faut aboutir à ceci.

• Une fois les IOs qui pilotent les LEDs sont initialisées, il est possible de faire appel aux fonctions
qui allument et éteignent les LEDs.

Vers la ligne 116, ajouter 4 appels de fonction « LED_ON() » en indiquant 0,1,2,3 comme
paramètres. Ceci permettra d’allumer les 4 LEDS de la carte avant d’aller dans une boucle infinie.
En appuyant sur la touche F7, le projet doit compiler sans erreurs.

• Cliquer sur l’icône « options for target » , ensuite sur l’onglet « Debug » afin de
configurer les options de la carte cible sur laquelle le programme sera exécuté. Cette fenêtre fait
apparaître deux options de test : par simulation (à gauche), ou par émulation (à droite), en
utilisant la carte STM32F407VG. En s’intéressant à l’option émulation (à droite), cocher le bouton
« use » et sélectionner « ST-Link Debugger ».
Cliquer sur le bouton « Settings » et vérifier, sous l’onglet « Debug », que le port utilisé et de type
« SW », sinon le changer.

Cliquer sur l’onglet « Flash Download » de la même fenêtre, et vérifier que la taille de la mémoire
Flash de la cible est de 1 M on Chip.
Cliquer sur l’onglet C/C++ et ajouter le macro « HSE_VALUE=8000000 » qui indique la fréquence
du Crystal installé sur la carte à la fonction « SystemClock_Config(); » qui se trouve par défaut dans
le « Template » du « main.c »

Cliquer sur « OK » pour valider les options de configuration du Debugger choisies, ensuite sous le
menu « Debug » de l’environnement, sélectionner « start/stop Debug Session » (ou utiliser Ctr +
F5).

Le programme est chargé dans la carte cible, et un point d’arrêt est placé au niveau de la fonction
main().
Exécuter le programme avec le bouton run( ou la touche F5). Une fois le programme est lancé
la fonction main initialise les LEDs, puis, les met à ‘1’ avant de finir dans une boucle while(1) infinie.

• Travail demandé
Partie 1 :

• De la même manière que le point 11, ajouter les fichiers .c et .h qui gèrent les « Exception
Handlers and Peripherals IRQ »

• De la même manière que le point 13, trouver le rôle de la fonction « HAL_delay() » qui se
trouve sous le fichier « STM32F4xx_HAL.c »

➢ Hal_delay :permet de passer à l’instruction suivante après un certain temps donnée par
l’utilisateur .

• A l’aide d’une boucle « for » à l’intérieur de la boucle « while » infinie faire clignoter les LEDs
à tour de rôle à l’aide des fonctions « LED_On() » et « LED_Off() » avec un intervalle de 250ms.

Partie 2 :
• Dans la fonction main() - avant la boucle while(1) - utiliser la fonction «
HAL_GPIO_WritePin() », les Macros « GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
GPIO_PIN_15 » et les Macro « GPIOD », « GPIO_PIN_RESET » pour éteindre les 4 LEDs en une
seule ligne de code.

• On désire réaliser un compteur binaire avec les quatre LEDs. Pour cela remplir le tableau
suivant en mettant ‘T’ comme Toggle dans les cases où il y a eu un changement d’état de la LED

LED3i LED2i LED1i LED0i LED3i+1 LED2i+1 LED1i+1 LED0i+1 T3 T2 T1 T0


0 0 0 0 0 0 0 1 T
0 0 0 1 0 0 1 0 T T
0 0 1 0 0 0 1 1 T
0 0 1 1 0 1 0 0 T T T
0 1 0 0 0 1 0 1 T
0 1 0 1 0 1 1 0 T T
0 1 1 0 0 1 1 1 T
0 1 1 1 1 0 0 0 T T T T
1 0 0 0 1 0 0 1 T
1 0 0 1 1 0 1 0 T T
1 0 1 0 1 0 1 1 T
1 0 1 1 1 1 0 0 T T T
1 1 0 0 1 1 0 1 T
1 1 0 1 1 1 1 0 T T
1 1 1 0 1 1 1 1 T
1 1 1 1 0 0 0 0 T T T T

• En remplaçant T par ‘1’ et en mettant ‘0’ ailleurs, remplir le tableau de transition suivant par
les valeurs décimales correspondantes (T3=8, T2=4, T1=2, T0=1).

Transition[i] Valeur décimale correspondante


Transition[0] 1
Transition[1] 3
Transition[2] 1
Transition[3] 7
Transition[4] 1
Transition[5] 3
Transition[6] 1
Transition[7] 15
Transition[8] 1
Transition[9] 3
Transition[10] 1
Transition[11] 7
Transition[12] 1
Transition[13] 3
Transition[14] 1
Transition[15] 15

• Récupérer seulement la partie du Tableau qui se répète. Trouver une relation entre les valeurs
des Ti et les positions des LEDs (0,1,2,3) indiquées par « GPIO_PIN_12 », « GPIO_PIN_13 »,
« GPIO_PIN_14 », « GPIO_PIN_15 ». Appliquer cette relation aux valeurs décimales pour trouver
les valeurs de transition finales.

NB : les GPIO_PIN_xx sont définis dans le fichier « stm32f4xx_hal_gpio.h »

Transition[i] Valeur décimale correspondante Valeur finale


Transition[0] 1 4096
Transition[1] 3 12288
Transition[2] 1 4096
Transition[3] 7 28672
Transition[4] 1 4096
Transition[5] 3 12288
Transition[6] 1 4096
Transition[7] 15 61440

• En utilisant la fonction « HAL_GPIO_TogglePin » et les valeurs finales de la question 4, réaliser


un compteur cyclique de 0 à 15 avec les LEDs (0,1,2,3) avec une transition qui dure 500 ms.