|
|
  |
Помогите вернуть калибровки частоты F2013 |
|
|
|
Sep 3 2008, 15:57
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704

|
Сбились калибровки во FLASH-INFO, работал на 8МГц, а сча надо бы на 1МГц. Кто работает с MSP430F2013 посмотрите, плиз, эту калибровку. Они там мало отличаются МК от МК, поэтому подобрать будет достаточно просто.(Делал это на 8МГц).
|
|
|
|
|
Sep 3 2008, 16:37
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Попробуйте вот эту функцию. Когда-то писал ее для подстройки 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, ни такого кристалла.
|
|
|
|
|
Sep 3 2008, 18:49
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704

|
Вроде понял, только ни разу и не использовал в таких возможностях таймер. Поэтому возник один вопрос. Вы написали: Цитата(rezident @ Sep 3 2008, 19:37)  источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции. По коду видно, что CCI2B подключается к входу таймера при захвате. Это надо в даташите посмотреть куда заводиться внутренне ACLK? И что б подключить с портом ничего не надо мутить(все по умолчанию)?(CCIхB для нулевого таймера) P.S. Я потенциально догадываюсь как следует, но из-за малого опыта боюсь ошибиться.
|
|
|
|
|
Sep 3 2008, 19:15
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Алексей Савченко @ Sep 4 2008, 00:49)  По коду видно, что CCI2B подключается к входу таймера при захвате. Это надо в даташите посмотреть куда заводиться внутренне ACLK? И что б подключить с портом ничего не надо мутить(все по умолчанию)?(CCIхB для нулевого таймера) С портом мутить ничего не нужно. Коммутация внутренняя, внутри кристалла. Описание нужно смотреть в datasheet MSP430F2013 в разделе short-form description. Вот эта табличка. Кстати, я ошибся. Сигнал ACLK на TA0 коммутируется - CCI0B. Я же писал эту функцию для MSP430F2418, там CCI2B.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 4 2008, 06:48
|
иногда заглядывающий
   
Группа: Свой
Сообщений: 900
Регистрация: 18-05-05
Из: Зеленоград
Пользователь №: 5 170

|
На 2013 есть тестовая софтина, которая с подключенным часовым кварцем восстанавливает калибровочные константы, брать на msp430.com в разделе с описанием на процессор. Цитата(rezident @ Sep 3 2008, 23:15)  Коммутация внутренняя, внутри кристалла. Внутренняя работает не на всех чипах, смотрите внимательно на ревизию кристалла и еррату.
|
|
|
|
|
Sep 4 2008, 15:33
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704

|
На сайт TI не лез, эта програмулина понравилась. Все пошло с первого раза, как то не привычно  , обычно так не бывает. Возьму себе не вооружение...
|
|
|
|
|
Sep 4 2008, 15:50
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Алексей Савченко @ Sep 4 2008, 21:33)  На сайт TI не лез, эта програмулина понравилась. Все пошло с первого раза, как то не привычно  , обычно так не бывает. Возьму себе не вооружение... Вы про мою функцию или о чем? Кстати, Shread, под "тестовой софтиной" видимо имел в виду пример msp430x20xx_dco_flashcal.c из архива MSP430F20xx C Examples (IAR and CCE) (Rev. D)(slac080d.zip, 68 KB )
|
|
|
|
|
Sep 6 2008, 08:10
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704

|
Да, я про вашу программу, rezident. А эта тестовая софтина msp430x20xx_dco_flashcal всегда была под рукой. Блин, вот что значит не внимательный
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|