Часы реального времени MSP430 (RTC_B) не работают. Не удается записать регистры даты/времени

Я пытаюсь установить регистры даты/времени, используя модуль RTC_B микроконтроллера MSP430F5338. Я делаю это так:

RTCCTL0 = 0;
RTCCTL1 |= RTCHOLD +RTCBCD;
RTCHOUR = 0x14;
RTCCTL1  &= ~RTCHOLD;

Это не работает, и просто игнорируйте назначения. Я не могу понять, почему. Единственная странная вещь, которую я заметил, это установленный флаг RTCOFIFG.

Есть идеи?

Дополнение

Вот как я настроил источники часов:

void clk_init(){
  SetVcoreUp (0x01);
  SetVcoreUp (0x02);
  SetVcoreUp (0x03);

  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_7;                      // Select DCO range 50MHz operation
  UCSCTL2 = FLLD_1 | ((f_SMCLK/f_ACLK) -1);                   // Set DCO Multiplier for 25MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (762 + 1) * 32768 = 25MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop


  // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
  do{
    UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

}

void SetVcoreUp (unsigned int level)
{
  // Open PMM registers for write
  PMMCTL0_H = PMMPW_H;
  // Set SVS/SVM high side new level
  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;
}

person Carlo Pane    schedule 06.12.2013    source источник
comment
Вы действительно пытаетесь установить час на 34 декабря (шестнадцатеричный 22) и установить год на 8211 декабря (шестнадцатеричный 2013)? Я предполагаю, что он отказывается устанавливать что-то на 34 часа...   -  person Ross    schedule 06.12.2013
comment
Вы правы, но теперь я установил RTCHOUR = 0x0A, и он все еще не работает...   -  person Carlo Pane    schedule 06.12.2013


Ответы (2)


Я РЕШИЛ добавить это перед настройкой часов:

 while (BAKCTL & LOCKBAK) BAKCTL &= ~LOCKBAK;

В основном это связано с тем, что msp430f5338 имеет систему резервного питания от батареи, поэтому вам понадобится этот код, прежде чем вы настроите ACLK для диска XT1.

Надеюсь это поможет.

person Carlo Pane    schedule 10.12.2013

Только что просмотрев таблицу данных - две вещи:

  1. Устанавливая флаг RTCBCD в RTCCTL1, вы говорите, что хотите использовать двоично-десятичное число, поэтому установка RTCHOUR как 0x0A бессмысленна. Чтобы правильно написать BCD для, скажем, 14:47 (14:47), вы пишете часы как 0x14 и 0x47 как минуты, т. е. пишете так, как видите.

  2. Убедитесь, что вы не находитесь в режиме низкого энергопотребления 5 (LPM5) — параметры конфигурации не сохраняются.

Дополнение:

Кроме того, флаги RTCOFIFG говорят о неисправности вашего генератора, так что проверьте и схему.

person Ed King    schedule 10.12.2013
comment
Хорошо, я исправил значение RTCHOUR, но оно все равно не работает. Пойду проверю схему, как ты и предложил. - person Carlo Pane; 10.12.2013
comment
Судя по всему, ошибки схемы нет. Я протестировал код на официальной плате разработки. - person Carlo Pane; 10.12.2013
comment
Предполагая, что вы используете внешний кварц 32 кГц, вы на самом деле управляете им? Можете ли вы поставить на него прицел и увидеть, как он колеблется? - person Ed King; 10.12.2013
comment
Кроме того, те строки, которые вы написали выше, действительно выполняются отладчиком - они не оптимизированы или что-то столь же глупое? - person Ed King; 10.12.2013
comment
- Я добавил свою настройку источников часов. - Нет, никакой оптимизации я не провожу. - person Carlo Pane; 10.12.2013
comment
У меня такая же проблема. Внутренний RTC не может заблокироваться. Одна особенность заключается в том, что RTC блокируется при использовании отладчика MSP430 (MSP-FET430UIF). - person OneGuyInDc; 04.06.2015