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

 
 
> MSP430F5529 програмирование, Как запустить 25МГц осцилятор по XT2 и вывести на порт
AlexB.
сообщение Aug 12 2012, 14:52
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 12-08-12
Пользователь №: 73 101



Не могу разобраться с конфигурацией регистров для XT2 осцилятора.
(в програмировании С++ MSP430 начинающий строго не судить =)
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KARLSON
сообщение Aug 13 2012, 04:46
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



A на какую частотный канал (ACLK/MCLK/SMCLK) хотите кварц подключить? и какой кварц?


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
Ave
сообщение Aug 22 2012, 12:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 12-09-05
Пользователь №: 8 478



Цитата(KARLSON @ Aug 13 2012, 07:46) *
A на какую частотный канал (ACLK/MCLK/SMCLK) хотите кварц подключить? и какой кварц?


Если еще интересно инициализация кварца для MSP430F5528 на XT2 выполняется так
Код
void SetVcoreUp (unsigned int level)
{
#ifdef MSP
  // Open PMM registers for write
  PMMCTL0_H = PMMPW_H;              
  // Set SVS/SVM high side new level SVMHE = 1, SVSMHRRL
  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
  // Set SVM low side to new level
  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
  // Wait till SVM is settled
  while ((PMMIFG & SVSMLDLYIFG) == 0);
  // Clear already set flags
  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
  // Set VCore to new level
  PMMCTL0_L = PMMCOREV0 * level;
  // Wait till new level reached
  if ((PMMIFG & SVMLIFG))
    while ((PMMIFG & SVMLVLRIFG) == 0);
  // Set SVS/SVM low side to new level
  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
  // Lock PMM registers for write access
  PMMCTL0_H = 0x00;
#endif
}

void SetupFreq(void)
{
  P5SEL |= BIT2+BIT3;                       // Port select XT2

  SetVcoreUp (0x03);
  UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                            // Since LFXT1 is not used,
                                            // sourcing FLL with LFXT1 can cause
                                            // XT1OFFG flag to set
  UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  UCSCTL6 &= ~XT2DRIVE_3;                   // Clear XT2drive field
  // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG_L + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  } while (SFRIFG1 & OFIFG);                // Test oscillator fault flag

  UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
                                            // expected frequency
  UCSCTL6 |= XTS;                           //
  UCSCTL6 |= XT2DRIVE_3;                    // Set requested value
  UCSCTL4 &= ~(SELS_7 + SELM_7);
  UCSCTL4 |= SELS_5 + SELM_5;                // SMCLK=MCLK=XT2
}


Функция SetVcoreUp (0х03) необходимо задавать при частоте кварца больше 16 МГц
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 22 2012, 14:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Ave @ Aug 22 2012, 17:59) *
Если еще интересно инициализация кварца для MSP430F5528 на XT2 выполняется так

Хотелоcь бы заметить, что поскольку в вашей программе регистры инициализируются не явными значениями, а с иcпользованием масок, то вот в этом куске кода можно зациклиться навсегда.
Цитата(Ave @ Aug 22 2012, 17:59) *
Код
  // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG_L + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  } while (SFRIFG1 & OFIFG);                // Test oscillator fault flag

Причина в том, что "по умолчанию" FLL включена (бит SCG0 сброшен) и подключана к REFO (опорная частота, до того как LFXT "заведется"), а DCO ей (системой FLL) настраивается на частоту DCOCLK=2МГц, DCOCLKDIV=1МГц. И если вы не проинициализировали явными значениями коэффициенты "петевого деления" FLL (регистр UCSCTL2) и диапазона частоты DCO (регистр UCSCTL1), то FLL имеет возможность свалить модулятор DCO на "упор". При этом бит аварии DCOFFG будет всегда установлен и соответственно бит OFIFG сбрасываться тоже не будет. Так что, во-первых, после старта нужно инициализировать все регистры явными значениями. Во-вторых, при проверке готовности генераторов использовать только соответствующие им биты (XT1LFOFFG/XT1HFOFFG и XT2OFFG), а не бит общей аварии OFIFG. В-третьих, не использовать FLL все время, а только однократно для "грубой"/начальной подстройки частоты DCO. Затем отключать FLL и при необходимости подстраивать DCO "вручную" используя TimerB и ACLK. Подробнее все это по мотивам бага UCS10 освещается в документе UCS10 Guidance (slaa489a). UCS10 в Errata MSP430F5529 не упомянут, но тем не менее указанный AppNote почитать стоит.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 02:07
Рейтинг@Mail.ru


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