Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F5529 програмирование
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
AlexB.
Не могу разобраться с конфигурацией регистров для XT2 осцилятора.
(в програмировании С++ MSP430 начинающий строго не судить =)
KARLSON
A на какую частотный канал (ACLK/MCLK/SMCLK) хотите кварц подключить? и какой кварц?
Ave
Цитата(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 МГц
rezident
Цитата(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 почитать стоит.
Ave
Спасибо за подсказку про баг обязательно посмотрю.
Уже полгода как работает устройство с такой инициализацией и нет проблем.
Устройство постояно включается выключается.
Используется кварц в программе и если он не запустится то смысла дальнейшей работы нет.
В примерах TI инициализация кварца на XT2 приводится так.
rezident
Цитата(Ave @ Aug 22 2012, 20:22) *
Уже полгода как работает устройство с такой инициализацией и нет проблем.
Устройство постояно включается выключается.
Я не говорю, что проблемы обязательно будет, а только, что могут быть. Сам просидел аж три дня, когда запускал систему тактирования у MSP430F5438A. У меня 6МГц на XT2 только для измерения некой входной частоты используется. Для всего остального (включая связь), когда не требуется измерять частоту, используется DCO. Подстраиваю DCO так, чтобы SMCLK можно было переключать к XT2CLK или к DCOCLKDIV без изменения частоты SMCLK.
Цитата(Ave @ Aug 22 2012, 20:22) *
Используется кварц в программе и если он не запустится то смысла дальнейшей работы нет.
Смысл продолжить работу есть всегда. По крайней мере можно показать пользователю, миганием светодиода или бибиканием пищалки, что устройство как-то работает, но у него есть проблемы/неисправности. Это лучше, чем черный ящик, который вообще "молчит", не так ли? И для этого достаточно подстроить DCO под частоту ВЧ кварца и/или использовать REFO вместо часового. Работать MSP430 при этом будет точно также как и с кварцами, но с некоторым снижением точности тех измерений, которые привязаны к тактовой частоте генераторов. По крайней мере факт неисправности генераторов можно фиксировать отдельно.
Цитата(Ave @ Aug 22 2012, 20:22) *
В примерах TI инициализация кварца на XT2 приводится так.
Примеры кода TI пишут люди аля индусских студентов sm.gif Для создания надежных устройств нужны специализированные подходы к программированию. А ненадежных устройств и без этого много wink.gif
Ave
Наверно вы правы. Устройство не имеет светодиодов для экономии электроэнергии и потребителю всеравно почему не работает.
Иногда нет времени все проверять заработало "значит правильно".
Да в примерах нет функции включающей питание при установки кварца 24МГц намучался пока понял причину.
Спасибо за обяснение попробую исправить.
kd522
вопрос по процедуре поднятия напряжения питания ядра МК msp430f5438a:
Кто-нибудь разбирался с заданием порогов сработки svs/svm для напряжения ядра (low-side)? откуда взялась там та формула? Ведь там 3 бита на svsmlrrl и 2 бита на svslrvl. А умножать предлагается на младшие биты соответственно для каждого значения. Где взять реальные значения порогов сработки в Вольтах?
Действительно ли для каждого напряжения питания ядра допустимы только определенные пороги (так в документации по МК msp430f5438a)?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.