Licence: Creative Commons BY SA 3.0 http://creativecommons.org/licenses/by-sa/3.0/fr/
Les MSP430 disposent d'un contrôleur d'horloge servant à fournir différentes bases de temps aux modules. En ce qui concerne les modules de base, ce contrôleur est le “Basic Clock Module+” que l'on appellera BCM+.
Il existe 4 sources d'horloge pour ce module:
Le BCM+ fournit en sortie trois signaux:
À noter que sur le MSP430G2553, le LFXT1CLK n'a pas la partie haute fréquence, que XT2CLK n'existe pas et qu'il n'est pas possible d'avoir une source externe pour DCOCLK. En gros, LFXT1CLK sert donc à avoir une base de temps basse fréquence précise (horloge,…) et que le seul moyen de générer de la haute fréquence est d'utiliser l'oscillateur interne DCOCLK. Il n'est pas très précis, mais il semblerait que la déviation soit très faible (moins de 5% pour 10°C d'écart http://tech.groups.yahoo.com/group/msp430/message/13234).
L'intérêt de ce BCM+ est de laisser à l'utilisateur la possibilité de fixer la vitesse de chaque module individuellement dans un soucis de réduction de la consommation énergétique. Le schéma de ce module se trouve dans la datasheet du composant dans le chapitre sur le BCM+.
Le paramétrage de BCM+ se fait au travers des registres DCOCTL, BCSCTL1, BCSCTL2 et BCSCTL3. À noter que certains modules de BCM+ peuvent être activés/désactivés au moyen des registres SCG0, SCG1, OSCOFF et CPUOFF, mais cela ne nous concerne pas encore.
BCSCTL1 (adresse 057h), est un registre 8 bits servant à contrôler le BCM+.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
XT2OFF | XTS | DIVAx | RSELx |
La partie qui nous intéresse est : RSELx, sur 4 bits, correspondant à l'une des 16 fréquences nominales du DCO.
DCOCTL (adresse 056h), est un registre 8 bits.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DCOx | MODx |
DCOx, sur 3 bits, sert à diviser la gamme de fréquence en 8 parties correspondantes, chaque division correspondant environ à 10 % de la valeur donnée par RSELx. C'est un système utilisé pour la calibration principalement.
MDOx, sur 5 bits, sert à changer le motif utilisé par le modulateur, un système permettant d'obtenir une fréquence très stable et de limiter la génération de perturbations électromagnétique (spreading).
Au démarrage, le DCOCLK est réglé sur une fréquence faible (< 1MHz), avec le registre DCOCTL contenant : DCOx=3 et RSELx = 7.
C'est l'ensemble de ces paramètres qui permet d'obtenir une fréquence précise, stable. Heureusement pour nous, chaque référence de composant à sa propre table de calibration, contenue en mémoire (segment A). L'utilisateur n'a donc pas à ce soucier de cela, et on utilisera ici directement les 4 valeurs disponibles (en C) pour ce registre, à savoir CALDCO_16MHZ, CALDCO_12MHZ, CALDCO_8MHZ, CALDCO_1MHZ pour DCOCTL et CALBC1_16MHZ, CALBC1_12MHZ, CALBC1_8MHZ, CALBC1_1MHZ pour BCSCTL1.
#include <msp430g2553.h> void change16() { // Règle le DCO à 16 MHz if (CALBC1_16MHZ ==0xFF || CALDCO_16MHZ == 0xFF) { while(1); // Si les constantes ont été effacées // On arrête tout. } BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; } void change1() { // Règle le DCO à 1 MHz if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // Si les constantes ont été effacées // On arrête tout. } BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; } int main(void) { volatile int i,j; volatile unsigned short int a=0; change1(); // On commence à 1 MHz // Arrêt du Watchdog WDTCTL = WDTPW | WDTHOLD; // P1.0 et P1.6 en tant que sorties P1DIR = BIT0 | BIT6; // P1.0=0 et P1.6=1 // Pour alternance P1OUT = BIT6; for (;;) { // Boucle infinie if (a==0) { change16(); // si on était à 1 MHz on passe à 16 MHz } else { change1(); // si on était à 16 MHz on passe à 1 MHz } a ^= 1; // Boucle de visualisation for (j=0; j < 10 ; j++) { // inversion des leds P1OUT ^= BIT0 | BIT6; // pause pour le clignotement for (i = 0; i < 0x6000; i++); } } }