NSY107
Cours 1 Introduction aux microcontrôleurs
Matthias Puech
Master 1 SEMS — Cnam
6 mars 2018
1 / 29
Cours 1 Introduction aux microcontrôleurs
Introduction
Présentation des microcontrôleurs
Outils de développement
Documentation et code disponible
2 / 29
NSY107 : Thématiques abordées
Un cours pratique sur la communication embarquée
3 / 29
NSY107 : Thématiques abordées
Un cours pratique sur la communication embarquée
• programmation bare-metal sur microcontrôleurs
• architecture machine
• schémas de compilation
• notion de pilote de périphérique
• protocoles client-serveur bas niveau (UART, I2C, CAN. . .)
3 / 29
Infos pratiques
• Matthias Puech [Link]@[Link]
• Page web
[Link]
• 15 séances, et pour chacune :
É 1h–2h de cours
É 1h–2h de TP
4 / 29
Infos pratiques
• Matthias Puech [Link]@[Link]
• Page web
[Link]
• 15 séances, et pour chacune :
É 1h–2h de cours
É 1h–2h de TP
Evaluation
• N = max(TP noté, examen session 1) si N > 10
• N = examen session 2 sinon.
4 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
• quel est le type d’un tableau de flottants/fonctions en C ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
• quel est le type d’un tableau de flottants/fonctions en C ?
• combien vaut (1 « 4) | (1 « 7) ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
• quel est le type d’un tableau de flottants/fonctions en C ?
• combien vaut (1 « 4) | (1 « 7) ?
• comment écrit-on une cible et ses dépendances dans un
Makefile ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
• quel est le type d’un tableau de flottants/fonctions en C ?
• combien vaut (1 « 4) | (1 « 7) ?
• comment écrit-on une cible et ses dépendances dans un
Makefile ?
• qu’est-ce que UART ? I2C ? CAN ?
5 / 29
Pour commencer : quiz !
• citer 2 compilateurs natifs ? 2 machines virtuelles ?
• qu’est-ce un ARM ? un RISC ? un registre ?
• qu’est-ce qu’une interruption ?
• que fait l’option -o de GCC ?
• qu’est-ce que le scheduler dans un OS ? un driver ?
• quel est le type d’un tableau de flottants/fonctions en C ?
• combien vaut (1 « 4) | (1 « 7) ?
• comment écrit-on une cible et ses dépendances dans un
Makefile ?
• qu’est-ce que UART ? I2C ? CAN ?
• qu’est-ce que ASK, FSK, PSK, QPSK ?
5 / 29
Cours 1 Introduction aux microcontrôleurs
Introduction
Présentation des microcontrôleurs
Outils de développement
Documentation et code disponible
6 / 29
Cours 1 Introduction aux microcontrôleurs
Introduction
Présentation des microcontrôleurs
Outils de développement
Documentation et code disponible
7 / 29
Qu’est-ce qu’un microcontrôleur ?
Attention
Aujourd’hui, séance principalement consacrée au name-dropping.
8 / 29
Qu’est-ce qu’un microcontrôleur ?
Attention
Aujourd’hui, séance principalement consacrée au name-dropping.
Microcontrôleur (µC, uC, MCU)
Circuit intégré rassemblant les éléments essentiels d’un ordinateur
• unité de calcul et de contrôle (le coeur)
• mémoire vive
• périphériques
(ex : port série, timers, DMA, flash. . .)
• entrées/sorties
(ex : convertisseurs analogique ↔ numérique (ADC/DAC))
8 / 29
Exemples d’utilisation
Electroménager & Internet of Things
• montres connectées, bracelets santé
• capteurs domotiques, four, machine à laver, thermostat. . .
• smartphones, tablettes
Automobile, Aeronautique
• une voiture moderne intègre ≈30 MCUs
• logiciel critique dans l’avionique (cf. reste du master)
Un foyer moyen possède 4 CPUs et 30 MCUs.
9 / 29
Quelques MCUs fameux dans leur habitat naturel
• Microchip PIC16 (1990, 8 bits, 1MHz, quelques registres)
• Microchip PIC12 (1990, très utilisé en DIY)
• Atmel AVR (2000, 8/16 bits, base des Arduino)
10 / 29
Quelques MCUs fameux dans leur habitat naturel
• ARM (2000) : Coeurs communs, différents constructeurs (ST,
Texas Instruments, Microchip. . .)
• SoC Freescale, Broadcom, TI etc. (2010, Raspberry Pi)
1GHz, 64 bits, RAM 512 Mo
10 / 29
Le MCU, un compromis
L’intérêt
• forte intégration (une puce intègre toutes les fonctions)
• faible consommation électrique (1–500mW)
• faible coût (0.10–10€)
• généricité (par rapport au silicium dédié)
11 / 29
Le MCU, un compromis
L’intérêt
• forte intégration (une puce intègre toutes les fonctions)
• faible consommation électrique (1–500mW)
• faible coût (0.10–10€)
• généricité (par rapport au silicium dédié)
Les limitations
• peu de capacité de calcul (1–200 MHz)
• très faible stockage (1–512 Ko RAM, 1K–1M flash)
11 / 29
Un MCU n’est pas :
• un CPU (Central Processing Unit)
(ex : Intel i7, Apple A11, . . .)
É puissance de calcul supérieure (GHz)
É pas de mémoire embarquée (quelques registres)
É pas de périphériques embarqués (bus externes)
• un FPGA (Field-Programmable Gate Array)
(ex : Xilinx, Altera. . .)
É circuit intégré reconfigurable
É grand nombre de portes logiques généralistes
É “programmation” en Verilog/VHDL
12 / 29
Protocoles de communication embarqués
Toute communication entre le coeur et ses périphériques s’établit
selon un protocole (une langue commune)
Interne
bus de données : unité de calcul ↔ RAM ↔ DMA,
Externe
communication avec puces externes ; communication inter-MCU
(ex : réseau de capteurs)
Architectures
symétrique, en réseaux, client-serveur. . .
en général : couches de nombreux protocoles
Exemple
UART, SPI, I2C, CAN, USB. . .
13 / 29
La famille des ARM Cortex
ARM architecture qui spécifie (notamment) un jeu
d’instructions RISC, l’organisation de la mémoire,
modèle d’exécution. . .
Différentes versions du standard : ARMvX-M
14 / 29
La famille des ARM Cortex
ARM architecture qui spécifie (notamment) un jeu
d’instructions RISC, l’organisation de la mémoire,
modèle d’exécution. . .
Différentes versions du standard : ARMvX-M
Cortex Famille de coeurs physiques
vendus aux fabricants de silicone
Cortex-A pour Application (ex : smartphones)
Cortex-R pour Real-time
(temps d’exécution déterministe)
Cortex-M pour eMbedded (faible consommation)
14 / 29
La famille des ARM Cortex
ARM architecture qui spécifie (notamment) un jeu
d’instructions RISC, l’organisation de la mémoire,
modèle d’exécution. . .
Différentes versions du standard : ARMvX-M
Cortex Famille de coeurs physiques
vendus aux fabricants de silicone
Cortex-A pour Application (ex : smartphones)
Cortex-R pour Real-time
(temps d’exécution déterministe)
Cortex-M pour eMbedded (faible consommation)
M0 ARMv6-M, petit et pas
cher
M3 ARMv7-M, *,/ hardware,
plus d’instructions
M4 ARMv7E-M, FPU, DSP
14 / 29
La famille des ARM Cortex
ARM architecture qui spécifie (notamment) un jeu
d’instructions RISC, l’organisation de la mémoire,
modèle d’exécution. . .
Différentes versions du standard : ARMvX-M
Cortex Famille de coeurs physiques
vendus aux fabricants de silicone
Cortex-A pour Application (ex : smartphones)
Cortex-R pour Real-time
(temps d’exécution déterministe)
Cortex-M pour eMbedded (faible consommation)
M0 ARMv6-M, petit et pas
cher
M3 ARMv7-M, *,/ hardware,
plus d’instructions
M4 ARMv7E-M, FPU, DSP
Licences Cortex-M4
Atmel, STMicroelectronics, NXP, Texas Instruments
14 / 29
La famille des MCU STMicroelectronics STM32
STM32L0 Cortex M0+, 32MHz, 8Ko SRAM, 32-64Ko flash
STM32F1 Cortex M1, 24-72MHz, 4-96Ko SRAM, 16-1024Ko
STM32F3 Cortex M4 + FPU, 72MHz, 16-40Ko SRAM, 64-256Ko
. . .STM32F7 ARM Cortex-M7F, 216MHz, 512-1024Ko RAM, . . .
15 / 29
La famille des MCU STMicroelectronics STM32
STM32L0 Cortex M0+, 32MHz, 8Ko SRAM, 32-64Ko flash
STM32F1 Cortex M1, 24-72MHz, 4-96Ko SRAM, 16-1024Ko
STM32F3 Cortex M4 + FPU, 72MHz, 16-40Ko SRAM, 64-256Ko
. . .STM32F7 ARM Cortex-M7F, 216MHz, 512-1024Ko RAM, . . .
Chaque famille contient divers périphériques (E/S, calcul, . . .) :
• 2xADC multiplexé, 2xDAC 12/16 bits
• USART, SDIO, I2C, SPI, USB, . . .
• EEPROM, flash, ROM. . .
• DMA, timers, watchdogs, RTC, RNG. . .
15 / 29
La famille des MCU STMicroelectronics STM32
STM32L0 Cortex M0+, 32MHz, 8Ko SRAM, 32-64Ko flash
STM32F1 Cortex M1, 24-72MHz, 4-96Ko SRAM, 16-1024Ko
STM32F3 Cortex M4 + FPU, 72MHz, 16-40Ko SRAM, 64-256Ko
. . .STM32F7 ARM Cortex-M7F, 216MHz, 512-1024Ko RAM, . . .
Chaque famille contient divers périphériques (E/S, calcul, . . .) :
• 2xADC multiplexé, 2xDAC 12/16 bits
• USART, SDIO, I2C, SPI, USB, . . .
• EEPROM, flash, ROM. . .
• DMA, timers, watchdogs, RTC, RNG. . .
Applications
• DSP audio (ADC/DAC)
• contrôle de moteur, prototypage généraliste
(ex : Arduino, cartes Nucleo/Discovery)
15 / 29
La série des STM32F3
STM32F3 plusieurs sous-familles :
STM32F301, STM32F302, STM32F303 généralistes,
différents périphériques analogiques
(contrôle de moteur)
STM32F334 timer haute résolution (217
picosecondes)
STM32F373 16-bit sigma-delta ADC et ampli-ops
intégrés
STM32F3x8 marche à 1.8V au lieu de 3.3V
16 / 29
La série des STM32F3
STM32F3 plusieurs sous-familles :
STM32F301, STM32F302, STM32F303 généralistes,
différents périphériques analogiques
(contrôle de moteur)
STM32F334 timer haute résolution (217
picosecondes)
STM32F373 16-bit sigma-delta ADC et ampli-ops
intégrés
STM32F3x8 marche à 1.8V au lieu de 3.3V
. . .chacuns dans différents choix de RAM, flash et packages :
LQFP32 , LQFP100 , UFBGA100 ...
16 / 29
Les cartes d’essai
Si vous voulez étudier les MCUs ou faire du prototypage rapide,
pas besoin de concevoir une carte à chaque fois, il existe de
nombreuses cartes d’essai.
• produits d’appel pour les fabricants, donc très bon marché
(≈20€)
• divers périphériques embarqués : capteurs, écrans, réseau,
audio. . .
• programmation facile (interface USB)
17 / 29
La carte STM32F3-discovery
• STM32F303 : 72MHz,
48Ko RAM, 256Ko flash
• documentation et schéma
• programmeur USB intégré
ST-Link
• (presque) toutes les pattes
du MCU accessibles sur
header
• périphériques externes :
É port USB utilisateur
É alimentation par USB ou
externe (pile)
É accéléromètre/boussole
3D
É gyroscope
É 10 LEDs
É 1 bouton utilisateur
18 / 29
Cours 1 Introduction aux microcontrôleurs
Introduction
Présentation des microcontrôleurs
Outils de développement
Documentation et code disponible
19 / 29
Présentation
Programme C :
int main() {
RCC→AHBENR |= (1 « 21); /∗ enable GPIO E clock ∗/
GPIOE→MODER |= 0x55550000; /∗ configure E8−E15 for output ∗/
RCC→AHBENR |= (1 « 17); /∗ enable GPIO A clock ∗/
GPIOA→MODER |= 0x00000000; /∗ configure A0 for digital input ∗/
while(1) {
if (!(GPIOA→IDR & 0x00000001))
GPIOE→ODR ^= 0x0000FF00; /∗ invert pin 8−15 to 1 ∗/
delay();
}
}
20 / 29
Présentation
. . .compilé vers assembleur ARMv7 :
main:
push {r7, lr }
add r7, sp, #0
ldr r2, .L9
ldr r3, .L9
ldr r3, [r3, #20]
orr r3, r3, #2097152
str r3, [r2, #20]
ldr r2, .L9+4
ldr r3, .L9+4
ldr r3, [r3]
orr r3, r3, #1426063360
orr r3, r3, #5570560
20 / 29
Présentation
. . .assemblé en binaire :
0000000: ff9f 0020 ed03 0008 3d04 0008 3d04 0008 . . . . . . .=. . . =. . .
0000010: 3d04 0008 3d04 0008 3d04 0008 0000 0000 =. . . =. . . =. . . . . . .
0000020: 0000 0000 0000 0000 0000 0000 3d04 0008 . . . . . . . . . . . . =. . .
0000030: 3d04 0008 0000 0000 3d04 0008 3d04 0008 =. . . . . . .=. . . =. . .
0000040: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
0000050: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
0000060: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
0000070: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
0000080: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
0000090: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
00000a0: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
00000b0: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
00000c0: 3d04 0008 3d04 0008 3d04 0008 3d04 0008 =. . . =. . . =. . . =. . .
20 / 29
Présentation
. . .téléchargé sur la carte par SWD (Single Wire Debug) :
# st−flash write [Link] 0x8000000
st−flash 1.3.0
2017−02−20T[Link] INFO: Loading device parameters. . . .
2017−02−20T[Link] INFO: Device connected is: F3 device, id 0x10036422
2017−02−20T[Link] INFO: SRAM size: 0xa000 bytes (40 KiB), Flash:
0x40000 bytes (256 KiB) in pages of 2048 bytes
2017−02−20T[Link] INFO: Attempting to write 2540 (0x9ec) bytes to stm32
address: 134217728 (0x8000000)
Flash page at addr: 0x08000800 erased
2017−02−20T[Link] INFO: Finished erasing 2 pages of 2048 (0x800) bytes
2017−02−20T[Link] INFO: Starting Flash write for VL/F0/F3 core id
2017−02−20T[Link] INFO: Successfully loaded flash loader in sram
1/1 pages written
2017−02−20T[Link] INFO: Starting verification of write complete
2017−02−20T[Link] INFO: Flash written and verified! jolly good!
#
20 / 29
Présentation
Le système est maintenant indépendant, peut être déconnecté de
l’USB, alimenté (par pile, transfo. . .) et interagir avec son
environnement par ses broches et ses composants (LEDs etc.)
20 / 29
Présentation
[optionnel] déboguage :
# arm−none−eabi−gdb [Link] −−eval−command="target remote
localhost:4242"
GNU gdb (GNU Tools for ARM Embedded Processors) 7.10.1.20160923−cvs
Remote debugging using localhost:4242
0x080003ec in Reset_Handler ()
(gdb) br main.c:18
Breakpoint 1 at 0x800025c: file main.c, line 18.
(gdb) c
Continuing.
Breakpoint 1, main () at main.c:19
19 if (!(GPIOA→IDR & 0x00000001))
(gdb) n
20 GPIOE→ODR ^= 0x0000FF00; /∗ invert pin 8−15 to 1 ∗/
(gdb)
21 delay();
(gdb)
20 / 29
Modèle d’execution
Le coeur ARM : une machine load/store
• ≈ 30 registres de 32 bits
(ex : R0-R12, SP, PC)
• cycle fetch/decode/execute (avec pipelining basique)
• des instructions qui changent l’état des registres
(ex : add, bl)
• des instructions qui lisent/écrivent dans la mémoire
(ex : ldr, str)
• . . .et c’est tout !
Toute l’interaction avec le monde extérieur (périphériques) se fait
par écriture dans des cases de mémoire spéciales.
21 / 29
Registres des Cortex-M
22 / 29
L’espace d’adressage des Cortex-M
Il y a un niveau d’indirection entre mémoire RAM et addresses
mémoires : c’est le mécanisme de mémoire virtuelle.
• On peut “addresser” (lire/écrire avec les instructions
load/store) n’importe quelle addresse mémoire entre
0x00000000 et 0xEFFFFFFF
→ 4Go d’adresses
• toutes ces cases mémoire ne correspondent pas à la RAM !
→ notion d’espace d’adressage (spécification Cortex-M)
L’espace d’adressage des Cortex-M
L’espace d’adressage des Cortex-M
L’espace d’adressage des Cortex-M
Example
Pour allumer les LEDs de la carte, il faut :
• écrire 0x00200000 à l’adresse 0x40021014,
• écrire 0x55550000 à l’adresse 0x48000000,
• écrire 0xFFFFFFFF à l’adresse 0x48001014.
Le manuel de référence du STM32F303 décrit tous ces registres. 1
1. Attention, sens de “registre” différent du dernier slide : adresse mémoire
fictive correspondant à une fonction précise d’un périphérique.
23 / 29
L’espace d’adressage des Cortex-M
Example
Pour allumer les LEDs de la carte, il faut :
• écrire 0x00200000 à l’adresse 0x40021014,
• écrire 0x55550000 à l’adresse 0x48000000,
• écrire 0xFFFFFFFF à l’adresse 0x48001014.
Le manuel de référence du STM32F303 décrit tous ces registres. 1
A retenir
• La mémoire flash commence à 0x08000000
1. Attention, sens de “registre” différent du dernier slide : adresse mémoire
fictive correspondant à une fonction précise d’un périphérique.
23 / 29
Comment développer pour les ARM STM32 ?
Langages
C ou C++. . .
(ou tout langage compilant vers ARMv7)
Environnements de développement
Il en existe plusieurs (IDE, compilateur, debugger etc.) :
• Keil IDE / ArmCC (Keil),
• IAR Embedded Workbench (IAR),
• mBed (ARM)
• SW4STM/Eclipse/CubeMX/gcc (STMicroelectronics)
• ...
• gcc/gdb/make/emacs :)
24 / 29
Librairies
. . .et plusieurs façons d’accéder aux registres pour
configurer/interagir avec les périphériques :
• CMSIS (ARM)
(paraphrase du manuel de référence)
• HAL (STMicroelectronics) (bibliothèque d’abstraction matérielle)
• mBed (ARM)
• FreeRTOS
(système d’exploitation embarqué temps réel)
25 / 29
CMSIS Cortex Microcontroller Software Interface Standard
Une surcouche très légère au dessus du matériel pour faciliter la
programmation en C. Ensemble de macros qui donnent des noms :
• aux registres des périphériques
• à leurs valeurs possibles
Example
RCC→AHBENR |= RCC_AHBENR_GPIOEEN_Msk;
au lieu de :
0x40021014 |= 0x00200000;
Confère
stm32f303xc.h dans le code fourni
26 / 29
HAL Hardware Abstraction Layer
Bibliothèque de plus haut niveau (STMicroelectronics), qui cherche
à s’abstraire des caractéristiques techniques de chaque MCU
+ code plus clair
+ plus portable
− pas forcément plus concis
− nombreux bugs !
Example
__HAL_RCC_GPIOE_CLK_ENABLE();
au lieu de :
RCC→AHBENR |= RCC_AHBENR_GPIOEEN_Msk;
27 / 29
Cours 1 Introduction aux microcontrôleurs
Introduction
Présentation des microcontrôleurs
Outils de développement
Documentation et code disponible
28 / 29
Documentation de référence
• Page d’accueil du STM32F303
[Link]
É manuel de référence du STM32F303
(registres, périphériques)
É datasheet du STM32F303
(fonctions de chaque broche)
É manuel utilisateur de la carte d’essai STM32F3-Discovery
(schéma de la carte)
• Mastering STM32, Carmine Noviello (payant)
[Link]
29 / 29