Microcontroeluers Avancés
Microcontroeluers Avancés
Microcontroeluers Avancés
Pr DIOURI Omar
Email : diouri@upf.ac.ma 1
Année Universitaire 2022/2023
Chapitre 1 : Généralités sur les microcontrôleurs
1 Du microprocesseur au microcontrôleur
Le microprocesseur :
• Reçoit de l’information de l’extérieur
• Traite l’information
• Renvoie de l’information à l’extérieur
Le microcontrôleur est
constitue de :
- CPU (Microprocesseur)
- RAM
- Flash (Mémoire
programme)
- Oscillateur interne
- Timer
- Convertisseur
Analogique/Numérique
- Blocs de communication
série
- …
Microcontrôleur
ROM RAM
Si temp > 30°C
Démarrer Ventilo
Oscillateur
Processeur
Interne
Démarrage
ON 31°C > 30°C
du ventilateur
Convertisseur
Entrées/Sorties Analogique/
Numérique 31°C
Un microcontrôleur est un circuit intégré qui rassemble les éléments essentiels d'un ordinateur :
o Processeur
o Mémoires (mémoire morte pour le programme, mémoire vivre pour les données)
o Unités périphériques et interfaces d’entrées-sorties…
Pourquoi le microcontrôleur ?
o Plus haut degré d'intégration
o Taille réduite
o Plus faible consommation électrique
o Coût réduit par rapport aux microprocesseurs polyvalents utilisés dans les ordinateurs
personnels.
Les microcontrôleurs sont fréquemment utilisés dans les systèmes embarqués, comme les
contrôleurs des moteurs automobiles, les systèmes à énergie renouvelables, les télécommandes,
les appareils de bureau, l'électroménager, les jouets, la téléphonie mobile, etc.
Cours : Microcontrôleurs avancés 5
Chapitre 1 : Généralités sur les microcontrôleurs
4 Comparaison
µP µC
Fréquence Max = 5GHz Max = 200 MHz
Volume Mémoire Min = 64Mo Max = 256ko
Flash Min = 128Mo Max = 2Mo
OS Linux, Windows, Aucun ou Linux
… ou RTOS
Traitement Complexe Simple
Consommation Elevée Réduite
Graphique HD ¼ VGA
Bit = Bit
Byte = Octet
8 bits = 1 Byte
Comme toutes les données sont échangées (bus de 8 lignes), le bus est surchargé et la
communication est très lente et inefficace.
• Le CPU peut lire une instruction et accéder aux données de la mémoire en même temps.
• Du fait que le programme (ROM) et des données temporaires (RAM) sont séparées, le
processeur peut exécuter deux instructions à la fois.
Il est important de dire que les instructions ne sont pas exécutées au rythme imposé par
l'oscillateur lui-même, mais plusieurs fois plus lent. Cela arrive, parce que chaque instruction est
exécutée en plusieurs étapes. Dans certains microcontrôleurs, le même nombre de cycles est
nécessaire pour exécuter toutes les instructions, alors que dans d'autres, le nombre de cycles est
différent selon les instructions.
Un Timer est un périphérique matériel permettant de mesurer des durées (généralement inclus
dans les microcontrôleurs). Son rôle est de permettre la synchronisation des opérations que le
microcontrôleur est chargé d'effectuer.
Les timers sont des compteurs formés généralement d’un pré-diviseur suivi d’un registre compteur
de 8 ou 16 bits. L’entrée d’horloge peut être interne (mode timer) ou externe (mode compteur
d’événements). Lorsque le registre compteur atteint sa valeur maximale et repasse à 0, un bit
indicateur (flag) sera positionné et une interruption pourra être générée, informant ainsi la CPU du
débordement du timer. Il faut bien noter que le programmeur devra remettre à zéro cet indicateur
après chaque débordement.
Le microcontrôleur PIC16F877 dispose de trois timers appelés Timer0, Timer1 et Timer2
Un diviseur est un dispositif électronique utilisé pour réduire la fréquence par un facteur
prédéterminé. Afin de générer une impulsion sur sa sortie, il est nécessaire de porter 1, 2, 4 ou
plusieurs impulsions sur son entrée. La plupart des microcontrôleurs ont un ou plusieurs
prescalers construits et leur facteur de division peut être modifié à partir du programme.
La modulation en largeur d'impulsions (MLI) (en anglais : Pulse Width Modulation : PWM), est
une technique couramment utilisée pour synthétiser des signaux pseudo analogiques à l'aide de
circuits à fonctionnement tout ou rien, ou plus généralement à états discrets.
Elle sert à générer un signal pseudo analogique à partir d'un environnement numérique ou
analogique pour permettre un traitement de ce signal par des composants en commutation (se
comportant comme des interrupteurs ouverts ou fermés).
Le principe général est qu'en appliquant une succession rapide d'états discrets avec des ratio de
durée bien choisis, on peut obtenir en ne regardant que la valeur moyenne du signal n'importe
quelle valeur intermédiaire.
Les usages les plus fréquents :
•La conversion numérique-analogique
•Les alimentations à découpage
•Les variateurs de vitesse
•Plus généralement tous les dispositifs d'électronique de puissance utilisant des composants en
commutation de type MOSFET, IGBT, GTO.
Il est aussi possible de faire de la transmission de données par cette méthode.
Cours : Microcontrôleurs avancés 17
Chapitre 1 : Généralités sur les microcontrôleurs
9 Modulation en largeur d'impulsions Principe de fonctionnement
Une porteuse triangulaire est comparée à un signal de consigne, par exemple une sinusoïde. Le
signal de consigne doit avoir une fréquence bien plus petite que la porteuse. Le signal de sortie est
au niveau haut (disons 5 V) lorsque la consigne est supérieure à la porteuse, au niveau bas (0 V)
dans le cas contraire. On considère le cas d'un signal de consigne à valeurs positives. Pour traiter un
signal alternatif, il suffira de lui appliquer un décalage.
Les signaux externes sont généralement différents de ceux du microcontrôleur (uns et de zéros) et
doivent être convertis en valeurs compréhensibles pour le microcontrôleur. Un convertisseur
analogique-numérique est un circuit électronique qui convertit les signaux continu en numériques.
En d'autres termes, ce circuit convertit une valeur analogique en un nombre binaire et le transmet au
CPU pour un traitement ultérieur.
Pour courte distance : Montage en parallèle entre le microcontrôleur et les périphériques via PORTS
input/output est la solution idéale
Pour une longue distance, il est nécessaire d’établir une communication série entre deux
périphériques.
L’utilisation de la communication série dépend de nombreux facteurs, dont les plus importants sont :
• Combien de périphériques, le microcontrôleur
doit-il échanger des données avec eux ?
• Quelle est la vitesse d’échange de données ?
• Quelle est la distance entre les appareils ?
• Est-ce qu’il est nécessaire d'envoyer et de
recevoir simultanément les données ?
Cours : Microcontrôleurs avancés 23
Chapitre 1 : Généralités sur les microcontrôleurs
11 Transmission de données
Transmission Parallèle :
Les bits sont envoyés simultanément sur N voies différentes. Il faut autant
de lignes de transmission que de bits à transmettre, plus une équipotentielle zéro, plus un signal
dit échantillonnage, et un signal d’acquittement.
Transmission Série : cette transmission permet de transmettre les données sur un seul support
physique. La transmission se fait en émettant les bits de données les uns après les autres. Le
problème majeur de ce mode de transmission est la synchronisation des horloges.
❑Transmission Synchrone
▪ Cette méthode permet d’envoyer une trame (bloc de bits d’information) sous la forme d’un flot
continu de bits sans bit de synchronisation START et STOP.
▪ La synchronisation est obtenu à l’aide d’un signal d’horloge (généralement sur une ligne
séparée).
❑Transmission Asynchrone
▪ Cette méthode permet de transmettre les bits par groupes (caractères) ce qui permet au récepteur
de se synchroniser au début de chaque caractère.
▪ L’intervalle de temps qui sépare deux émissions de caractères est aléatoire et dépend de
l’émetteur.
▪ Exemple une trame peut être constituée d’un bit START, 5 à 8 bits de données, un bit de parité et
de deux bits STOP.
❑Modes d’exploitation
La ligne de transmission peut être exploitée de trois manière :
▪ Simplex : mode unidirectionnel, la communication de l’émetteur vers le récepteur. (Exemple : la
radiodiffusion telle la radio FM).
▪ Half-duplex : la communication se fait dans les deux sens mais pas simultanément. ( Exemple :
Talkies-walkies, l’un parle (l’autre ne peut parler en même temps) et lorsqu'il lâche le bouton
(signal de fin de conversation) l’autre peut parler à son tour.)
▪ Full-duplex : mode bidirectionnel simultané sur le même support physique. (Exemple :
conversation téléphonique, les deux interlocuteurs peuvent parler en même temps)
Diagramme UART
Définition
▪ SPI (Serial Peripheral Interface) est un bus de données série synchrone qui opère en mode full-
duplex.
▪ Les circuits communiquent selon un schéma maître-esclaves, où le maître contrôle la
communication.
▪ Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se
fait par une ligne dédiée entre le maître et l'esclave appelée Slave Select (SS).
▪ Système de communication série qui utilise jusqu'à quatre fils conducteurs.
▪ L’un des conducteurs est utilisé pour la réception, autre pour l’envoi de données, un pour la
synchronisation et l'autre permet de sélectionner un périphérique pour que le maitre peut
communiquer avec ce périphérique.
Cours : Microcontrôleurs avancés 31
Chapitre 1 : Généralités sur les microcontrôleurs
11 Transmission de données SPI
montage
Interface
Un seul
esclave
actif à
la fois
Fonctionnement
Une transmission SPI typique est une communication simultanée entre un maître et un esclave :
•Le maître génère l'horloge et sélectionne l'esclave avec qui il veut communiquer par l'utilisation
du signal SS
•L'esclave répond aux requêtes du maître
À chaque coup d'horloge le maître et l'esclave s'échangent un bit. Après huit coups d'horloges le
maître a transmis un octet à l'esclave et vice versa. La vitesse de l'horloge est réglée selon des
caractéristiques propres aux périphériques.
Avantages
•Communication Full duplex, point à point.
•Débit plus important qu'un bus I2C (jusqu’à 20 Mbits/s pour SPI)
•Flexibilité du nombre de bits à transmettre ainsi que du protocole en lui-même
•Simplicité de l'interface matérielle
• Aucun arbitre nécessaire car aucune collision possible
• Les esclaves utilisent l'horloge du maître et n'ont donc pas besoin d'oscillateur propre
• Pas de physique (codage) nécessaire
•Partage d'un bus commun pour l'horloge, MISO et MOSI entre les périphériques
inconvénients
•Utilise plus de broches par rapport à I2C ou UART qui en utilisent seulement deux.
•Aucun adressage possible, il faut une ligne de sélection par esclave en mode non chaîné.
•Le protocole n'a pas d'acquittement. Le maître peut parler dans le vide sans le savoir.
•La plupart des implémentations ne tolèrent la présence que d'un seul maître SPI sur le bus.
•Ne s'utilise que sur de courtes distances contrairement aux liaisons RS232, RS485 ou bus CAN.
Définition
I2C : Inter Integrated Circuit
• Le but de ce protocole est de faire communiquer entre eux des composants électronique très
divers grâce à seulement 2 fils : Signal de donnée : SDA et signal d’horloge : SCL
• Système d'échange de données série entre les microcontrôleurs et des circuits intégrés
spécialisés
• Il est utilisé lorsque la distance entre eux est courte (émetteur et récepteur)
• Microcontrôleur peut communiquer avec 112 appareils différents.
Atmega328p-AU
Atmega328p-PU
•E/S (=GPIO) :
PORTB (8),
PORTC (7),
PORTD (8)
Le cœur AVR combine un riche jeu d'instructions avec 32 registres de travail à usage général.
Tous les 32 registres sont directement connectés à l'unité arithmétique et logique (UAL),
permettant d'accéder à deux registres indépendants en une seule instruction exécutée en un
cycle d'horloge. L'architecture résultante est plus efficace en termes de code tout en atteignant
des débits jusqu'à dix fois plus rapides que les microcontrôleurs CISC conventionnels.
La technique de pooling consiste à l’utilisation normale de la boucle loop() sans faire appel aux
interruptions. On scrute les entrées d’une façon itérative puis on déclenche les sorties (actions)
en fonctions des entrées. Le temps de mise à jour des sorties dépend étroitement du moment de
l’apparition de l’évènement.
Exemples: surintensité dans un moteur détecté par un capteur, robot à proximité du mure, etc.)
Une latence peut entrainer des conséquences graves.
Si par exemple l’évènement est apparu au début du programme, mais le traitement du défaut se
trouve à la fin de la boucle loop dans un programme constitué de 200 lignes d’une durée totale
d’une seconde (le temps d’exécution de la fonction loop()). Dans ces conditions, la gestion de
l’évènement ne sera effectuée qu’après une secondes !
Une interruption comme définition est un événement qui permet d’interrompre le programme
principal (la fonction loop() ) pour exécuter la fonction (ou routine) d’interruption. Lorsqu’une
interruption est désactiver (ou masquer), la fonction loop() qui sera exécuter par défaut d’une
façon infinie. Dans le cas échéant, la routine d’interruption se déclenche dès l’apparition d’un
évènement.
Un événement peut être un signal électrique Tout Ou Rien (TOR) issu d’un détecteur qui se trouve à
l’extérieur de la carte Arduino dites évènement matériel. Il peut être aussi, logiciel, générer par un
périphérique propre au Microcontrôleur. (Exemple : débordement d’un TIMER (Overflow),
réception par liaison UART, liaison I2C, fin de conversion du convertisseur A/N, etc.).
Configure le pin dédié en entrée en utilisant la fonction pinMode() ou bien le registre DDRx en
positionnant le bit concerné à « 0 ».
La validation d’une interruption spécifique est opérée dans le registre EIMSK et positionner le
bit concerné à ‘1’. Le nombre des interruptions va dépendre du type de la carte (nano, mini, mega,
etc.). Consulter le datasheet pour être sure des interruptions disponibles. Dans le cas de la carte
arduino Mega, il dispose de 8 interruptions INT0-INT7, par contre, deux pour Arduino uno (INT0
et INT1) seulement!
D’une autre façon, comment la routine d’interruption sera réveillée lorsqu’un évènement se présent
dans le pin dédié (par front ou niveau logique). Le registre EICRA permet de configurer le mode de
déclanchement des interruptions INT0, INT1.
Dans notre exemple, on utilise
l’interruption INT0 alors les bits
ISC01 et ISC00 qui sont
concernés. Dans le cas de
déclanchement par front
montant, il faut positionner les
deux bits à ‘1’. Autrement dit il
faut charger le registre EICRA
avec 0x03 de la façon suivante:
EICRA|=0x03;
Interrupt sub-routine (ISR) est la fonction par défaut utiliser pour programmer les
interruptions. Elle ne prend aucun argument en entrée et elle ne retourne aucun résultat. En
revanche, il faut bien préciser le vecteur d’interruption. Chaque interruption dispose d’un vecteur
qui lui est propre. La carte Arduino Uno dispose de 26 interruptions, chaque interruption est
caractérisée par son vecteur et adresse. Vous pouvez dupliquer la fonction autant de fois, il faut
juste préciser le vecteur pour différencier entre les routines.
Exemple :
Exercice :
L’objectif de l’exemple sera de diviser la fréquence d’un signal PWM par 2 en utilisant
l’interruption externe INT0. Ensuite, générer une sortie PWM synchrone ayant ½ la fréquence du
signal PWM. Utiliser le pin 3 de la carte Arduino pour générer le signal PWM de référence. Ce
dernier sera ensuite câblé avec le pin 2 de la même carte. La routine de l’interruption sera exécutée
à la présence d’un évènement dans le pin 2 de la carte Arduino.
Dans cet exemple, on utilisera la détection par front montant. Dès la présente d’un front montant sur
le pin, on inverse l’état du pin 12.
Microchip PIC16 (1990, 8 Microchip PIC12 (1990, Atmel AVR (2000, 8/16 bits,
bits, 1MHz, quelques très utilisé en DIY) base des Arduino)
registres)
ARM (2000) : Cœurs communs, différents SoC Freescale, Broadcom, TI etc. (2010,
constructeurs (ST, Texas Instruments, Raspberry Pi)
Microchip. . .)
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)
Toute communication entre le cœur 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
•Advanced lines:
• 180 MHz CPU/225 DMIPS, up to 2 Mbytes of dual-bank Flash memory with SDRAM
and Chrom-ART Accelerator™
• STM32F469/479 – Quad-SPI interface, LCD-TFT controller and MPI-DSI interface
• STM32F429/439 – LCD-TFT controller
• STM32F427/437 – serial audio interface, more performance and lower static power
consumption
•Foundation lines:
• STM32F446 – 180 MHz/225 DMIPS, up to 512 Kbytes of Flash memory with dual Quad-
SPI and SDRAM interfaces
• STM32F407/417 – 168 MHz CPU/210 DMIPS, up to 1 Mbyte of Flash memory adding
Ethernet MAC and camera interface
• STM32F405/415 – 168 MHz CPU/210 DMIPS, up to 1 Mbyte of Flash memory with
advanced connectivity and encryption
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/STM32CubeMX/gcc (STMicroelectronics)
•...
Exemple
Pour allumer les LEDs de la carte, il faut :
• écrire 0x00200000 à l’adresse 0x40021014,
• écrire 0x55550000 à l’adresse 0x48000000,
• écrire 0xFFFFFFFF à l’adresse 0x48001014.
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)