Попробуйте вот эту функцию. Когда-то писал ее для подстройки DCO по часовому кварцу для совместимых по пинам кристаллов в TQFP-64. Используется встроенная возможность TimerA использовать ACLK как входной сигнал в режиме захвата.
Требуемая частота DCO задается макросом FREQMCLK. FREQACLK частота цасового кварца 32768Гц. Тип/серия кристалла (MSP430x1xx или MSP430x2xx) задается макросом MSP430F2XX_SERIES. Для MSP430x1xx подразумевается наличие внешнего резистора ROSC. Сохранение/восстановление режимов работы таймера А можете выкинуть. Точно также как и сохранение/восстановление битов регистра SR.
Обратите внимание, что для малоногих кристаллов как у вас (MSP430F2013) источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции.
Код
#define RATIO_DCO_ACLK (FREQMCLK/FREQACLK) //отношение частот DCO и ACLK
#define DEVIATION_DCO 1 //допустимая абсолютная погрешность DCO
#ifndef MSP430F2XX_SERIES
#define RSEL_MASK 0x07
#define RSEL_MAXVAL 7
#else
#define RSEL_MASK 0x0F
#define RSEL_MAXVAL 15
#endif
//================================================//
// Инициализация источников тактирования //
// MCLK, SMCLK, ACLK //
//------------------------------------------------//
//аргументы :нет //
//возвращает:нет //
//================================================//
void initOscSystem(void)
{ unsigned int SRstat;
unsigned int uTmp, error, cntr, TACTLstat, TACCTLstat, TACCTL2stat;
SRstat=__get_SR_register(); //сохраним статусный регистр
__bic_SR_register(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
#ifdef MSP430F2XX_SERIES
BCSCTL3=XT2S1|XCAP_3; //3MHZ<XT2<16MHZ, XCAP=12.5pF
#endif
BCSCTL1=XT2OFF|DIVA_0|RSEL2|RSEL1|RSEL0; //ACLK=LFXT
BCSCTL2=SELM_0|DIVM_0|DIVS_0; //with ROSC SMCLK=DCO about 6.5МГц
#ifdef MSP430F2XX_SERIES
while ((BCSCTL3&LFXT1OF)!=0);
if (*((xByte *)TAG_DCO_30)==0x01)
{ DCOCTL=CALDCO_16MHZ; //DCO about 16МГц
BCSCTL1=CALBC1_16MHZ;//&(~XT2OFF); //ACLK=LFXT
}
else
{ DCOCTL=0x82; //DCO about 16МГц
BCSCTL1=0x8F; //ACLK=LFXT
}
#else
DCOCTL=0x80; //DCO about 5МГц
BCSCTL1=0x8F; //ACLK=LFXT
BCSCTL2|=DCOR; //включить внешний RSEL
#endif
//сохранение регистров TimerA и инициализация его для подстройки DCO
TACTLstat=TACTL;
TACTL|=TACLR;
TACCTLstat=0;
if ((TACCTL0&CCIE)!=0)
TACCTLstat|=(1<<0);
if ((TACCTL1&CCIE)!=0)
TACCTLstat|=(1<<1);
TACCTL2stat=TACCTL2;
TACCTL2=CM_2|CCIS_1|CAP; //CCInput2=ACLK
TACTL=TASSEL_2|ID_0|MC_2; //TACLK=SMCLK
//подстроим DCO по LFXT с помощью режима захвата TimerA
error=0;
do
{ TACCTL2&=~CCIFG;
while((TACCTL2&CCIFG)==0); //ловим первый фронт ACLK
uTmp=TACCR2;
TACCTL2&=~CCIFG;
while((TACCTL2&CCIFG)==0); //ловим второй форнт ACLK
uTmp=TACCR2-uTmp; //получаем отношение частот SMCLK/(ACLK*2)
if (uTmp!=RATIO_DCO_ACLK)
{
if ((uTmp>(RATIO_DCO_ACLK<<1))||//отношение частот выше заданного более чем в 2 раза?
(DCOCTL==0x00)
)
{ cntr=BCSCTL1&RSEL_MASK;
if (cntr>0)
cntr-=1;
BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
DCOCTL=DCO2;
error=1;
}
else
if ((uTmp<(RATIO_DCO_ACLK>>1))||//отношение частот ниже заданного более чем в 2 раза?
(DCOCTL>=0xE0)
)
{ cntr=BCSCTL1&RSEL_MASK;
if (cntr<RSEL_MAXVAL)
cntr+=1;
BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
DCOCTL=DCO2;
error=1;
}
else
if (uTmp>(RATIO_DCO_ACLK+DEVIATION_DCO))//отношение частот выше заданного?
{ if (DCOCTL>0)
DCOCTL-=1;
if (error<0xFFFF)
error++;
}
else
if (uTmp<(RATIO_DCO_ACLK-DEVIATION_DCO))//отношение частот ниже заданного?
{ if (DCOCTL<0xFF)
DCOCTL+=1;
if (error<0xFFFF)
error++;
}
else
error=0; //отношение частот попало в заданный диапазон
}
else
error=0;
} while(error!=0); //цикл, пока отношение частот не будет в заданном диапазоне
//восстановим регистры TimerA
TACTL|=TACLR;
TACCTL2=TACCTL2stat;
if ((TACCTLstat&(1<<1))!=0)
TACCTL1|=CCIE;
else
TACCTL1&=~CCIE;
if ((TACCTLstat&(1<<0))!=0)
TACCTL0|=CCIE;
else
TACCTL0&=~CCIE;
TACTL=TACTLstat;
//установим назначенные делители для MCLK и SMCLK
BCSCTL2|=SELM_0|DIVM_0|DIVS_0|SELS; //MCLK=DCO, SMCLK=XT2
IE1|=OFIE;
SRstat&=~(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
__bis_SR_register(SRstat);
}
Используя вместо макросов FREQMCLK и FREQACLK переменные, можно "прогнать" функцию несколько раз, получить значения регистров для всех требуемых частот и восстановить калибровочные параметры, записав их во Flash. Только не забудьте прописать еще и байт признака наличия этих констант TAG_DCO_30.
Если такой способ вам покажется слишком геморройным, то ждите пока кто-нибудь опубликует готовые значения. У меня нет ни eZ430, ни такого кристалла.