lundi 23 juin 2014

LPC810, partie 6, system clock et PLL

Dans ce 6ième article consacré au LPC810 j'explique comment configurer le PLL avec le IRC pour obtenir une fréquence de fonctionnement différente du 12Mhz de l'IRC.

LPC810 peut fonctionner à une fréquence maximale de 30Mhz selon les spécifications. L'oscillateur interne IRC fonctionne à 12Mhz. C'est la fréquence à laquelle le MCU fonctionne par défaut. Cependant en utilisant le PLL et le diviseur du system clock on peut faire fonctionner le MCU à une fréquence supérieure ou inférieure à 12Mhz.

PLL

PLL est l'acronyme anglophone de Phase Lock Loop. Il s'agit d'un circuit qui permet de multiplier une fréquence qu'on injecte à l'entrée par une certaine valeur. Voici le diagramme fonctionnel du PLL inclus dans le LPC810.

FCLKIN est le signal injecté à l'entrée du PLL et qui sera multiplié. Dans le cas du LPC810 il n'y a que 2 possibilités soit soit l'oscillateur IRC soit un signal provenant de la broche CLKIN. sys_osc_clk n'est disponible que sur les LPC811 et LPC812.

Au coeur du PLL il y a un oscillateur contrôlé par courant, le CCO (Current Controlled Oscillator). La fréquence du CCO peut varier entre 156Mhz et 320Mhz. Le bloc PFD (Phase Frequency Detector) compare le signal d'entrée avec le signal de sortie du PLL qui est divisé par les blocs /2P et /M. Si les 2 signaux n'ont pas la même fréquence et phase un signal d'erreur à la sortie du PFD modifie la fréquence du CCO pour diminuer cette erreur.

Donc lorsqu'on utilise le PLL on doit choisir 2 diviseurs le /2*P et le /M. La sortie du CCO est divisée par la valeur 2*P où P peut prendre les valeurs 2,4,8 16. Le diviseur /M peut prendre n'importe quelle valeur entre 1 et 32.

Prenons un exemple, dans lequel on veut faire fonctionner le MCU à sa fréquence maximale en utilisant l'IRC et le PLL. La sortie du PLL FLCKOUT ne peut pas être de 30Mhz car aucune division entière de 30Mhz ne donne 12Mhz. Le plus petit commun multiple entre 12Mhz et 30Mhz est 60Mhz. On va donc programmer le PLL pour obtenir un FCLKOUT de 60Mhz et on va utiliser le diviseur du system clock pour diviser FCLKOUT par 2. Selon les spécifications la fréquence maximale pour FCLKOUT est de 100Mhz.

La fréquence du CCO doit-être maintenue entre 156Mhz et 320Mhz. Donc on doit choisir une valeur de P de sorte que 156<=2*P*60<=320. Si on choisi 2 pour P on a un Fcco=2*P*60=240Mhz on est donc dans l'intervalle.

Maintenant il suffit de choisir la valeur de /M simplement M=60/12=5.

On a donc nos 2 valeurs pour P=2 et /M=5. C'est le registre SYSPLLCTRL qui contient ces 2 diviseurs. les bits 4:0 contiennent MSEL. La valeur de /M=MSEL+1, donc pour 5 on met 4 dans SYSPLLCTRL[4:0]. La valeur PSEL est dans les bits 6:5. les valeurs de P sont:

bits [6:5]P
001
012
104
118

Pour diviser FCLKOUT pour obtenir Fsysclk=30Mhz on utilise le registre SYSAHBCLKDIV. Ce diviseur est compris entre 1 et 255. Dans cet exemple on va y mettre la valeur 2.

code exemple

Lorsqu'on modifie les diviseurs du PLL il faut mettre à zéro et ensuite à 1 le registre SYSPLLCLKUEN (System PLL Clock Update Enable) pour mettre à jour les nouvelles valeurs.

Ensuite on sélectionne le diviseur dans SYSAHBCLKDIV et on sélectionne la sortie du PLL comme source du main clock. Encore une fois il faut faire une séquence 0,1 dans le registre MAINCLKUEN (Main Clock Update Enable) pour compléter la mise à jour.


Liens vers les articles précédents:

  1. Introduction au LPC810 (ARM M0+)
  2. LPC810, partie 2, anatomie
  3. LPC810, création d'un projet
  4. LPC810, partie 4, programmation
  5. LPC810, partie 5, module SCT et PWM

Aucun commentaire:

Enregistrer un commentaire