Affichage_Atrylec_com

Vous n'êtes pas seuls dans l'Univers !

Transistor_100

STM32VLDISCOVERY : Horloges

Spécial ZanX' à « NonoxX » !

Configurer l'horloge principale du STM32F100RB.

Spécial ZanX' à « NonoxX » !
Je veux remonter ! | Liste

1) Présentation

Les microcontrôleurs sont, comme presque tout en électronique numérique, des composants synchrones, c'est à dire qu'ils ont besoin d'une horloge pour synchroniser toutes les opérations.
Le STM32F100RB possède de nombreuses sources d'horloge, certaines rapides, d'autres plus lentes, internes ou externes...
Le but de ce cours est donc de vous apprendre à configurer une horloge par un exemple, ici sur le STM32F100RB présent sur la carte STM32VLDISCOVERY.
La façon dont on procède pour régler l'horloge principale d'un microcontrôleur, c'est d'aller dans le manuel de référence, chercher l'arborescence des horloges (« Clock Tree »).
Dans le manuel des STM32, il se trouve dans le chapitre « Reset and Clock Control (RCC) », au début du paragraphe « Clocks ».
On mettra l'initialisation de l'horloge principale en premier dans la fonction main ou dans la fonction SystemInit, afin que celle-ci soit faite avant toute opération.

Je veux remonter ! | Liste

2) Oscillateur interne, utilisé tel quel

Nous allons maintenant traiter un cas simple, afin de bien comprendre comment fonctionne le système d'horloges du STM32. Il dispose d'une horloge interne rapide HSI (« High Speed Internal ») cadencée à une fréquence fixe de 16 MHz. Nous allons directement cadencer le microcontrôleur à cette fréquence. Jetons un oeil à l'arbre des horloges.

CAPTURE_DATASHEET_STM32F100XX_LD_MD_EXTRAIT_ARBRE_HORLOGES
Arbre des horloges du STM32F100RB : chemin à suivre pour avoir une horloge de 16MHz

L'horloge système est toujours SYSCLK, quoi qu'il arrive. Dans le cas du STM32L152, il est précisé que cette horloge ne doit pas dépasser 24 MHz. Pas de problème on en veut 16 MHz. Sur l'arbre a été ajouté en rouge le cheminement que nous voulons pour l'horloge. Une bonne pratique est de configurer l'horloge en suivant l'arbre de gauche à droite. Comme le STM32 est un composant optimisé en consommation d'énergie, par défaut tout (ou presque...) est éteinte dedans, y compris l'horloge HSI. Nous allons donc commencer par la mettre en route. Pour savoir comment faire on cherche dans le manuel de référence le paragraphe qui décrit le HSI, c'est le paragraphe 4.2.2. Ce paragraphe nous indique que le HSI n'est pas extrêmement précis, qu'il peut être calibré, ce dont on ne s'occupera pas, mais surtout qu'il se met en route en utilisant le bit HSION du registre RCC_CR, et que le bit HSIRDY de ce même registre indique que son fonctionnement est stable.

Capture_datasheet_2
HSI clock

On va donc regarder de quoi est fait ce fameux registre RCC_CR au paragraphe 4.3.1.

Capture_datasheet_3
Clock control register (RCC_CR)

On peut donc (entre autre) lire sur ce plan de registre que les bits HSION et HSIRDY sont respectivement les bits 0 et 1 du registre RCC_CR.
On va donc allumer le HSI en mettant le bit 0 (HSION) de RCC_CR à 1, et attendre que le HSI soit prêt en attendant que le bit 1 (HSIRDY) soit à 1.
Ensuite on va rediriger HSI vers SYSCLK (l'horloge système) via le multiplexeur situé à gauche sur l'arbre des horloges (en vert ci-dessus).
On voit sur cet arbre que le multiplexeur se contrôle par des bits SW, mais on n'a aucune idée du registre dans lequel ces bits se trouvent.
On parcourt alors un peu la section « Clocks » du manuel, et on tombe sur la section 4.3.3. « Clock Configuration Register » qui décrit le registre RCC_CFGR dans lequel on retrouve SW.

Capture_datasheet_4
SW[1:0]: System clock switch

On peut donc y voir que les bits SW[1:0] sont les deux premiers bits de RCC_CFGR, et que pour sélectionner HSI comme horloge système, il faut les placer sur 01. Ça y est, on a fini ! Notre STM32 fonctionne maintenant sur son horloge interne rapide HSI, à une cadence de 16 MHz. On peut maintenant commencer à programmer quelque-chose sur le microcontrôleur. Malgré la richesse du STM32, la configuration de l'horloge n'est pas très compliquée, néanmoins il est important de bien la maîtriser car sans horloge, le microcontrôleur ne fonctionne pas.

Je veux remonter ! | Liste

3) Oscillateur interne, utilisé avec la PLL

Afin de se rendre encore plus à l'aise avec les horloges du STM32 on va tenter de mettre l'horloge principale SYSCLK à sa valeur maximale, c'est à dire 32 MHz sur notre carte. On va donc devoir mettre en route un multiplicateur de fréquence, la PLL. Mais on ne va pas s'en contenter ! On va faire d'une pierre deux coups et générer une fréquence de 48 MHz pour l'USB avec ce même oscillateur HSI. Retour donc sur l'arbre des horloges.

Capture_datasheet_5
Arbre des horloges du STM32F100RB : chemin à suivre pour avoir une horloge de 48MHz et avoir une horloge de 32MHz

Comme dans le paragraphe précédent nous allons allumer HSI et attendre sa stabilisation. On voit ensuite qu'il faut passer par un multiplexeur (violet) qui permet de rentrer sur la PLL soit HSI, soit HSE, l'oscillateur rapide externe. Ce multiplexeur est commandé par le bit PLLSRC dans le registre RCC_CFGR.

PLLSRC: PLL entry clock source

On veut HSI en entrée de la PLL, il faut donc mettre le bit 16 de RCC_CFGR (PLLSRC) à 0. On continue ensuite notre chemin sur l'arbre des horloges et on arrive sur la PLL à proprement parler, c'est à dire le multiplicateur de fréquence (en orange). On veut envoyer 48 MHz à l'USB, mais l'arbre indique que l'horloge envoyée à l'USB sera la moitié de la fréquence de sortie de la PLL (USBCLK = PLLVCO/2). On veut donc en sortie de la PLL 96 MHz ! Le manuel de référence précise qu'il ne faut pas dépasser 96 MHz en sortie de la PLL. On est à la limite donc pas de problème. On va donc multiplier la fréquence par 6 (car 16 MHz x 6 = 96 MHz).

Capture_datasheet_7
PLLMUL[3:0]: PLL multiplication factor

Cette opération se fait par la configuration des bits 21 à 18 de RCC_CFGR. Dans notre cas ils doivent prendre la valeur qui correspond à un coefficient de multiplication de 6, c'est à dire 0010. On va maintenant configurer le diviseur de sortie (bleu) de la PLL afin d'obtenir les 32 MHz que nous désirons comme horloge système. On va donc configurer le diviseur pour qu'il effectue une division par 3 (96 MHz / 3 = 32 MHz).

Capture_datasheet_8
PLLDIV[1:0]: PLL output division

On configure donc les bits 23 et 22 de RCC_CFGR, mais ce coup là en forçant le 1 avant le 0, car il ne faut pas tomber sur PLLDIV[1:0] = 00, car c'est une valeur interdite (« not allowed »). Comme précisé précédemment, par défaut, dans le STM32, (presque) tout est éteint. Ce n'est pas précisé sur l'arbre des horloges, mais la PLL ne déroge pas à cette règle. On va devoir l'allumer. Il est important de savoir qu'une fois la PLL allumée, on ne peut plus changer son coefficient multiplicateur. Il faut d'abord l'éteindre, changer le coefficient, et la rallumer, c'est pour cela que nous l'avons configurée avant de la mettre en marche.

Capture_datasheet_9
PLLRDY: PLL clock ready flag - PLLON: PLL enable

On va donc mettre à 1 le bit 24 de RCC_CFGR qui correspond à PLLON, l'activation de la PLL, et attendre que la PLL soit verrouillée, c'est à dire qu'elle fonctionne correctement dans son régime établi. La dernière étape est, comme pour la mise en place simple de l'oscillateur HSI, de configurer le multiplexeur qui redirigera l'horloge de la PLL (PLLCLK) vers l'horloge système (SYSCLK). Et ça y est enfin ! Nous avons configuré notre oscillateur interne de façon à ce qu'il cadence notre microcontrôleur à sa vitesse maximale de 32 MHz, et le périphérique USB à 48 MHz.

Je veux remonter ! | Liste

4) Les autres oscillateurs

Dans le cadre de ce cours j'ai uniquement détaillé l'utilisation de l'oscillateur interne rapide HSI, afin de vous faire comprendre comment on configure l'horloge système dans ce composant.
Il existe également deux autres horloges disponibles comme horloge système.
Quoi qu'il en soit, si vous êtes capable de mettre en oeuvre l'horloge HSI selon les modes étudiés dans ce cours, les autres horloges ne devraient pas vous poser de soucis.

4-1) L'horloge rapide externe HSE

L'oscillateur HSE permet de générer une horloge rapide entre 1 et 24 MHz soit via un oscillateur complètement externe, comme par exemple qui génère un signal carré, soit via un résonateur céramique (ou à quartz) externe accompagné de deux condensateurs.
Utiliser ce dispositif coûte plus cher que d'utiliser le HSI, mais la précision de l'horloge est nettement plus grande, car on sait fabriquer des quartz avec une fréquence de résonance de quelques mégahertz à quelques pulsations par minute (ppm) près, alors que l'oscillateur utilise une cellule R-C, il va donc avoir une fréquence d'oscillation dépendant entre autres significativement de la température.

4-2) L'horloge interne MSI

L'horloge interne MSI est une horloge réglable en fréquence entre 65,536 kHz et 4,194 MHz via la configuration du registre RCC_ICSCR.
Après un Reset, le STM32 démarre par défaut sur cette horloge à 2,097 MHz.
Elle peut aussi être utilisé comme horloge de secours en cas de défaillance de l'horloge externe.

4-3) Les horloges basse fréquence

Dans le STM32, il existe deux horloges basse fréquence, l'une externe, la LSE, qui fonctionne avec un quartz dit d'horloger de 32768 Hz, l'autre interne la LSI qui fonctionne à 37 kHz ou 40 kHz selon le modèle exact du microcontrôleur.
Ces horloges ne peuvent pas être utilisées comme horloge système, mais on les utilise pour cadencer certains périphériques comme le driver de LCD ou l'horloge temps réel (RTC).

Commentaires (2)

Atrylec

Le vendredi 17 mai 2013 à 23:34

Bonsoir, Vous avez raison : la capture d'écran provenait du « REFERENCE MANUAL » du STM32F152, et non de celui du STM32F100. Cependant, la démarche de configuration des horloges reste identique. L'erreur a été corrigée. Merci de m'en avoir fait part !

trabelsi

Le lundi 13 mai 2013 à 19:37

le schéma d'horloge a la début de la page ne concernant pas stm32f100RB C4EST FAUX

Ajouter un commentaire

Votre pseudo :

Votre commentaire :

Je veux remonter !