реклама на сайте
подробности

 
 
> Запуск FLL от 32768
SasaVitebsk
сообщение Jan 15 2014, 13:47
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Доброго времени суток. Ещё где-то недогоняю.
Запускаю кварц. Инициализирую всякие тактовые.
Запускаю таймер на сравнения для получения частоты.
Всё выглядит так:
Код
// Тактовые частоты
#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);

Код
  // Инициализация таймера меток времени
  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 и выше МГц, то работает правильно, а если меньше, то частота получается удвоенная.
И где я не копенгаген? В документации ничего стрёмного не нашёл.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016