Académique Documents
Professionnel Documents
Culture Documents
1- Introduction générale
2-Assembleur ARM
3-Jeu d'instructions
4-Opérations binaires
A. Benali
1 2
•La famille des processeurs STM32 est issue du fabriquant En lien avec les différentes applications embarquées ARM
STMicroelectronics développe des processeurs de profiles différents:
•Les chips STM32 sont groupés dans des séries fondées -Série Cortex-A : Application processor pour les OS complexes
autours du même processeur ou core ARM et applications avec l'utilisateur
•En interne chaque microcontrolleur est composé d'un core, -Série Cortex-R: Real-time systems
RAM statique, mémoire flash, interface de debogage et divers -Série Cortex-M: Microcontrolleurs optimisés pour les
périphériques, applications à faible coût de revient.
•Les core ARM sont classés par caractéristiques en Cortex-M7,
Cortex M4F,Cortex-M3, Cortex M0
5 6
9 10
11 12
STM32 : Cortex M lequel choisir STM32 : Cortex M lequel choisir
www.arm.com
16
Cortex-M3 Cortex-M4
ARMv7M ARMv7E-M
17 18
Les Cortex M4 et
M7 ont des binaires
compatibles.
Integer SIMD
Instructions -
Données 8 et 16 bits
- Résultats
compressés en 32
bits
Les instructions
MAC sont à cycle
unique
19 20
Architecture STM32f303VCT6 Architecture STM32f303VCT6
S2: S-bus
Ce bus relie le bus système de données du coeur M4 au BusMatrix. Ce bus
cible les périphériques ou SRAM. Ses cibles sont SRAM, le bus AHB vers les
bridge APB1/APB2 le AHB IO port ainsi que le périphérique ADC.
23 24
Organisation de la mémoire … APB1 Organisation de la mémoire … APB2
25 26
0x4800 0400
Pour accéder à un périphérique GPIO
0x4800 0008
GPIOB 0x4800 0400
les seuls gpio qui
GPIOA 0x4800 0000
réagissent aux adresses 27 28
Outils et environnement développement Outils et environnement développement
29
Arduino UNO(19.28€)
Arduino MEGA (43.51€)
1- Introduction générale
Données
2-Assembleur ARM Registres
3-Jeu d'instructions
4-Opérations binaires Mémoire extérieure au processeur.
Des registres internes au processeur.
• N : négatif Interruptions :
• Z : zéro • F : désactiver les FIQ
• C : retenue • I : désactiver les IRQ
• V : dépassement T : Thumb
Mode de fonctionnement
À l’origine les syntaxes des instructions thumb et arm étaient 1. Traitement et manipulation des données :
différentes. • Arithmétiques et logiques
Une syntaxe unifiée (unified) est supportée par les versions • Tests et comparaisons
récentes des outils de développement. 2. Transfert de données depuis et vers la mémoire
Du fait de la taille des instructions thumb (16-bits) certaines 3. Contrôle de flot
restrictions d’usage existent. • Branchements
43
Jeu d'instructions : Opérations arithmétique/logique Transfert Données entre registres
CF Destination 0 Destination CF
Exemples
Multiplication by a power of 2 Division by a power of 2,
LSL r0,r1,r2 pour (r0 = r1 << r2[7:0]) preserving the sign bit
ASR r3,r4,r5 pour (r3 = r4 >> r5[7:0])
LSR Décalage logique vers la droite Division by a power of 2 Bit rotate with wrap around
ASL Décalage arithmétique vers la gauche from LSB to MSB
ASR Décalage arithmétique vers la droite
ROR Décalage circulaire vers la droite
Opérations de décalage de registres et PSR Opérations de comparaison
53
En plus des instructions LDR et STR le jeu d’instruction ARM Il existe 4 suffixes possibles pour les instructions de transferts
propose les instructions LDM et STM pour les transferts multiples. multiples :
IA pour la post-incrémentation (Increment After )
Exemples IB pour la pré-incrémentation (Increment Before)
LDMIA r0,{r1,r2,r3} DA pour la post-décrémentation (Decrement After)
(r1 [r0]) DB pour la pré-décrémentation (Decrement Before)
(r2 [r0 + 4])
(r3 [r0 + 8]) Pour que la valeur du registre d’adresse soit modifiée il faut
STMIA r0,{r1-r3} ou STMIA r0,{r1,r2,r3} ajouter (!)
(Mem[r0] = r1) LDMIA r0!,{r1-r3}
(Mem[r0 + 4] = r2)
(Mem[r0 + 8] = r3)
Branchements (1/2)
Sommaire Il existe deux instructions de branchement :
59
Branchements (1/2) Branchements (2/2)
B <label> Pour les instructions B et BL l’adresse est stockée comme
PC relative. ±32 Mbyte range. un immédiat qui représente un offset par rapport à la
BL <subroutine> position actuelle :
Stores return address in LR • l’offset est forcement limité
Returning implemented by restoring the PC from LR Pour l’instruction BX le mode (ARM/Thumb) est déterminé
For non-leaf functions, LR will have to be stacked en fonction du bit de poids faible de l’adresse normalement
func1 func2 non utilisé (voir interworking)
STMFD :
: sp!,{regs,lr}
:
: :
:
BL func1 BL func2
:
: :
:
: LDMFD
sp!,{regs,pc} MOV pc, lr
1- Introduction générale
CMP r0,r1 comparer r0à r1
2-Assembleur ARM
SUBGE r0,r0,r1 si r0 ≥ r1alors r0 = r0-r1 3-Jeu d'instructions
SUBLT r0,r1,r0 si r0 < r1alors r0 = r1-r0 Manipulation des données
SUBS r0,r1,r2 r0 = r1-r2
BEQ address aller à adresse si le résultat est nul
Transfert des données
BNE address aller à adresse si différent Branchement
Exécution conditionnelle
4-Opérations binaires
66
a 11001101 Un masque est un mot binaire que l'on construit pour servir de
^ xor
b 00010100 filtre pour manipuler les registres.
1 1011001
Cet opérateur produit 1 pour chaque bits différents Masque 11011011
~((1<<2)|(1<<5))= 1 1 0 1 1 0 1 1
Intérêt du masque plusieurs bits à 1
http://embedds.com/programming-stm32-discovery-using-
gnu-tools-linker-script/ 76
Baremetal c'est quoi ? linker script
startup ou démarreur :sert à se substituer Le linker script est un fichier qui décrit les
au système d'exploitation pour charger le spécification du microcontrôleur comme
code objet généré en se basant sur linker les adresses mémoire, les sections
script mémoires, allocation de pile et
emplacements.
MEMORY {
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
}
77 78
SECTIONS {
.text : Le code de démarrage est exécuté juste après la réinitialisation
{ du microcontrôleur et est exécuté avant le programme principal.
. = ALIGN(4);
KEEP(*(.interrupt_vector)) En tant que script de liaison, le code de démarrage est
*(.text) généralement implémenté en tant que code universel pour tout le
*(.text*) même type de microcontrôleur.
*(.rodata)
*(.rodata*)
. = ALIGN(4);
} > FLASH
79 80
Présentation openstm32 : gcc La table des vecteurs d'interruptions
81
au reset le sp=_estack qui charge le vecteur 0 celui Reset_Handler
82
section de
code
83 84
section branchement au main system_stm32f30x.c
85 86
87 88
STM32 vs Arduino
89