Cours 2
Cours 2
+
Ecriture des pilotes des périphériques
CHIRAZ TRABELSI
• Trois principales méthodes pour prendre en compte le changement d’état des entrées (exemple appui sur un
bouton)
1) La scrutation (polling)
• Scruter l’état de l’Entrée
• Exemple sur Ordinateur: Pour savoir si l’utilisateur a tapé un caractère, le processeur surveille le
registre d’état du clavier
• Exemple sur Arduino: un programme qui allume la LED quand le bouton est relâché et l’éteint
quand le bouton est appuyé
Scrutation de l’état
du bouton dans une
boucle
2
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Lecture des entrées
• Inconvénients de la scrutation
• Le temps de scrutation peut avoir un impact non négligeable sur le temps d’exécution du
programme qui fait d’autres tâches non liées au changement de l’entrée
• Si les autres tâches durent assez longtemps et que le signal à observer change très vite,
on peut rater des changements de valeurs
3
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Lecture des entrées
• Trois principales méthodes pour prendre en compte le
changement d’état des entrées (exemple appui sur un bouton)
2) Les interruptions
• L’Entrée génère une interruption
• Le contrôleur d’interruption met le processeur au courant de
l’interruption
• Le processeur interrompt ce qu’il était en train d’exécuter
• S’il y a une routine d’interruption (Interrupt Service Routine -
ISR), le processeur l’exécute
• A la fin de l’exécution de l’ISR, le processeur reprend ce instruction1
qu’il était en train d’exécuter ISR:
int main(){ instruction2 Gestionnaire _clavier
Instruction1;
Instruction2; instruction3 printf(« interruption… »);
Instruction3;
Instruction4;
Instruction5;
Arrivée d’une instruction4 lire ….
Instruction6; interruption
Instruction7;
....
printf(«caractere ….);
}
//ISR exécutée quand un bouton est appuyé instruction5 return
int gestionnaire_clavier()
{printf (“interruption clavier”); instruction6
char c= Lire(registre des donnees du clavier);
printf(“caractere lu=%c\n”,c);} instruction7 4
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Lecture des entrées
• Trois principales méthodes pour prendre en compte le changement d’état des entrées
3) Le DMA (Direct Memory Access)
• Ce mode de communication permet de transférer les données de l’Entrée directement à la mémoire
sans passer par le processeur
• L’objectif est d’accélérer le programme en libérant le processeur de cette tâche
• Exemple:
• Le processeur veut récupérer les images de la caméra (en streaming) et y appliquer un traitement
(filtrage, tracking d’objets, etc.)
• 1ère solution: sans DMA
• Le processeur doit envoyer des commandes à la caméra, récupérer les images et les stocker
dans la mémoire
Transfert de Transfert de
Caméra données CPU données Mémoire
5
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Lecture des entrées
• Trois principales méthodes pour prendre en compte le changement d’état des entrées
3) Le DMA (Direct Memory Access)
• Pour les interruptions provenant des entrées/sorties GPIO, il faut passer par l’EXTI
(Extended interrupt and event controller) qui offre 16 canaux (0 à 15) pour gérer les
interruptions sur les GPIOs
8
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 9
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
• Utilisation des interruptions
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 10
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
11
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Utilisation des interruptions
• Pour les projets sous STM32CubeIDE, les vecteurs d’interruptions sont disponibles dans le fichier
startup/startup_stm32l053r8tx.s
2) Le contrôleur EXTI est configurable en agissant sur des registres du System configuration controller
(SYSCFG)
• Il faut activer l’horloge pour le SYSCFG
RCC->APB2ENR|=1; //active l’horloge pour SYSCFG (connecté sur le bus APB2)
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 13
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
…….
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
15
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
16
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
17
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les interruptions sur les GPIOs
19
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les priorités des interruptions
20
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les priorités des interruptions
• Changement de la priorité d’une interruption
NVIC_SetPriority(EXTI4_15_IRQn,0);
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
21
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les priorités des interruptions
• Gestion des interruptions en cours
• 1er cas: priorités différentes
NVIC_SetPriority(EXTI0_1_IRQn,1);
NVIC_SetPriority(EXTI2_3_IRQn,0);
• EXTI2_3_IRQn ayant la plus haute priorité, si
EXTI0_1_IRQn et EXTI2_3_IRQn se déclenchent au
même moment, c’est EXTI2_3_IRQn qui sera traitée en
premier
22 32-bit MCUs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les priorités des interruptions
• Gestion des interruptions en cours
• 2ème cas: même priorité
NVIC_SetPriority(EXTI0_1_IRQn,0);
NVIC_SetPriority(EXTI2_3_IRQn,0);
• Ayant la même priorité, si EXTI0_1_IRQn et
EXTI2_3_IRQn se déclenchent au même moment, c’est
l’interruption ayant le plus petit numéro
(EXTI0_1_IRQn) qui sera traitée en premier
23 32-bit MCUs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Limites de la gestion par interruption
• Problème: il faut à la fois ne pas perdre les données envoyées par l’UART et traiter toutes les données
du CAN pour ce laps de temps.
Microcontrôleur
Capteur 1
analogique CAN CPU
NVIC
2 Mémoire
Clavier/Bluetooth UART
24
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Limites de la gestion par interruption
• Problème: il faut à la fois ne pas perdre les données envoyées par l’UART et traiter toutes les données du
CAN pour ce laps de temps.
• Solution1: augmenter la priorité de l’une des interruptions
Risque: on perd des données venant de celui ayant la plus basse priorité
Microcontrôleur
Capteur 1
analogique CAN CPU
NVIC
2 Mémoire
Clavier/Bluetooth UART
25
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Limites de la gestion par interruption
• Problème: il faut à la fois ne pas perdre les données envoyées par l’UART et traiter toutes les données du
CAN pour ce laps de temps.
• Solution2: utiliser un DMA (Direct Access Memory)
Avec le DMA, l’UART peut transférer ses données à la mémoire sans intervention du CPU. De
cette façon, le CPU peut continuer à gérer le CAN pour traiter par la suite les données de l’UART à
partir de la mémoire
Microcontrôleur
Capteur 1
analogique CAN CPU
NVIC
Mémoire
2
Clavier/Bluetooth UART DMA
26
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Le DMA (Direct Memory Access)
• Exemple:
• Le processeur veut récupérer les images de la caméra (en streaming) et y appliquer un traitement (filtrage,
tracking d’objets, etc.)
27
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Le DMA (Direct Memory Access)
• Sans le DMA
• Le CPU lit les données à partir des
registres du périphérique puis les stocke
dans la mémoire
• Avec le DMA
• Le contrôleur DMA lit les données à partir
des registres du périphérique puis les
stocke dans la mémoire sans
l’intervention du CPU
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
28
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Comparaison des modes de gestion des entrées sorties
• Avantage du DMA
• Libère le CPU de certaines tâches
• Evite que le CPU soit interrompu très souvent
• Plus de performance
• Inconvénients du DMA
• Un système plus complexe
• Plus de consommation d’énergie
29
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les pilotes de périphériques
• Pour faciliter l’interfaçage avec un périphérique, l’écriture d’un pilote (driver) offre des avantages:
• Faciliter la réutilisation des fonctions écrites pour le périphérique plus de productivité dans le
développement
• Cacher la complexité matérielle du périphérique faciliter le travail des non-experts
• Exemple: Arduino offre des librairies pour gérer les composants de la carte et la communication avec
certains périphériques (afficheur LCD, servomoteur, etc.)
• L’idée ici est de développer nos propres drivers en se basant sur la documentation du microcontrôleur et
des périphériques pour offrir des librairies réutilisables pour différents projets et facilement extensibles
31
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
32
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
2) Les GPIOs sont définis par des structures dans la librairie « stm32l053xx.h ». Pour le savoir, il suffit
de taper GPIOA dans le fichier main, cliquer dessus et appuyer sur F3. Cela renvoie vers la définition
suivante dans le fichier « stm32l053xx.h ».
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
• En cherchant la définition de GPIO_TypeDef dans le même fichier, on trouve la structure suivante:
typedef struct
{
__IO uint32_t MODER;
__IO uint32_t OTYPER;
__IO uint32_t OSPEEDR;
__IO uint32_t PUPDR;
__IO uint32_t IDR;
__IO uint32_t ODR;
….}GPIO_TypeDef; 33
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
#include "stm32l053xx.h"
typedef struct
{
GPIO_TypeDef * gpioPort;
uint8_t pin;
}LED_TypeDef;
34
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
Fichier « led.c »
led->gpioPort=port;
led->pin=pn;
36
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
37
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
39
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
40
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
• Pour la résistance de tirage, en cherchant dans le fichier « stm32l0xx_ll_gpio.h », on trouve les définitions suivantes:
• En suivant avec F3, on trouve que les valeurs binaires de ces trois constantes sont respectivement: 00, 01 et 10.
41
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
}BUTTON_TypeDef;
42
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
button->gpioPort = port;
button->pin = pn;
button->pull = pl;
}BUTTON_TypeDef;
44
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
• Puisqu’il s’agit d’une entrée, on ne peut pas y écrire des données, cependant on peut changer sa
configuration (changement de la valeur du champ pin ou pull, par exemple)
45
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
BUTTON_TypeDef bouton; }
}
int main(void)
{
//configuration de l'horloge du système en 16MHz
….
46
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
• Exemple de pilote pour un bouton poussoir case LL_EXTI_TRIGGER_FALLING:
//activation de l'interruption sur front descendant
• Utilisation du mode interruption dans FTSR
void Button_enableIRQ(BUTTON_TypeDef *button, uint8_t trigger) { //…..
break;
//activation de l'interruption externe case LL_EXTI_TRIGGER_RISING_FALLING:
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; //activation de l'interruption sur front montant
//….
/*chercher à quel registre EXTI de SYSCFG on doit accéder parmi //activation de l'interruption sur front descendant
les quatre disponibles*/ //….
//1-détermination du numéro d'EXTI break;}
uint8_t nb_EXTI = button->pin / 4; /*activer un vecteur d’interruption EXTI parmi les
//2-déterminer le numéro du port 0--> GPIOA, 1-->GPIOB, etc. trois vecteurs disponibles selon le numéro de pin*/
uint8_t nb_port; if (button->pin < 2) {
nb_port = ((uint32_t) button->gpioPort - IOPPERIPH_BASE) / 0x400; //activer les requêtes d’interruption EXTI0_1
//3-configuration du registre EXTI de SYSCFG NVIC_EnableIRQ(EXTI0_1_IRQn);
SYSCFG->EXTICR[nb_EXTI] &= ~(0b1111 << 4 * (button->pin % 4)); NVIC_SetPriority(EXTI0_1_IRQn, 0);
SYSCFG->EXTICR[nb_EXTI] |= (nb_port << 4 * (button->pin % 4)); }
else if (button->pin < 4) {
//activation d'EXTI dans IMR //activer les requêtes d’interruption EXTI2_3
//….. ……..
switch (trigger) { }
case LL_EXTI_TRIGGER_RISING: else {
//activation de l'interruption sur front montant dans RTSR //activer les requêtes d’interruption EXTI4_15
//….. ……
break; }}
47
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Ecriture de pilote de périphérique
Attention: Le gestionnaire d’interruption ne peut pas être appelé dans le main comme les fonctions ordinaires. Il se
déclenche automatiquement à chaque fois que l’interruption concernée se produit.
48
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2