Vous êtes sur la page 1sur 6

Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022

TP Microprocesseur | Dr Ousmane SADIO L2 Robotique


_______________________________________________________________________________________________________________

TP - Exécution d’un programme dans un processeur ARM Cortex-M3


L’objectif n’est pas d’apprendre à programmer en langage assembleur, mais de pouvoir relire et comprendre
un tel programme. Pour ce faire, un désassembleur sera utilisé. Ce dernier est un programme informatique
qui traduit du langage machine (un fichier exécutable) en langage assembleur.

Matériel cible
La programmation se fera sur un matériel cible. Pour ce projet vous travaillerez avec le microcontrôleur
de la famille STM32F1 basé sur un processeur ARM Cortex-M3.

Installation de Keil MDK ARM


La chaine MDK ARM de Keil est la solution de développement logiciel la plus complète pour les
microcontrôleurs basés Arm. De plus Keil MDK-ARM inclut tous les composants nécessaires et
suffisants pour le développement et la mise au point d’une application embarquée.

(1) Télécharger le logiciel Keil MDK ARM (MDK537). Ensuite lancer l’installation.
https://www.keil.com/demo/eval/arm.htm

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn
Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022
TP Microprocesseur | Dr Ousmane SADIO L2 Robotique
_______________________________________________________________________________________________________________

(2) Pour assurer la rétrocompatibilité avec les versions antérieures du MDK, télécharger puis installer
le module Legacy support for ARM Cortex-M device (MDKCM525) présent dans le dossier Drive.
https://www2.keil.com/mdk5/legacy/
(3) Une fois l’installation terminée, devez spécifier les composants sur lesquels vous allez tester vos
codes. Dans la partie Devices, aller dans STMMicroelectronics puis dans STM32F1 afin
d’installer ou mettre à jour un certain nombre de packs : STM32F1xx_DFP, STM32NUCLEO_BSP,
CMSIS et MDK-Middleware.

Une fois l’installation des packs terminée, fermer la fenêtre.


Ecrire, compiler et simuler votre premier programme
(4) Lancer le logiciel Keil uVision5. Ensuite créer un nouveau projet en allant dans Project puis cliquer
sur New µVision Project.
− Nommer votre projet test et l’enregistrer dans un dossier nommé également test que vous
prendriez soin de créer au préalable.
− Ensuite, vous devez choisir le microcontrôleur STM32F103RB dans la liste
STMicroelectronics.
− Sur la nouvelle fenêtre, inclure les fichiers de démarrage en cochant Startup dans la rubrique
Device et CORE dans la rubrique CMSIS.
− Vérifier à la fin que vous avez les fichiers suivants dans le répertoire Device de votre projet :
startup_stm32f10x_md.s et system_stm32f10x.c.

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn
Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022
TP Microprocesseur | Dr Ousmane SADIO L2 Robotique
_______________________________________________________________________________________________________________

(5) Renommer les dossiers de votre projet en cliquant sur le bouton File Extensions, Books and
Environment…

− Renommer le dossier Target 1 en Simulation.


− Renommer le dossier Source Group 1 en Source.
(6) Créer un fichier en allant dans File puis dans New. Ensuite coller dans le fichier le code suivant :
#include "STM32f10x.h"

int main (void)


{
int i;
int j = 6;

for (i = 1; i < 5; i++)


{
j = j + 1;
}
return 0;
}

− Enregistrer le fichier sous le nom main.c


− Ajouter le fichier au projet en double cliquant sur le dossier Source puis ajouter le fichier main.c.
(7) Compiler votre programme en allant sur Project puis cliquer sur Build Target.
Au lieu de téléverser le programme sur un vrai microprocesseur, vous allez plutôt l’exécuter dans un
environnement de simulation.
(8) Allez dans Project puis cliquer sur Options for Target ‘Simulation’…, puis dans l’onglet Debug:
− Assurez-vous que l'option Use Simulator est bien cochée
− Dans la partie ci-dessous qui sert pour la simulation, vérifier si vous avez les valeurs suivantes:

(9) Lancer la session de debug en allant sur Debug puis cliquer sur Start/Stop Debug Session… Après
le lancement, plusieurs fenêtres s’affichent :
❶ : le listing source écrit en langage C ;
❷ : l’état des registres du processeur avant la réalisation de l’instruction repérée par la flèche jaune
(dans la fenêtre ③) ;
❸: le code assembleur produit par le compilateur ;

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn
Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022
TP Microprocesseur | Dr Ousmane SADIO L2 Robotique
_______________________________________________________________________________________________________________

(10) Faire le débogage étape par étape avec le bouton Step ( ).

Le debugging dans µVision


µVision offre des moyens pour suivre l'évolution de l’exécution d'un programme et de son état. En particulier,
il est possible de visualiser rapidement l'état des registres du cœur du processeur et l'état de la mémoire. Il est
aussi possible d’observer certaines variables (watch) et suivre leur évolution au cours du déroulement de
l’application. Enfin la disasembly window vous permettra d'avoir un aperçu du code assembleur produit et ainsi
suivre chaque instruction réalisée sur le processeur.

Une fois le debug lancé, vous pouvez exécuter le code avec le bouton Run ( ) et l'arrêter avec le bouton Stop
( ). Si vous voulez réinitialiser le système, vous pouvez utiliser le bouton Reset ( ).
Le contrôle de l’exécution en pas à pas se fait à l’aide des boutons Step ( ), Step Over ( ) et Step Out ( ).
L’ajout d’un point d’arrêt se fait soit en double cliquant à droite de la ligne où l’on souhaite déposer le point
d’arrêt, soit en cliquant sur le bouton Insert/Remove Breakpoint ( ). En utilisant le bouton Run ( ), l’exécution
avance jusqu’au prochain point d’arrêt.

Interprétation
Sur la fenêtre de désassemblage, chaque ligne est constituée des champs suivants : adresse instruction,
mot code, mnémonique, opérandes.
# Ce bloc d’instructions montre que la variable i est initialisée à 0.

SUB sp,sp,#0x0C Allocation d’espace mémoire sur la pile systèmes (SP).


MOVS r0,#0x00 Assigner à R0, la valeur 0
STR r0,[sp,#0x08] Stocker la valeur de R0 à l’adresse mémoire SP + 8
MOVS r0,#0x06 Assigner à R0, la valeur 6

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn
Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022
TP Microprocesseur | Dr Ousmane SADIO L2 Robotique
_______________________________________________________________________________________________________________

# Ce bloc d’instructions montre l’assignation de la valeur 6 à la variable j (voir dernière ligne bloc
précédent) puis son stockage à l’adresse mémoire sp + 0.

STR r0,[sp,#0x00] Stocker la valeur de R0 à l’adresse mémoire SP + 0


MOVS r0,#0x01 Assigner à R0, la valeur 1
# Ce bloc d’instructions montre d’abord l’initialisation i = 1 (voir dernière ligne bloc précédent). Ensuite
il y a un branchement vers l’adresse 0x080003CC qui contient l’instruction de chargement dans R0 de
la valeur de i (i est stocké à l’adresse sp + 4). Ensuite il y a comparaison (CMP) entre R0 et la valeur 4 ;
si R0 plus grand que 4, faire un branchement vers l’adresse 0x080003E4. Sinon, faire le branchement
vers l’adresse 0x080003D4. Cette adresse contient l’instruction de chargement de la valeur j (à partir
de l’adresse sp + 0) dans R0. Ensuite il y a l’incrémentation de j via l’instruction ADDS R0, R0,#0x01
et le sauvegarde du résultat à l’adresse mémoire habituelle de j (sp + 0).

# Le branchement à l’adresse 0x080003DC permet le chargement de la valeur de la variable i (stockée


à l’adresse mémoire sp + 4) dans R0. Ensuite, il y a incrémentation de i par le biais de l’instruction
ADDS et sauvegarde du résultat à l’adresse mémoire habituelle de i (sp + 4).
Le branchement à l’adresse 0x080003CC matérialise le passage à l’itération suivante. A la fin des
itérations (lorsque i supérieure à 4), il y a branchement à l’adresse 0x080003D4 qui contient
l’instruction de réinitialisation de R0 à 0.

# Ce bloc permet de remettre la pile système (SP) à sa valeur d’origine puis un branchement
inconditionnel vers le registre LR contenant l'adresse de retour de la fonction. La valeur de retour est
R0.

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn
Université Virtuelle du Sénégal (IUVS) 2021 ⎯ 2022
TP Microprocesseur | Dr Ousmane SADIO L2 Robotique
_______________________________________________________________________________________________________________

Observer l’état des périphériques


Soit le programme suivant qui vous permet de faire clignoter une LED en faisant changer l’état (LOW
et HIGH) de la broche 5 de la GPIO du port A à chaque itération.
#include "STM32f10x.h"

int main (void)


{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN ;
GPIOA->CRL = GPIOA->CRL & ~(0xF << 4*5);
GPIOA->CRL = GPIOA->CRL | (0x01 << 4*5);
while(1)
{
GPIOA->ODR ^= (1 << 5);
}
return 0;
}

(11) Créer un nouveau projet que vous nommeriez led_blink contenant le programme suivant.
(12) Effectuer le débogage du programme étape par étape. Arrivé à l’intérieur de la boucle while,
observer l’état de la GPIOA en allant dans Peripherals / General Purpose I/O puis cliquer sur
GPIOA.

______________________________________________________________________________
ousmane.sadio@uvs.edu.sn

Vous aimerez peut-être aussi