#include "msp430x20x1.h"
#define DELTA_1MHZ 244 // 244 x 4096Hz = 999.4Hz
#define DELTA_8MHZ 1953 // 1953 x 4096Hz = 7.99MHz
#define DELTA_12MHZ 2930 // 2930 x 4096Hz = 12.00MHz
#define DELTA_16MHZ 3906 // 3906 x 4096Hz = 15.99MHz
unsigned char CAL_DATA[8];
volatile unsigned int i;
int j;
char *Flash_ptrA;
void Set_DCO(unsigned int Delta);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
for (i = 0; i < 0xfffe; i++);
P1OUT = 0x00;
P1SEL = 0x10;
P1DIR = 0x11;
j = 0;
Set_DCO(DELTA_16MHZ);
CAL_DATA[j++] = DCOCTL;
CAL_DATA[j++] = BCSCTL1;
Set_DCO(DELTA_12MHZ);
CAL_DATA[j++] = DCOCTL;
CAL_DATA[j++] = BCSCTL1;
Set_DCO(DELTA_8MHZ);
CAL_DATA[j++] = DCOCTL;
CAL_DATA[j++] = BCSCTL1;
Set_DCO(DELTA_1MHZ);
CAL_DATA[j++] = DCOCTL;
CAL_DATA[j++] = BCSCTL1;
Flash_ptrA = (char *)0x10C0;
FCTL2 = FWKEY + FSSEL0 + FN1;
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY + LOCKA;
*Flash_ptrA = 0x00;
FCTL1 = FWKEY + WRT;
Flash_ptrA = (char *)0x10F8;
for (j = 0; j < 8; j++)
*Flash_ptrA++ = CAL_DATA[j]; // re-flash DCO calibration data
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCKA + LOCK; // Set LOCK & LOCKA bit
while (1)
{
P1OUT ^= 0x01;
for (i = 0; i < 0x4000; i++);
}
}
void Set_DCO(unsigned int Delta)
{
unsigned int Compare, Oldcapture = 0;
BCSCTL1 |= DIVA_3;
TACCTL0 = CM_1 + CCIS_1 + CAP;
TACTL = TASSEL_2 + MC_2 + TACLR;
while (1)
{
while (!(CCIFG & TACCTL0));
TACCTL0 &= ~CCIFG;
Compare = TACCR0;
Compare = Compare - Oldcapture;
Oldcapture = TACCR0;
if (Delta == Compare)
break;
else if (Delta < Compare)
{
DCOCTL--;
if (DCOCTL == 0xFF)
if (BCSCTL1 & 0x0f)
BCSCTL1--;
}
else
{
DCOCTL++;
if (DCOCTL == 0x00)
if ((BCSCTL1 & 0x0f) != 0x0f)
BCSCTL1++;
}
}
TACCTL0 = 0;
TACTL = 0;
BCSCTL1 &= ~DIVA_3;
}
全部代码。