Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите вернуть калибровки частоты F2013
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Алексей Савченко
Сбились калибровки во FLASH-INFO, работал на 8МГц, а сча надо бы на 1МГц. Кто работает с MSP430F2013 посмотрите, плиз, эту калибровку. Они там мало отличаются МК от МК, поэтому подобрать будет достаточно просто.(Делал это на 8МГц).
rezident
Попробуйте вот эту функцию. Когда-то писал ее для подстройки DCO по часовому кварцу для совместимых по пинам кристаллов в TQFP-64. Используется встроенная возможность TimerA использовать ACLK как входной сигнал в режиме захвата.
Требуемая частота DCO задается макросом FREQMCLK. FREQACLK частота цасового кварца 32768Гц. Тип/серия кристалла (MSP430x1xx или MSP430x2xx) задается макросом MSP430F2XX_SERIES. Для MSP430x1xx подразумевается наличие внешнего резистора ROSC. Сохранение/восстановление режимов работы таймера А можете выкинуть. Точно также как и сохранение/восстановление битов регистра SR.
Обратите внимание, что для малоногих кристаллов как у вас (MSP430F2013) источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции.
Код
#define RATIO_DCO_ACLK  (FREQMCLK/FREQACLK)       //отношение частот DCO и ACLK
#define DEVIATION_DCO   1                         //допустимая абсолютная погрешность DCO
#ifndef MSP430F2XX_SERIES
  #define RSEL_MASK 0x07
  #define RSEL_MAXVAL  7
#else
  #define RSEL_MASK 0x0F
  #define RSEL_MAXVAL  15
#endif
//================================================//
// Инициализация источников тактирования          //
// MCLK, SMCLK, ACLK                              //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:нет                                  //
//================================================//
void initOscSystem(void)
{ unsigned int SRstat;
  unsigned int uTmp, error, cntr, TACTLstat, TACCTLstat, TACCTL2stat;
  SRstat=__get_SR_register();                       //сохраним статусный регистр
  __bic_SR_register(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
#ifdef MSP430F2XX_SERIES
  BCSCTL3=XT2S1|XCAP_3;                           //3MHZ<XT2<16MHZ, XCAP=12.5pF
#endif
  BCSCTL1=XT2OFF|DIVA_0|RSEL2|RSEL1|RSEL0;        //ACLK=LFXT
  BCSCTL2=SELM_0|DIVM_0|DIVS_0;                   //with ROSC SMCLK=DCO about 6.5МГц
#ifdef MSP430F2XX_SERIES
  while ((BCSCTL3&LFXT1OF)!=0);
  if (*((xByte *)TAG_DCO_30)==0x01)
  { DCOCTL=CALDCO_16MHZ;                          //DCO about 16МГц
    BCSCTL1=CALBC1_16MHZ;//&(~XT2OFF);               //ACLK=LFXT
  }
  else
  { DCOCTL=0x82;                                  //DCO about 16МГц
    BCSCTL1=0x8F;                                //ACLK=LFXT
  }
#else
  DCOCTL=0x80;                                  //DCO about 5МГц
  BCSCTL1=0x8F;                                 //ACLK=LFXT
  BCSCTL2|=DCOR;                                //включить внешний RSEL
#endif
  //сохранение регистров TimerA и инициализация его для подстройки DCO
  TACTLstat=TACTL;
  TACTL|=TACLR;
  TACCTLstat=0;
  if ((TACCTL0&CCIE)!=0)
    TACCTLstat|=(1<<0);
  if ((TACCTL1&CCIE)!=0)
    TACCTLstat|=(1<<1);
  TACCTL2stat=TACCTL2;
  TACCTL2=CM_2|CCIS_1|CAP;                        //CCInput2=ACLK
  TACTL=TASSEL_2|ID_0|MC_2;                       //TACLK=SMCLK
  //подстроим DCO по LFXT с помощью режима захвата TimerA
  error=0;
  do
  { TACCTL2&=~CCIFG;
    while((TACCTL2&CCIFG)==0);          //ловим первый фронт ACLK
    uTmp=TACCR2;
    TACCTL2&=~CCIFG;
    while((TACCTL2&CCIFG)==0);         //ловим второй форнт ACLK
    uTmp=TACCR2-uTmp;                 //получаем отношение частот SMCLK/(ACLK*2)
    if (uTmp!=RATIO_DCO_ACLK)
    {
      if ((uTmp>(RATIO_DCO_ACLK<<1))||//отношение частот выше заданного более чем в 2 раза?
          (DCOCTL==0x00)
         )
      { cntr=BCSCTL1&RSEL_MASK;
        if (cntr>0)
          cntr-=1;
        BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
        DCOCTL=DCO2;
        error=1;
      }
      else
        if ((uTmp<(RATIO_DCO_ACLK>>1))||//отношение частот ниже заданного более чем в 2 раза?
            (DCOCTL>=0xE0)
           )
        { cntr=BCSCTL1&RSEL_MASK;
          if (cntr<RSEL_MAXVAL)
            cntr+=1;
          BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
          DCOCTL=DCO2;
          error=1;
        }
        else
          if (uTmp>(RATIO_DCO_ACLK+DEVIATION_DCO))//отношение частот выше заданного?
          { if (DCOCTL>0)
              DCOCTL-=1;
            if (error<0xFFFF)
              error++;
          }
          else
            if (uTmp<(RATIO_DCO_ACLK-DEVIATION_DCO))//отношение частот ниже заданного?
            { if (DCOCTL<0xFF)
                DCOCTL+=1;
              if (error<0xFFFF)
                error++;
            }
            else
              error=0;                  //отношение частот попало в заданный диапазон
    }
    else
      error=0;
  } while(error!=0);       //цикл, пока отношение частот не будет в заданном диапазоне
  //восстановим регистры TimerA
  TACTL|=TACLR;
  TACCTL2=TACCTL2stat;
  if ((TACCTLstat&(1<<1))!=0)
    TACCTL1|=CCIE;
  else
    TACCTL1&=~CCIE;
  if ((TACCTLstat&(1<<0))!=0)
    TACCTL0|=CCIE;
  else
    TACCTL0&=~CCIE;
  TACTL=TACTLstat;
  //установим назначенные делители для MCLK и SMCLK
  BCSCTL2|=SELM_0|DIVM_0|DIVS_0|SELS;    //MCLK=DCO, SMCLK=XT2
  IE1|=OFIE;
  SRstat&=~(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
  __bis_SR_register(SRstat);
}

Используя вместо макросов FREQMCLK и FREQACLK переменные, можно "прогнать" функцию несколько раз, получить значения регистров для всех требуемых частот и восстановить калибровочные параметры, записав их во Flash. Только не забудьте прописать еще и байт признака наличия этих констант TAG_DCO_30.
Если такой способ вам покажется слишком геморройным, то ждите пока кто-нибудь опубликует готовые значения. У меня нет ни eZ430, ни такого кристалла.
Алексей Савченко
Вроде понял, только ни разу и не использовал в таких возможностях таймер. Поэтому возник один вопрос. Вы написали:
Цитата(rezident @ Sep 3 2008, 19:37) *
источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции.


По коду видно, что CCI2B подключается к входу таймера при захвате. Это надо в даташите посмотреть куда заводиться внутренне ACLK? И что б подключить с портом ничего не надо мутить(все по умолчанию)?(CCIхB для нулевого таймера)
P.S. Я потенциально догадываюсь как следует, но из-за малого опыта боюсь ошибиться.
rezident
Цитата(Алексей Савченко @ Sep 4 2008, 00:49) *
По коду видно, что CCI2B подключается к входу таймера при захвате. Это надо в даташите посмотреть куда заводиться внутренне ACLK? И что б подключить с портом ничего не надо мутить(все по умолчанию)?(CCIхB для нулевого таймера)
С портом мутить ничего не нужно. Коммутация внутренняя, внутри кристалла. Описание нужно смотреть в datasheet MSP430F2013 в разделе short-form description. Вот эта табличка.
Кстати, я ошибся. Сигнал ACLK на TA0 коммутируется - CCI0B. Я же писал эту функцию для MSP430F2418, там CCI2B.
Shread
На 2013 есть тестовая софтина, которая с подключенным часовым кварцем восстанавливает калибровочные константы, брать на msp430.com в разделе с описанием на процессор.

Цитата(rezident @ Sep 3 2008, 23:15) *
Коммутация внутренняя, внутри кристалла.

Внутренняя работает не на всех чипах, смотрите внимательно на ревизию кристалла и еррату.
rezident
Цитата(Shread @ Sep 4 2008, 12:48) *
Внутренняя работает не на всех чипах, смотрите внимательно на ревизию кристалла и еррату.
Да, действительно - TA17 в Errata. Нужно смотреть чтобы MSP430F2013 был ревизии C или выше.
Алексей Савченко
На сайт TI не лез, эта програмулина понравилась. Все пошло с первого раза, как то не привычно smile.gif , обычно так не бывает. Возьму себе не вооружение...
rezident
Цитата(Алексей Савченко @ Sep 4 2008, 21:33) *
На сайт TI не лез, эта програмулина понравилась. Все пошло с первого раза, как то не привычно smile.gif , обычно так не бывает. Возьму себе не вооружение...
Вы про мою функцию или о чем?
Кстати, Shread, под "тестовой софтиной" видимо имел в виду пример msp430x20xx_dco_flashcal.c из архива MSP430F20xx C Examples (IAR and CCE) (Rev. D)(slac080d.zip, 68 KB )
Алексей Савченко
Да, я про вашу программу, rezident.
А эта тестовая софтина msp430x20xx_dco_flashcal всегда была под рукой. Блин, вот что значит не внимательный 05.gif
Shread
Да, я имел ввиду именно эту софтину. Мы очень конкретно нае..лись пока поняли в чем дело. Пересаживали девайс с 1121 на 2013, с целью удешевления, и уменьшения габаритов. В итоге пообщались с ребятами из Праги, получили массу интересных ответов, в том числе сцыль вот на енту штуковину: http://focus.ti.com/mcu/docs/mcusupporttec...actName=slaa322
rezident
Цитата(Shread @ Sep 11 2008, 20:02) *
В итоге пообщались с ребятами из Праги, получили массу интересных ответов, в том числе сцыль вот на енту штуковину: http://focus.ti.com/mcu/docs/mcusupporttec...actName=slaa322
У вас были проблемы с запуском ноунеймовских часовых кварцев?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.