Запускаю кварц. Инициализирую всякие тактовые.
Запускаю таймер на сравнения для получения частоты.
Всё выглядит так:
Код
// Тактовые частоты
#define ACLK 32768L // частота кварца, Hz [32768]
#define DCOCLK 25000L // Системная частота, kHz [25000]
//#define DCOCLK 18000L // Системная частота, kHz
#define MCLK DCOCLK // частота кварца, Hz
#define SMCLK DCOCLK // частота кварца, Hz
#define FCLK (DCOCLK*1000) // частота, Hz [25001984]
#define TCLK 40 // период в нс
// Множители
#define MPLL (FCLK/ACLK) // Множитель для DCO
#define ACLK 32768L // частота кварца, Hz [32768]
#define DCOCLK 25000L // Системная частота, kHz [25000]
//#define DCOCLK 18000L // Системная частота, kHz
#define MCLK DCOCLK // частота кварца, Hz
#define SMCLK DCOCLK // частота кварца, Hz
#define FCLK (DCOCLK*1000) // частота, Hz [25001984]
#define TCLK 40 // период в нс
// Множители
#define MPLL (FCLK/ACLK) // Множитель для DCO
Код
// Выбор источников тактового сигнала и настройка PLL
#if DCOCLK <= 8000 //Set VCore = 0 for 8MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 0);
#elif DCOCLK <= 12000 //Set VCore = 1 for 12MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#elif DCOCLK <= 20000 //Set VCore = 2 for 20MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#else //Set VCore = 3 for 25MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 3);
#endif
//Initializes the XT1 crystal oscillator with no timeout
UCS_LFXT1Start(__MSP430_BASEADDRESS_UCS__, UCS_XT1_DRIVE0, UCS_XCAP_3);
//Set DCO FLL reference = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_FLLREF, 0, UCS_CLOCK_DIVIDER_1);
//Set ACLK = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_ACLK, 0, UCS_CLOCK_DIVIDER_1);
//Set Ratio and Desired MCLK Frequency and initialize DCO
UCS_initFLLSettle(__MSP430_BASEADDRESS_UCS__, DCOCLK, MPLL);
//Set MCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_MCLK, 3, UCS_CLOCK_DIVIDER_1);
//Set SMCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_SMCLK, 3, UCS_CLOCK_DIVIDER_1);
// Enable global oscillator fault flag
SFR_enableInterrupt(__MSP430_BASEADDRESS_SFR__, SFR_OSCILLATOR_FAULT_INTERRUPT);
// Enable global interrupt
__bis_SR_register(GIE);
#if DCOCLK <= 8000 //Set VCore = 0 for 8MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 0);
#elif DCOCLK <= 12000 //Set VCore = 1 for 12MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#elif DCOCLK <= 20000 //Set VCore = 2 for 20MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#else //Set VCore = 3 for 25MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 3);
#endif
//Initializes the XT1 crystal oscillator with no timeout
UCS_LFXT1Start(__MSP430_BASEADDRESS_UCS__, UCS_XT1_DRIVE0, UCS_XCAP_3);
//Set DCO FLL reference = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_FLLREF, 0, UCS_CLOCK_DIVIDER_1);
//Set ACLK = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_ACLK, 0, UCS_CLOCK_DIVIDER_1);
//Set Ratio and Desired MCLK Frequency and initialize DCO
UCS_initFLLSettle(__MSP430_BASEADDRESS_UCS__, DCOCLK, MPLL);
//Set MCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_MCLK, 3, UCS_CLOCK_DIVIDER_1);
//Set SMCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_SMCLK, 3, UCS_CLOCK_DIVIDER_1);
// Enable global oscillator fault flag
SFR_enableInterrupt(__MSP430_BASEADDRESS_SFR__, SFR_OSCILLATOR_FAULT_INTERRUPT);
// Enable global interrupt
__bis_SR_register(GIE);
Код
// Инициализация таймера меток времени
TA1CTL = 0;
TA1CTL |= TACLR; // Сбросить таймер
// TA1CTL;
TA1CTL |= TASSEL1; // SMCLK
TA1CTL |= ID1; // /4 (6.25)
TA1CCTL0 = SCCI; // Синхронно, Захват
TA1CCR0 = SMCLK/4; // 1 мс
TA1CCTL0 |= CCIE; // прерывание по захвату разрешить
TA1CTL |= MC0; // до TAxCCR0
TA1CTL = 0;
TA1CTL |= TACLR; // Сбросить таймер
// TA1CTL;
TA1CTL |= TASSEL1; // SMCLK
TA1CTL |= ID1; // /4 (6.25)
TA1CCTL0 = SCCI; // Синхронно, Захват
TA1CCR0 = SMCLK/4; // 1 мс
TA1CCTL0 |= CCIE; // прерывание по захвату разрешить
TA1CTL |= MC0; // до TAxCCR0
В прерывании от таймера дёргаю ножкой. По идее частота прерываний должна быть при любой частоте ~ 1мс.
В реале если устанавливаю частоту от 18 и выше МГц, то работает правильно, а если меньше, то частота получается удвоенная.
И где я не копенгаген? В документации ничего стрёмного не нашёл.