Cours 3
Cours 3
Cours 3
CHIRAZ TRABELSI
1) Un cristal (quartz)
• Soumis à un champ électrique, le quartz vibre avec une fréquence stable et permet de générer un
signal électrique périodique
• Ce signal périodique peut servir d’horloge pour un microcontrôleur/microprocesseur
La carte STM32L053R8 contient deux quartz externes
• Un quartz haute fréquence (HSE: High-Speed External) de 8MHz
• Un quartz basse fréquence (LSE: Low-Speed External) de 32.768KHz
2
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
1) Un cristal (quartz)
• Taux d’erreur dans un quartz
• Exemple: 20ppm (parts per million) +/- 20 impulsions par million = 0.002%
• Erreur pour une fréquence de 8MHz ≈ 10 min/an
3
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
2) Un oscillateur RC
C’est un oscillateur utilisé généralement comme horloge interne pour les microcontrôleurs et contient
essentiellement, des condensateurs, résistances et amplificateurs
4
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
2) Un oscillateur RC
Si on a besoin d’une précision dans le temps, il faut privilégier l’utilisation d’un quartz comme source
d’horloge, mais il ne faut pas oublier qu’un quartz consomme plus d’espace.
5
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
6
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
7
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Configuration de l’horloge
1) Activer HSI16
8
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
L’arbre de l’horloge (Clock Tree)
10
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation de l’horloge
• Résumé
• Deux implémentations
• Quartz externe: plus précis
• Oscillateur interne: moins précis
• Si on veut qu’un composant (Timer, convertisseur, etc.) ait une fréquence d’horloge inférieure à celle
du système, il faut passer par un prescaler
• On peut activer à la main les horloges des différents composants du système à travers le module RCC
(Reset and Clock Control) pour réduire la consommation d’énergie. Chaque bus du système (GPIO,
AHB, APB1, APB2, …) a un registre auprès du RCC qui permet d’activer l’horloge pour les
composants qui y sont connectés.
11
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémenter des temps d’attente
• Utiliser des temporisateurs matériels: des timers matériels (des compteurs matériels) qui peuvent
s’incrémenter sans l’intervention du processeur
12
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation logicielle du temps d’attente
• Version en langage C
13
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation logicielle du temps d’attente
• Version en langage C
• Solution: déclarer la variable j comme volatile,
void delay_ms(uint32_t nb_ms){ cela permet de dire au compilateur que la variable
uint32_t I; j peut être accessible à tout moment par un
volatile uint32_t j; Le nombre
for(i=0;i<nb_ms;i++) d’instructions machines système externe (système d’exploitation,
for(j=0;j<1230;j++); qui implémentent une interruption, etc.) ce qui l’empêche de l’optimiser
}
itération change si vous
int main(void) activez l’optimisation
{
//configuration de la fréquence à 16MHz
……
while(1){
GPIOA->ODR |=(1<<5);
delay_ms(1000);
GPIOA->ODR &=~(1<<5);
delay_ms(1000);
}}
14
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Implémentation logicielle du temps d’attente
• Version en assembleur
void delay_ms(uint32_t nb_ms); .global delay_ms
.syntax unified
int main(void) .data
{ n: .word 5333
//configuration de la fréquence à 16MHz
…… .text
delay_ms:
//configuration de la led LD2 push {lr}
RCC->IOPENR|=RCC_IOPENR_GPIOAEN;
GPIOA->MODER&=~(0b11<<(5*2)); boucle1:
GPIOA->MODER|=(0b01<<(5*2)); //charger la valeur de n (5333) dans le registre r1
ldr r2, =n
while(1){ ldr r1,[r2]
GPIOA->ODR |=(1<<5); boucle2:
delay_ms(1000); subs r1,#1
GPIOA->ODR &=~(1<<5); bne boucle2
delay_ms(1000); //decrementer la valeur de r0 (nombre de ms)
}} subs r0,#1
bne boucle1
La boucle interne boucle 2 prend
pop {pc}
3 cycles d’horloge
Il faut la répéter 5333 fois pour
implémenter 1ms avec une
fréquence de 16MHz 15
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Dans les librairies LL, il y a une fonction déjà existante qui s’appelle LL_mdelay(). Elle permet de faire un
délai en ms et elle utilise un timer matériel:
#include "stm32l053xx.h"
#include "stm32l0xx_ll_utils.h“ /*c’est le fichier qui contient la definition de LL_mDelay()*/
int main(void)
{
//configuration de la fréquence à 16MHz
….
16
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Exercice: Pour une fréquence de 16MHz, quelle serait la valeur du registre LOAD pour faire 1ms quand
le compteur atteint 0? 17
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
18
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Pour cette raison, la fonction LL_Init1msTick charge dans le register LOAD du compteur la valeur de la
fréquence/1000-1
void LL_Init1msTick(uint32_t HCLKFrequency)
{
/* Use frequency provided in argument */
LL_InitTick(HCLKFrequency, 1000U);
}
SysTick->VAL = 0UL;
Source: STM32L0 Series Cortex®-M0+ programming manual
/* Enable the Systick Timer */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_ENABLE_Msk;}
19
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• La fonction LL_mDelay()
20
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Autre que le timer du système (Systick), le microcontrôleur contient les timers TIM2, TIM21, TIM 22,
TIM6 et TIM7
1) Direction: compteur/décompteur
22
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
1) Direction: compteur/décompteur
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
23
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Deux principales configurations à faire pour un timer: Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
25
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
26
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
while(1){
GPIOA->ODR |=(1<<5);
delay_ms(1000);
GPIOA->ODR &=~(1<<5);
delay_ms(1000);
}}
27
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
28
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Pour une fréquence de 16MHz, 1s demanderait 16000000 ticks d’horloge, ce nombre étant trop grand
pour être chargé dans le registre ARR (limité à 16 bits)
29
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
• Pour avoir 1s comme période pour un cycle de comptage (fréquence=1Hz), il faut diviser la fréquence
d’horloge principale par 16 000 000
• Implémentation d’un temps d’attente en secondes en utilisant le timer TIM22 (Utilisation de Prescaler)
void delay_s(uint32_t nb_s) /*activation de l'horloge pour le timer22 (sur le bus
{ APB2)*/
RCC->APB2ENR |= RCC_APB2ENR_TIM22EN;
//lancement du timer
TIM22->CR1|=TIM_CR1_CEN_Msk; //configuration du timer en décompteur
TIM22->CR1|=TIM_CR1_DIR_Msk;
while(nb_s){
if (TIM22->SR & TIM_SR_UIF) { // Scrutation de UIF //chargement de la valeur d'auto-reload
TIM22->SR = TIM22->SR & ~TIM_SR_UIF_Msk; TIM22->ARR=15999;
}
while(1){
int main(void) GPIOA->ODR |=(1<<5);
{ delay_s(1);
//configuration de la fréquence à 16MHz GPIOA->ODR &=~(1<<5);
…. delay_s(1);
}}
31
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Avantages:
• Si on veut implémenter une tâche synchronisée par un timer (exemple clignotement d’une led)
et faire d’autres tâches en parallèle, le mieux c’est de gérer le timer par interruption
• Exemples:
• Deux leds qui clignotent selon deux rythmes différents avec d’autres tâches en parallèle
• Un Timer de Timeout pour un jeu
32
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 33
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Utilisation des interruptions
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 34
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
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs
NVIC_EnableIRQ(TIM22_IRQn);
36
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
Source : RM0367 Reference manual -- Ultra-low-power STM32L0x3 advanced ARM®-based 32-bit MCUs 37
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• Utilisation des interruptions
Exemple: Gestion du timer par interruption pour faire clignoter une led
38
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• L’attente non-bloquante
• Pour faire des tâches en parallèle
• Par exemple: si on a une tâche périodique T1 qui se déclenche toutes les n1 secondes à
gérer par un timer et qu’en parallèle on veut faire d’autres tâches
39
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• L’attente non-bloquante
• Pour faire des tâches en parallèle
• Par exemple: si on a une tâche périodique T1 à gérer par un timer et qu’en parallèle on veut
faire d’autres tâches
• 1ère méthode: sans interruption while(1){
/****Exécution de T1:inverser la led toutes les
int main(void) secondes****/
{ GPIOA->ODR ^=(1<<5);
//configuration de la fréquence à 16MHz /***lancement de l’attente non-bloquante pour
…. 1000ms***/
41
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
Les temporisateurs matériels (Timers)
• L’attente non-bloquante
• 2ème méthode: avec interruption
void TIM22_IRQHandler(){
//activation de l'interruption sur le timer
TIM22->SR = TIM22->SR & ~TIM_SR_UIF_Msk;
TIM22->DIER|=TIM_DIER_UIE_Msk;
/****Exécution de T1:inverser la led toutes
les secondes****/
//activation de l'interruption dans le contrôleur NVIC
GPIOA->ODR ^=(1<<5);
NVIC_EnableIRQ(TIM22_IRQn);
}
int main(void)
//configuration de la led LD2
{
….
//configuration de la fréquence à 16MHz
….
//lancement du timer
TIM22->CR1|=TIM_CR1_CEN_Msk;
/*activation de l'horloge pour le timer22
(sur le bus APB2)*/
while(1){
RCC->APB2ENR |= RCC_APB2ENR_TIM22EN;
/****d'autres tâches
*
//configuration du timer en décompteur
*
TIM22->CR1|=TIM_CR1_DIR_Msk;
******/
}
//chargement de la valeur d'auto-reload
}
TIM22->ARR=16000-1;
43
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
L’horloge RTC
44
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2
L’horloge RTC
• Parfois, on a besoin d’un module RTC externe au microcontrôleur pour maintenir le comptage même si le
microcontrôleur n’est plus alimenté. Dans ce cas, le module RTC est alimenté par batterie.
45
SYS3046-Microcontrôleurs : périphériques et applications – 3A-S2