PLL

Au chapitre de l'horloge, nous avions parlé d'une PLL intégrée au LPC2106 qui permettrait de multiplier la valeur d'horloge par un certain coefficient. Pour l'instant, Blinky et crt.s ne s'occupent en aucune façon de gérer cette PLL intégrée.

Cela veut-il dire que l'on n'est pas en train de friser les 60MHz ?

Et bien non ... On tourne à 14,7456 Mhz, soit la valeur de notre quartz...

Le mécanisme de la PLL permet d'obtenir une horloge interne tournant plus vite que l'horloge fournie par le quartz seul ce qui permet, d'une part de réduire les problèmes CEM liés au rayonnement des circuits rapides, et d'autre part de pouvoir réduire la consommation du LPC2106 par programme. Au reset du microcontrolleur, cette PLL est déconnectée et l'horloge du core est l'horloge définie par le quartz. Il va donc nous falloir connecter cette horloge par soft.


Configuration de la PLL:

La vitesse de l'horloge issue de la PLL dépend directement de la valeur de deux paramètres qui sont nommés M et P. Le premier de ces deux paramètres est le multiplicateur, l'autre le diviseur.

Plusieurs horloges internes vont alors être créées à partir de la fréquence de l'oscillateur à quartz Fosc. On trouvera Cclk qui va être la Core clock et Fcco qui va être la Current-Controlled Oscillator clock.

La PLL est configurée par les registres suivants:


PLLCON (0xE01F C080)

Il s'agit du registre de contrôle qui permettra de valider et connecter la PLL. La validation des circuits internes de la PLL vont lui permettre de prendre les facteurs de multiplication et division en compte, alors que sa connection va permettre à sa sortie d'être reliée aux bus internes du microcontrôleur.

Les modifications de la configuration de la PLL ne seront prises en compte que si une certaine séquence d'écriture dans ses registres est bien respectée. Cette séquence est relative au registre PLLFEED (voir plus loin). On parlera de séquence PLL_Feed. Cette séquence particulière évite de modifier les paramètres de la PLL par inadvertance.


Description du registre PLLCON:

b0: PLLE. PLL Enable.

Quand ce bit est à 1 après une séquence PLL_Feed correcte, la PLL est validée et les paramètres M et P sont pris en compte.


b1: PLLC. PLL Connect.

Quand ce bit est à 1 en même temps que PLLE, et après une séquence PLL_Feed correcte, la sortie de la PLL devient l'horloge du système.


b2 à b7: Ces autres bits sont réservés et ne doivent pas être utilisés..


PLLCFG (0xE01F C084)

Ce registre contient le multiplicateur M et le diviseur P qui vont nous servir à configurer la PLL. On parle alors de MSEL et PSEL.

Comme précédemment, ces valeurs ne seront prises en compte par le système qu'après une séquence PLL_Feed correcte.

Description du registre PLLCFG:

b4-b0: MSEL. Codage de la valeur que l'on aura calculée pour M.

MSEL M

00000 1

00001 2

00010 3

00011 4

00100 5

.... ..

11111 32

On remarque ici que le codage de MSEL est tel que MSEL= M-1.


b6-b5: PSEL. Codage pour la valeur calculée pour P.

PSEL P

00 1

01 2

10 4

11 8

On remarquera ici que P ne peut prendre que les valeurs 1-2-4-8.


b7: Non utilisé.


Avant de regarder comment calculer M et P, il va tout d'abord falloir établir quelques définitions:


Fosc : Fréquence de l'oscillateur à quartz.

Cclk : Core clock, horloge du coeur du microcontrôleur max 60MHz

Fcco: Horloge de l'Oscillateur Commandé en Courant (circuit interne).

La datasheet du LPC2106 indique que : 156MHz < Fcco < 320MHz

Voici les équations qui vont nous permettre de calculer ces coefficients M et P:


Cclk = M * Fosc => M = Cclk / Fosc

et P = Fcco / (2 * Cclk)

Pour nous, Fosc = 14,7456 MHz.

Si on veut tourner à 60MHz, on peut dire que

M = 60000000 / 14745600 = 4,069.

Comme les paramètres M et P sont obligatoirement des entiers, on choisira de prendre M=4. En refaisant le calcul inverse, on obtient:

Cclk = M * Fosc = 4 * 14745600 = 58982400, soit 58,98 MHz.

Notre LPC2106 tournera donc à 58,98MHz.

Pour le calcul de P, on a P = Fcco / (2*Cclk).

En prenant par exemple Fcco = 156MHz (voir plus haut), on obtient:

P = 156000000 / (2* 58982400) = 1,32

Comme nous l'avons vu tout à l'heure pour le calcul de M, P doit être un entier. En prenant une valeur proche de celle calculée, il faut vérifier que l'on soit toujours dans la fourchette 156-320MHz de Fcco.

En prenant P=1, on aurait donc

Fcco = P * 2*Cclk

= 1 * 2 * 58982400

= 117964800

= 117,9 Mhz

On a donc Fcco qui est inférieur à 156MHz, ce qui ne convient pas.


En prenant P=2, on obtient alors:

Fcco = 2 * 2*Cclk

= 2 * 2*58982400

= 235929600

= 235,9 MHz.

On a bien une valeur de Fcco comprise entre 156 et 320MHz, ce qui confirme la valeur que l'on a choisi pour P.


On peut donc dire à présent que


M = 4

P = 2

Nous avons à présent toutes les données pour programmer notre PLL à 58,98MHz.

Les valeurs de MSEL et PSEL à mettre dans le registre de configuration PLLCFG sont donc:

M = 4 amène b4-b0: 00011

et P = 2 amène b6-b5: 01

Donc PLLCFG = 00100011, autrement dit PLLCFG = 0x23 pour nos 58,98MHz avec un quartz de 14,7456MHz.


PLLSTAT (0xE01F C088)

Le registre PLLSTAT est le registre d'état de la PLL. Il reflète l'état des bits de Connection, de Validation, ainsi que les valeurs M et P après une séquence PLL_Feed correcte. De plus, on trouvera ici le bit PLOCK qui reflète l'état de vérouillage de la PLL.

Pendant notre séquence PLL_Feed, c'est ce bit qu'il faudra surveiller en attendant qu'il nous indique que la PLL est bien vérouillée et que les valeurs PSEL et MSEL sont effectivement prises en compte.

Description du registre PLLSTAT:

b4-bo: Reflet de MSEL

b6-b5: Reflet de PSEL

b7: Réservé

b8: PLLE. Reflet du bit PLLE du registre PLLCON lorsque la PLL est effectivement vérouillée.

b9: PLLC. Reflet du bit PLLC du regsitre PLLLCON losque la PLL est effectivement vérouillée.

b10: PLOCK. Lorsque ce bit est lu à 0, la PLL n'est pas vérouillée.

Lorsqu'il est lu à 1, la PLL est effectivement vérouillée et tourne à la fréquence définie par M et P.

b15-b11: Réservés.


PLLFEED (0xE01F C08C)

Il s'agit du registre qui va nous permettre de faire la séquence PLL_Feed dont nous parlons depuis tout à l'heure.

b7-b0: PLLFEED. Registre qui reçoit la valeur de séquence PLL_Feed.

Cette séquence est simple mais doit être exécutée en deux cycles consécutifs. Pour ce faire, il faut donc que les interruptions soient dévalidées à ce moment là.

Elle consiste à écrite xAA et x55 dans ce registre PLFEED.


PLLFEED = xAA;


PLLFEED = x55;


C'est tout, nécessair et suffisant pour que la PLL prenne les valeurs de M et P en compte, ainsi que les bits de connection PLLC et validation PLLE.

Cependant, cette séquence évite que l'on ne perturbe la PLL par mégarde. Toutes les midifications que l'on aura pu apporter à la PLLL sans cette séquence d'écriture ne seront donc pas prises en compte.

Nous savons donc à présent programmer les valeurs adéquates M et P pour tourner à la valeur de fréquence désirée et mettre la PLL en route.

Nous allons donc pouvoir observer Blinky lorsque la PLL est utilisée.


Quicky va nous montrer ce qu'il se passe ...