Le microcontrˆoleur STM32 : un cœur ARM Cortex-M3
G. Goavec-M´erou, J.-M Friedt
28 f´evrier 2012
Au sein de la gamme des cœurs de processeurs propos´es par ARM, le
Cortex-M3, op´erant sur des registres de 32 bits, fournit un compromis en-
tre une puissance de calcul appr´eciable et une consommation r´eduite qui,
sans atteindre les performances du MSP430 (16 bits), propose n´eanmoins
des modes de veille en vue de r´eduire la consommation moyenne d’une
application. Bien que les nombreux p´eriph´eriques disponibles ainsi que
l’´enorme quantit´e de m´emoire associ´ee `a ce processeur puissent jus-
tifier l’utilisation de biblioth`eques dont une impl´ementation libre est
disponible sous le nom de libopencm3, nous verrons qu’il est possible
d’appr´ehender un certain nombre de ces p´eriph´eriques pour en faire un
usage optimal en acc´edant directement aux registres qui en contrˆolent
l’acc`es. Le cœur M3 est d´eclin´e par de nombreux fondeurs : nous nous
focaliserons ici sur l’impl´ementation de ST Microelectronics sous le nom
de STM32F1 (dans la suite, le microcontrˆoleur sera nomm´e simplement
STM32 car la plupart des applications sont portables sur les autres
mod`eles).
1 Introduction
La famille des microprocesseurs STM32 de ST Microelectronics fournit une vaste gamme de
p´eriph´eriques autour d’un cœur d’ARM Cortex-M3 [CortexM3], allant du simple GPIO (port
d’entr´ee-sortie g´en´eraliste) et interface de communication s´erie synchrone (SPI) ou asynchrone
(RS232) aux interfaces aussi complexes que l’USB, ethernet ou HDMI. Un point remarquable est
qu’un certain nombre de ces processeurs poss`edent deux convertisseurs analogique-num´eriques,
permettant un ´echantillonnage simultan´e de deux grandeurs analogiques. Cadenc´e sur un r´esonateur
interne ou sur un quartz externe haute fr´equence 8 MHz (multipli´e en interne au maximum `a
72 MHz), ce processeur est compatible pour des applications faibles consommations (section 9) avec
un mode veille dont le r´eveil s’obtient par une condition sur une horloge interne ou une interrup-
tion externe. La multiplicit´e des horloges et leur utilisation pour cadencer les divers p´eriph´eriques
est d’ailleurs un des aspects les plus d´eroutant dans la prise en main du STM32.
Notre choix d’investissement de temps sur ce microcontrˆoleur en particulier est dirig´e par
quelques contraintes techniques :
avant tout, un double convertisseur analogique-num´erique rapide (1 M´echantillons/s) sens´e
garantir la simultan´eit´e des conversions sur deux voies, un point cl´e si du traitement num´erique
additionel est effectu´e sur une combinaison des deux voies,
une architecture ARM Cortex-M3 exploit´ee par d’autres constructeurs : nous ne nous en-
fermons pas sur une architecture support´ee par un unique fondeur, les principes de base
concernant le cœur du processeur et la toolchain peuvent ˆetre r´eutilis´es ult´erieurement sur
un autre processeur bas´ee sur la mˆeme architecture (par exemple Atmel SAM3),
un mode veille proposant une consommation raisonnable pour les application embarqu´ees
autonomes qui nous ineressent.
2 Architecture du processeur – impl´ementation d’un circuit
Le lecteur d´esireux de simplement exploiter un circuit commercialement disponible devrait
pouvoir travailler sur le circuit STM32H103 de Olimex 1.
1. http://www.olimex.com/dev/stm32-h103.html
1
Pour notre part, nous nous proposons d’exploiter un circuit d´edi´e, sp´ecifiquement d´evelopp´e
en vue d’´emuler le port parall`ele d’un PC, fournissant ainsi acc`es `a la majorit´e des signaux utiles
mais surtout illustrant le peu de composants annexes n´ecessaires au fonctionnement de ce mi-
crocontrˆoleur : un quartz 32,768 kHz, ´eventuellement un quartz 8 MHz, et des condensateurs de
d´ecouplage aux 4 coins pour filtrer l’alimentation (Figs. 1 et 2). Ce circuit comporte par ailleurs un
convertisseur USB-RS232 pour fournir une interface commun´ement disponible sur tout PC r´ecent.
Nous verrons deux applications de cette carte, dans un cas pour ´emuler le comportement du port
parall`ele d’un PC pour le contrˆole d’un instrument (section 5), et, plus ambitieux, la r´ealisation
d’une station de mesure m´et´eorologique (section 8).
GND
GND
8 MHz
GND
GND
GND
100n100n100n100n
GND
100n
FT232RL
GND
GND
100n
VCC
100n
GND
GND
VCC
VCC
GND
ET312SMD
GND
VCC
GND
LTI-SASF54GT
LMV324M
LMV324M
LMV324M
LMV324M
GND
VCC
GND
VCC
VCC
VCC
1N4148DO35-7
100n
PA0
14
PA1
15
PA2
16
PA3
17
PA4
20
PA5
21
PA6
22
PA7
23
U1PORTA_L
PA8
41
PA9
42
PA10
43
PA11
44
PA12
45
PA13
46
PA14
49
PA15
50
U1PORTA_H
PB0
26 PB1
27 PB2
28 PB3
55 PB4
56 PB5
57 PB6
58 PB7
59
U1PORTB_L
PB8
61 PB9
62 PB10
29 PB11
30 PB12
33 PB13
34 PB14
35 PB15
36
U1PORTB_H
PC0
8
PC1
9
PC2
10
PC3
11
PC4
24
PC5
25
PC6
37
PC7
38
U1PORTC_L
PC13
2
PC14
3
PC15
4
PC8
39
PC9
40
PC10
51
PC11
52
PC12
53
U1PORTC_H
VDD_1
32
VDD_2
48
VDD_3
64
VSS_1
31
VSS_2
47
VSS_3
63
VDD_4
19
VSS_4
18
U1POWER
PD0/OSC<=
5PD1/OSC=>
6PD2
54
U1PORTD/OSC
VBAT
1
VSSA
12
VDDA
13
U1AN_POWER
NRST
7
BOOT0
60
STM32F10XRXT6
U1RESET
1 3
42
RESET
1
2
BOOT0
R1
R2
Q2
1
2
BOOT1
R3
C1C2
C3C4
C5C6C7C8
C9
IC2
VCC
20
3V3OUT
17
USBDP
15
USBDM
16
OSCO
28 OSCI
27
GND 7
TXD 1
RXD 5
RTS 3
CTS 11
DTR 2
DSR 9
DCD 10
RI 6
CBUS0 23
CBUS1 22
CBUS2 13
CBUS3 14
CBUS4 12
VCCIO
4
RESET
19
GND
25
GND 18
TEST 26
GND 21
C10
C11
T1
1
2
3
4
X2
CS
1
DI
2
GND
3
VCC
4
SCK
5
GND1
6
DO
7
IRQ
8
WP
CD
CD
WP
SW
SW
SHIELD
14
P9
9
GND6 11
GND4 9
GND5 10
GND1 1
GND2 2
GND3 8
TX
4RX
3
GND7 13
RF
12
U$2
GPIO1
5
VCC 7
BATT 6
1
2
3
4
X1
R4
R5
R6
X3
R7
C12
2
3
1
IC1A
6
5
7
IC1B
9
10
8
IC1C
13
12
14
IC1D
411
R8
R9
R10
R11
R12
R13
1
2
JP1
1
2
JP2
R14
R15
R16
R17
R18
R19
C13
114
215
316
417
518
619
720
821
922
1023
1124
1225
13
X4
R20
R21
D1
1
2
JP4
32K
2
6
4
1
5
1
2
JP3
2
6
4
1
5
2
6
4
1
5
1
2
JP5
1
2
JP6
P$1
P$1
P$2
P$2
P$3
P$3 P$4 P$4
P$5 P$5
LLV70033DCK
P$1
P$1
P$2
P$2
P$3
P$3 P$4 P$4
P$5 P$5
LLV70033DCK
C14
GND
GND
GND
GND
GND
GND
GND
GND
VCC
VBUS
VBUS
ADC0
ADC1
D0
D1
D2
D3
D4
D5
D6
D7
STROBE
STROBE
ACK
ACK
BUSY
BUSY
PE
PE
SCLT
SCLT
ERROR
ERROR
INIT
INIT
SLCTIN
SLCTIN
VCCSD
CMDVCCSD
USB
USB
IN
GND
EN NC
OUT
IN
GND
EN NC
OUT
Figure 1 – Exemple de circuit exploitant le STM32 (sch´ema). Le quadruple-amplificateur
op´erationnel (en bas `a droite) prot`ege 4 voies de conversion analogique-num´erique et ajoute une
tension constante permettre la mesure de signaux de valeur moyenne nulle. Une carte SD est con-
nect´ee sur bus synchrone SPI (en bas `a gauche). Un r´egulateur lin´eaire (en haut `a droite) permet
l’alimentation de ce circuit sur le bus USB qui sert aussi `a la communication au travers d’un
convertisseur RS232-USB FT232.
3 Chaˆıne de compilation et biblioth`eques
La chaˆıne de compilation est bas´ee sur l’habituelle g´en´eration des binaires issus de binutils
et gcc sur architecture x86 `a destination du processeur ARM, et en particulier Cortex M3. Un
script `a peu pr`es parfait est disponible sous la nomenclature summon-arm-toolchain – accessible
par git au moyen de git clone git://github.com/esden/summon-arm-toolchain.git – pour
aller rechercher l’ensemble des archives sur les sites appropri´es et compiler les outils n´ecessaires `a
g´en´erer un binaire `a destination du STM32. On notera que cette mˆeme toolchain est fonctionnelle
2
LMV324M
AQV22
AQV22
AQV22
BOOT1
X2X1
IC1
R8
R9
R10
R11
R12
R13
R14
R15 R16
R17
R18
R19
C13
X4
K1
K2
K3
E L E C T R O N I C SE L E C T R O N I C S
1 13
14 25
2,54
F25
ET312
USB
RS232
SD card
U1
RESET
BOOT0
R1
R2
Q2
R3
C1
C2
C3
C4
C5
C6
C7
C8
C9
IC2
C10
C11
T1
U$1
U$2
ET312SMD
R4
R5
R6
X3
R7
C12
JP1
JP2
R20R21
D1
JP4
32K
JP3
JP5
JP6
TLV
TLV
C14
STM32F10XRXT6
8 MHz
100n
100n
100n
100n
100n
FT232RL
100n
100n
LTI-SASF54GT
1N4148DO35-7
100n
Figure 2 – Exemple de circuit exploitant le STM32 (implantation des composants).
pour d’autres architectures ARM, notamment l’ARM7 fourni dans l’ADuC7026 de Analog Devices
d´ej`a pr´esent´e auparavant [LM117].
La compilation se fait classiquement `a l’aide de la commande suivante :
1 cd summonarmtoolchain
. / summonarmt o o l c h a i n USE LINARO=0 OOCD EN=0
Celle-ci permet d’installer la toolchain avec la version Vanilla de GCC au lieu de linaro GCC
(USE LINARO=0), sans la compilation et l’installation de OpenOCD (OOCD EN=0), disponible sous
forme de paquet binaire dans toutes les distributions. Par d´efaut, seule la biblioth`eque libre
libopencm3 est install´ee. Pour installer une biblioth`eque propri´etaire mais gratuite d´evelopp´ee
par ST, libstm32, l’option LIBSTM32 EN=1 devra ˆetre pass´ee `a la ligne de commande. Nous ex-
ploitons en particulier cette fonction pour compiler les nombreux exemples disponibles sur le
web, en d´ecortiquer le fonctionnement et ainsi acc´eder aux mˆemes fonctionnalit´es en enrichissant
libopencm3. Par d´efaut, les outils seront install´es dans $HOME/sat.
Obtenir un compilateur fonctionnel ne constitue que le d´ebut de l’aventure du d´eveloppement
sur processeur ARM Cortex-M3. Ce cœur de processeur 32 bits est en effet support´e par divers
fondeurs de circuits inegr´es, et une tentative d’unification du support logiciel en vue de la porta-
bilit´e du code d’un fondeur `a l’autre est propos´ee sous la nomenclature CMSIS. Comme souvent
dans cette th´ematique, l’intention est surement noble, mais le r´esultat consiste en une biblioth`eque
`a la license peu rassurante (ST) exploitant abusivement des structures de donn´ees lourdes dont
l’utilisation sur un syst`eme embarqu´e est un peu surprenante. D’un autre cˆot´e, une architecture
32 bits document´ee sur plus de 1000 pages [RM0008] est difficile `a appr´ehender par la lecture
d’une datasheet d´ecrivant la fonction de chaque registre 2: un compromis appr´eciable en terme
de license d’utilisation, complexit´e et proximit´e au mat´eriel semble ˆetre le projet libopencm3
(libopencm3.org). Accompagn´ee de nombreux exemples concrets – et en particulier sur le point
´epineux de l’exploitation du p´eriph´erique USB – cette biblioth`eque est facile `a appr´ehender malgr´e
un manque de maturit´e certain et quelques p´eriph´eriques absent qui seront sans doute combl´es
rapidement.
Une fois la compilation de toolchain finie, nous disposons dans $HOME/sat des outils n´ecessaires
`a la compilation d’applications : nous ajoutons le r´epertoire $HOME/sat/bin dans le PATH,
e x po r t BASE DIR=/home/ u s e r / s a t
2. `a la fin, on revient toujours aux fondamentaux, mais l’approche est un peu rude en premier abord
3
2 ex po rt PATH=${PATH}: ${CM3 BASE DIR}/ bin
ex po rt CM INC=${CM3 BASE DIR}/armnonee a b i / i n c l u d e
4 ex po rt CM LIB=${CM3 BASE DIR}/armnonee a b i / l i b
La ligne relative au r´epertoire include et lib servira lors de la compilation d’applications telle
que pr´esent´ee plus loin pour acc´eder aux bons r´epertoires lors de la g´en´eration du binaire.
4 Outils de programmation
Le second pr´erequis, apr`es l’obtention d’une chaˆıne de compilation fonctionnelle, concerne
l’outil pour programmer le microcontrˆoleur. Deux solutions sont possibles :
1. la programmation par RS232 avec un outil tel que stm32flash (code.google.com/p/stm32flash/).
2. la programmation par JTAG grˆace `a OpenOCD et `a une sonde.
4.1 stm32flash
La r´ecup´eration des sources de stm32flash se fait par :
sv n c he ck o u t h t tp : / / s t m 3 2 f l a s h . g o o g l e c o d e . com/ sv n / t run k / s tm 3 2 fl a sh readon ly
Un simple make && sudo make install dans le r´epertoire compilera et installera l’outil.
stm32flash prend en argument le nom du fichier contenant l’image binaire `a placer en m´emoire
du microcontrˆoleur (fichier .bin ou .hex), la commande `a effectuer (lecture, ´ecriture, v´erification)
et l’interface de communication. Accessoirement, le d´ebit de communication peut ˆetre ajout´e
Afin de passer le STM32 en mode programmation il faut, comme pour bon nombre d’autres
microcontrˆoleurs, manipuler deux broches. La premi`ere est BOOT0 qui doit ˆetre mise `a la tension
d’alimentation VCC. Cette commande est valid´ee par une mise `a GND de la broche reset du
STM32. `
A ce moment le microcontrˆoleur est prˆet `a ˆetre programm´e avec la commande :
s t m 3 2 f l a s h w main . bi n / dev / ttyUSB0 g 0x0
Le -w signifie que le fichier main.bin doit ˆetre ´ecrit en flash, le -g 0x0 sp´ecifie l’adresse o`u
commencera l’ex´ecution (0x0 correspond au d´ebut de la flash). Nous proposons une modification
du module ftdi sio.ko permettant de manipuler deux broches du composant servant de con-
vertisseur USB-RS232 (FT232RL) et de stm32flash pour manipuler ces deux signaux lors de
la programmation 3. Ces manipulations n´ecessitent n´eanmoins un transistor mone en circuit in-
verseur pour palier `a l’´etat par d´efaut (incorrect) des broches du FT232RL, et d’un circuit de
gestion du reset, Analog Devices ADM809, pour retarder l’impulsion d’initialisation lors de la
mise sous tension et ainsi permettre au FT232RL de stabiliser l’´etat de ses sorties avant que le
microcontrˆoleur ne tente d’ex´ecuter son application (Fig. 3). Une pr´esentation plus d´etaill´ee des
possibilit´es de “d´etournement” des FTDIs fera l’objet d’un futur article.
4.2 OpenOCD
L’utilisation du JTAG pour la programmation d’un microcontrˆoleur pr´esente de nombreux
inerˆets. Sans rentrer dans les d´etails, il permet de charger le binaire bien plus rapidement qu’avec
une liaison s´erie et de debugger le code (`a l’aide de GDB connect´e `a OpenOCD) .
L’incantation pour programmer un STM32 `a l’aide d’une sonde JTAG et de OpenOCD est
1 openocd f i n t e r f a c e / d p b u s b l a s t e r . c f g \
f board / o li mex st m32 h1 07 . c f g \
3c ” a d apt er kh z 2000 \
c i n i t ” \
5c h a l t \
c s tm32f1x m a s s e r a s e 0 \
7c f l a s h w r i t e i m a g e main . hex ” c r e s e t run ” c ”shutdown
L’interface (la sonde JTAG) d´epend bien entendu du mat´eriel disponible. Bien que notre carte ne
soit pas une Olimex, l’utilisation de ce fichier de configuration permet de fixer certaines informa-
3. patchs disponibles sur la page http://www.trabucayre.com/page-ftdi.html
4
GND
5600
5600
13p13p
GND
VCC
FT232RL
100n
Q_32K_SMD
2n2222
5600
15k
4k7
10k
VCC
15k
PC13
2
PC14
3
PC15
4
PC8
39
PC9
40
PC10
51
PC11
52
PC12
53
U1PORTC_H
NRST
7
BOOT0
60
STM32F10XRXT6
U1RESET
R1
R2
C3C4
1 2
RESET
1
2
DLOAD
IC4
VCC
20
3V3OUT
17
USBDP
15
USBDM
16
OSCO
28 OSCI
27
GND 7
TXD 1
RXD 5
RTS 3
CTS 11
DTR 2
DSR 9
DCD 10
RI 6
CBUS0 23
CBUS1 22
CBUS2 13
CBUS3 14
CBUS4 12
VCCIO
4
RESET
19
GND
25
GND 18
TEST 26
GND 21
C39
1
2
3
4
5
Q5
Q1
R9
R12
R16
R17
ADM809
R13
GND
GND
GND
VCC
RSTX
RST
RSRX
AT1
VUSB
CBUS1
CBUS2
5VRF
RESET_FTDI
Figure 3 – Circuit de r´einitialisation du STM32 : le jumper DLOAD et bouton poussoir RE-
SET permettent de manipuler `a la main ces fonctions pour passer le microcontrˆoleur en mode
programmation, tandis que les broches CBUS1 et CBUS2 sont exploit´ees pour automatiser ces
fonctionnalit´es en commandant la commutation des signaux depuis le PC. `
A ces fins, une version
modifi´ee de ftdi sio.ko et stm32flash sont n´ecessaires. Le transistor Q1 sert d’inverseur pour
que la valeur par d´efaut de CBUS2 (lors de l’ex´ecution d’un programme par la carte aliment´ee sur
USB) ne r´einitialise pas le microcontrˆoleur.
tions plus confortablement. Bien entendu l`a encore la configuration devra ˆetre adapt´ee `a la version
du STM32 utilis´e 4.
4.3 Compilation de programme
La compilation des fichiers .c ainsi que la g´en´eration du fichier au format ELF se fait `a l’aide
des commandes suivantes :
1 armnonee a bi gcc O0 g3 DSTM32F1 Wall Wextra \
I$ {CM INC} −I$ {CM INC}/ lib openc m3 / stm32 I $ {CM INC}/ li bo pe ncm3 / stm32 / f 1 \
3fnocommon mthumb msoftfloat mcpu=co rt ex m3 o main . o c main . c
5 armnonee a bi gcc o main . e l f main . o lopencm3 stm32f1 \
L${CM LIB}/thumb2 l c lnosys L${CM LIB} −L${CM LIB}/ l i b / stm32 \
7Tlibopencm3 stm32 . ld nostartfiles
Nous y activons quelques warnings pour la compilation, ajoutons les en-tˆetes et la libopencm3 stm32f1.a.
Nous en profitons pour ajouter ´egalement la libc qui va permettre d’utiliser des fonctions telles
que sprintf().
Selon que openOCD ou stm32flash soit utilis´e, il faudra g´en´erer un fichier au format hexad´ecimal
ou binaire.
1 armnonee a bi objcopy Oihex main . e l f main . hex
armnonee a bi objcopy Obinary main . e l f main . b in
5 Premier exemple : faire clignoter une LED
Pour ne pas faillir `a la r´egle, la d´ecouverte du STM32 va se faire en pilotant une broche.
Quelle que soit l’application, le STM32 par d´efaut est cadenc´e par son oscillateur interne, peu
pr´ecis en fr´equence : nous allons donc passer sur le quartz 8 MHz, nous autorisant ainsi `a cadencer
le microcontrˆoleur `a la vitesse de 72 MHz (au maximum) par multiplication interne. Cadencer le
STM32 `a 72MHz n’est pas une obligation. La r´eduction de la vitesse des horloges (utilisation d’un
4. dans /usr/share/openocd/scripts et ses sous r´epertoires (interface pour les sondes, board pour les cartes).
5
1 / 29 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !