Outils pour utilisateurs

Outils du site


msp430-frequence

Changer la fréquence d'un MSP430G2553

Auteur: Bjonnh

Licence: Creative Commons BY SA 3.0 http://creativecommons.org/licenses/by-sa/3.0/fr/

Principe

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:

  • LFXT1CLK: Oscillateurs basse/haute fréquence, dont l'origine peut être un quartz, un résonateur céramique ou une source externe. Les quartz utilisés en basse fréquence sont souvent des 32768 Hz (comme celui fourni avec le LaunchPad). La source externe haute fréquence est comprise entre 400 kHz et 16 MHz.
  • XT2CLK: Oscillateur haute fréquence optionnel, quartz, résonateurs ou source externe (400 kHz-16 MHz).
  • DCOCLK: Oscillateur interne contrôlé numériquement, c'est celui qui nous intéresse ici
  • VLOCLK: Oscillateur basse puissance et basse fréquence (de l'ordre de 12 kHz), semble-t'il pour les modes économie d'énergie (à confirmer)

Le BCM+ fournit en sortie trois signaux:

  • ACLK: Horloge auxiliaire, pour les périphériques, est reliée depuis le programme vers LFXT1CLK ou VLOCLK
  • MCLK: Horloge maître, pour le CPU et le système, est reliée depuis le programme vers LFXT1CLK, VLOCLK, XT2CLK, DCOCLK. Il existe un registre permettant de piloter le diviseur avec un facteur 1, 2, 4 ou 8.
  • SMCLK: Horloge adjointe, pour les périphériques, est reliée depuis le programme vers LFXT1CLK, VLOCLK, XT2CLK, DCOCLK. Il existe un registre permettant de piloter le diviseur avec un facteur 1, 2, 4 ou 8.

À 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+.

Les registres concernés

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

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

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).

En pratique

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.

Réalisation

#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++);
  }
  }
}

Sources

msp430-frequence.txt · Dernière modification: 2015/01/28 03:09 (modification externe)