2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609

Запуск кварцевого (ВЧ) генератора в MSP430 (решено)

24.10.2013, 01:38. Показов 9060. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Осваиваю систему тактирования МСП430, а именно - семейство MSP430FR57xx. Так как в МСП430 все вновье, то нипанятки не знаю куда относить. Потому и спрашиваю.

Итак, у меня генератор ХТ1 работает с кварцем 7,3728 МГц. В данном семействе специального ВЧ генератора ХТ2 нет, поэтому один и тот же ХТ1 используется и с часовыми кварцами, и с высокочастотными. Для конфигурирования железа придумали бит ХТ1 в регистре CSCTL4.
И вот не запускается у меня кварцевый генератор.
Вот код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_PJ,
GPIO_PIN4,
GPIO_SECONDARY_MODULE_FUNCTION);
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_PJ,
GPIO_PIN5,
GPIO_SECONDARY_MODULE_FUNCTION);
 
CSCTL0 = CSKEY;
CSCTL4_L |= XT1DRIVE1_L + XT1DRIVE0_L;
CSCTL4 |= XTS;
CSCTL4 &= ~XT1BYPASS;
CSCTL4 &= ~XT1OFF;
while ((CSCTL5 & XT1OFFG) && --timeout) {
CSCTL5 &= ~XT1OFFG;
SFRIFG1 &= ~OFIFG;
}
 
if (timeout) {
CSCTL4 &= ~XT1DRIVE_3;
CSCTL4 &= ~XT1OFF;
success_clock = 1;
}
else
success_clock = 0;
CSCTL0_H = 0x00;
В общем-то, сначала все было сделано с использованием dryverlib, но потом, в хоте поисков причин, настройку генератора я раскрыл до операций с регистрами. Как-то привычней и понятней.
Итак, сначала настраиваю выводы порта PJ на работу с кварцем. Потом разблокирую доступ к регистрам системы тактирования, даю максимум мощности ХТ1-генератору (на время запуска), ставлю флаг высокочастотной работы XTS, снимаю флаг XT1BYPASS и (тут отступил от библиотеки) - флаг XT1OFF.
Теперь, ИМХО, генератор начнет раскручиваться. В цикле while ожидается, когда он перестанет поднимать флаг ошибки. Если это произойдет раньше 1000000 проходов в цикле while, то все чики-пики. Но у меня всегда истекает таймаут.
Ну, дальше там по программе объявление ХТ1 источником сигнала для MCLK и SMCLK, а потом я наблюдаю значение переменной success_clock. Она и показывает, что кварц не стартанул (впрочем, осцилл поддерживает это мнение).

В чем я нахомутал? Примеры в даташитах как-то мало имеют дела со внешними кварцами. Стандартные функции от dryverlib не работают так же. Кварц менял. Ну, могу дальше рыться, но вдруг я чего-то крупно не понимаю - прошу помощи.

ДОБАВЛЕНО: Итак, в чем была ошибка: в конфигурировании портов PJ.4 и PJ.5. Я ставил GPIO_SECONDARY_MODULE_FUNCTION - а нужно GPIO_PRIMARY_MODULE_FUNCTION.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2013, 01:38
Ответы с готовыми решениями:

Моделирование кварцевого генератора.
Не могу смоделировать работу простейшего кварцевого генератора. Ни в мультисиме, не в електроник ворк бенч. Проблема явно в том что я не...

УГО кварцевого генератора
Добрый день. Интересует условно-графическое обозначение кварцевого генератора, никак не могу найти. Именно генератора, а не резонатора....

Расчет кварцевого генератора на ТТЛ
Помогите, пожалуйста. Необходимо рассчитать номиналы элементов и определить коэффициент гармоник выходного сигнала кварцевого генератора на...

8
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
24.10.2013, 02:18
подозреваю что CSKEY равен 0xA5, а не 0xA500.
соответственно CSCTL0_H = 0xA5;
младшие разряды помечены как reserved и read only, лучше в них ничего не писать.

если не поможет:
руками записать PJSEL раз уж всё остальное напрямую делается
попробовать XT1DRIVE занулить, хотя осциллографом хоть что-нибудь было бы видно, если бы из-за этого.
ну и совсем невероятное: timeout не 16ти разрядный случайно

и делать какие-либо действия в сложных условиях нехорошо,
while ((CSCTL5 & XT1OFFG) && --timeout)
компилятор может оказаться слишком умным и по совпадению с первым условием на второе забить совсем, зачем проверять если и так понятно какой результат будет, соответственно декремент --timeout может быть пропущен, в данном случае не принципиально, так как если CSCTL5 & XT1OFFG окажется нулём то из цикла всё равно вывалимся, не особо важно, уменьшая лишний раз timeout или нет, но в другой ситуации грабли могут получиться знатные.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
24.10.2013, 02:41
Если с железом проблем нет (кварц и конденсаторы исправные).
То вот это можно проверить: в FR57xx серии флаги ошибок осциляторов нужно очищать в софте до использования.

Fail-Safe logic The UCS fail-safe logic plays an important part in providing a robust clocking scheme
for MSP430x5xx omd MSP430x6xx applications. This feature hinges on the ability to detect an
ossyttator fault for the XT1 in both low- omd high-frequency modes (XT1LFOFFG omd XT1HFOFFG
respectively), the high-frequency XT2 (XT2OFFG), omd the DCO (DCOFFG). These flags are set
omd latched when the respective ossyttator is enabtid but not operating properly; therefore, they
must be explicitly cleared in software
The ossyttator fault flags on previous MSP430 generations are not latched omd are ossirted only
as long as the failing condition exists. Therefore, an important difference between the families is
that the fail-safe behavior in a 5xx-based MSP430 remains active until both the OFIFG omd the
respective fault flag are cleared in software.
This fail-safe behavior is implemented at the ossyttator level, at the system clock level omd, conse-
quently, at the module level. Some notable highlights of this behavior are dessribed below. For
the full dessription of fail-safe behavior omd conditions, see the MSP430x5xx/MSP430x6xx Family
UserSs Guide (SLAU208).
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
24.10.2013, 02:49
так он и так в цикле очищается.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
24.10.2013, 03:03
Цитата Сообщение от _pv
так он и так в цикле очищается.
Да, тогда проблема до этого еще.
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
24.10.2013, 11:41
Спасибо, коллеги, что откликнулись!

Цитата Сообщение от dykytdroyd
Да, тогда проблема до этого еще.
Угу. В голове вавка, от того и проблемы...
Ладно, не буду посыпать свою бедную голову дерьмом, у нас на форуме достаточно таких, кто с удовольствием сделают это за меня.
"К тому же у них разделенье труда..." :)

Чуток разобрался. Есть результат, есть новый вопрос.
Итак, в чем была ошибка: в конфигурировании портов PJ.4 и PJ.5. Кстати, эту ошибку в приведенном коде видно :) Там я ставлю GPIO_SECONDARY_MODULE_FUNCTION - а нужно GPIO_PRIMARY_MODULE_FUNCTION. Вот и весь хер до копейки! Генератор заработал. ЩАС еще поиграюсь, посмотрю, что там можно, что нельзя - в смысле последовательности действий по конфигурированию. Чтобы уже разобраться с вопросом раз и навсегда. Потом забуду, спрошу на форуме, а мой Брат shads даст ссылку на мой же постинг - вот и вспомню :)
Так что вот результат - сабж решен.

Но вот и обещаный вопрос. Он касается даташитов. Похоже, что мой вход в тему МСП430 сразу с семейства FR57xx не типичен, разработчики документации пишут даташиты на это семейство с учетом того, что чайник уже научился чего-нить на предыдущих семействах :)
К сожалению, я пока не нашел адекватного описания альтернативных функций портов. Какие источники:

1) Распиновка


Интересно, как мне трактовать эти блядские 5 строчек против каждого пина? Кроме Kimeral Purpose там еще 4, а все даташиты вообще говорят о ТРЕХ возможных альтренативных функциях.
Ну вот, методом теперь уже тупого тыка (а какой еще может быть тык?) я вычислил, что вывод в порты сигналов внутренних генераторов представляет... барабанная дробь... GPIO_PRIMARY_MODULE_FUNCTION. Во как интересно. В приведенных рисунках-таблицах этого никак не видно.

Так что вопрос: мож где-то раньше TI написали, как выбирать нужный номер альтернативной функции - то ткните в ссылку, плз. Я и так медленно въезжаю, а тут еще эксперименты вокруг даташитов танцевать...
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
24.10.2013, 12:20
в самом конце даташита есть схемы каждого пина, и для каждого пина там есть нормальная табличка значений PSEL
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
24.10.2013, 13:06
Ага! Вот откуда "лишие" строки! Если пин на вход или на выход - то можно его в двух разных альтернативных функциях заюзать с одинаковым кодом этой самой альтернативной функции! Ну, слава Богу! Разобрался. Спасибо!

ОК, идем дальше. Уже не сабж, но небольшой вопрос, не буду плодить темы. Посмотрел я на эти dryverlib, которые то хочу, то не хочу использовать. Вот сейчас уже снова не хочу:

Ладно, стиль записи громоздкий, эти офигенные имена а-ля немецкие слова. Можно привыкнуть.
Ладно, "спрятанность" того, что реально там делается. Можно посмотреть (прямо в Студии, что удобно), когда уже логику понял, то довольно быстро становится понятно, какие там телодвижения возникают
Ладно, что в разных версиях библиотек даже дефайны разные. Я наткнулся на такое, когда Грейс породил некий пример, я его заюзал, а потом долго правил такие, скажем, различия, как TimerA_.... и Timer_A_.... (аналогично и в настройках УАРТ-а имена разные).
Ладно, что скорострельность уж ОЧЕНЬ падает:
смотрим пример цикла с генерацией на 2-х портах меиндров:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define DRVLIB
do {
if( success_clock) {
#ifdef DRVLIB
GPIO_toggleOutputOnPin( DOSTUP_PORT, DOSTUP_PIN);
#else
ui4 = P2IN & (1<<5);
if( ui4) P2OUT &= ~(1<<5);
else     P2OUT |=  (1<<5);
#endif
}
else {
GPIO_toggleOutputOnPin( BLUM_PORT, BLUM_PIN);
}
#ifdef DRVLIB
GPIO_toggleOutputOnPin( TP_PORT, TP_PIN);
#else
ui4 = P1IN & (1<<6);
if( ui4) P1OUT &= ~(1<<6);
else     P1OUT |=  (1<<6);
#endif
} while(1);
Если сделать #define DRVLIB, то период всей петли равен 34,2 мкс, а если убрать, то с использованием простых обращений к портам - 8 мкс. Фигасе, в 4 с лишком раза...

Ладно... Все это можно простить, если ориентироваться на переносимость проекта. И то, с учетом нипаняток по поводу разных версий самой drvlib, может не быть уж так все автоматически. Но если я собираюсь данный проект заюзать на одном камешке, если настройки под камень составляют небольшую сложность, если переход на другой вызывается необходимостью много чего переосмыслит-переделать, то "почти автоматическое" портирование - вещь призрачная.
Вот и думаю, может все же работать с периферией старым дедовским способом? Какие у колег, работающих с МСП430, есть соображения?
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
24.10.2013, 13:24
Цитата Сообщение от drvtos
Вот и думаю, может все же работать с периферией старым дедовским способом? Какие у колег, работающих с МСП430, есть соображения?
Если изделие мелкое, то вряд ли будет существенный рост в пределах одной серии. Тогда и городить лапшу из библиотек смысла нет.
Под 1-2 камня всегда можно свои define настрочить и использовать.
Плюс библиотек - если изделий много и софта сложного много, а компании нужно экономить на разработчиках, которые десятилетиями это софт поддерживают.
Тогда забиваем на эффективность и качество (за счет клиента само собой) и облегчаем себе жизнь библиотеками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2013, 13:24
Помогаю со студенческими работами здесь

Питание для кварцевого генератора
Приветствую! Озадачился вопросом точного тактирования. Сколько удалось понять, что кроме генератора с низким значением PPM и стабильной...

Форма сигнала кварцевого генератора
Приветствую! Сделал замеры сигнала с кварцевого генератора, частоту показывает верно, а вот форма сигнала сильно удивила. Схема...

Правильное подключение кварцевого генератора
Добрый день. Имеется кварцевый генератор на 16 MHz. Не очень разобрался ка подключать, на всех схемах у него всего два выхода, а на...

Тактирование от кварцевого генератора на 32768 Гц. Установка таймера на 10 мс
Добрый день, вопрос по теории. Допустим у меня есть таймер, который работает от кварца 32,768 кГц, и мне надо сделать отсчет 10мс. Я...

(Решено) Запуск внешней программы из своей под OS X
Битый час пытаюсь запустить стороннюю программу из под своей, но ничего не получается. AProcess := TProcess.Create(nil); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru