Перейти к содержанию
    

PLLC SYSCLK1..3

Всем Добрый День!

Продолжая разбираться с процом С6722 возникла необходимость использовать PLLC для увеличения частоты как самого ядра (SYSCLK1), периферии (SYSCLK2), так и частоты EMIF (SYSCLK3). Для этого решил воспользоваться CSL v.3. Решил начать с частоты ядра, однако, не зная как проверить правильность работы решил подергать пином, заведенным на McASP (сконфигурировав его как GPIO), "поднимая" и "опуская" его через цикл for, предполагая, что при смене частоты ядра, циклы должны выполняться по разному. Однако этого не произошло.

Не подскажите ли как еще можно проверить SYSCLK1..3 ?

 

Заранее Спасибо, aod. =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое и самое простое - смотрите EMIF'овскую частоту на EM_CLK. Периферийный клок проверяется через McASP, но нужно запустить клок генератор и выдать что-нибудь на AHCLKxx или ACLKxx. Пином подергать тоже можно, но там Вы не получите значение частоты. Будет существенно медленнее, чем хотелось бы. И совет - не используйте CSL. Проще и быстрее написать нужные данные в регистры. Вот пример инициализации PLL. Цифры подставите какие нужно:

#define DnEN 0x8000
#define GOSET 0x1
#define GOSTAT 0x1
#define PLLEN 0x1
#define PLLRST 0x8
#define ALN1 0x1
#define ALN2 0x2
#define ALN3 0x4
register int i;
// PLL init
PLLCSR = 0;
__asm("\t	nop 5");
PLLCSR = PLLRST;
PLLM = 8;
PLLDIV0 = DnEN | 0;
PLLDIV1 = DnEN | 1;
PLLDIV2 = DnEN | 1;
PLLDIV3 = DnEN | 2;
ALNCTL = ALN1 | ALN2 | ALN3;
PLLCMD = GOSET;
while (PLLSTAT & GOSTAT);
PLLCSR = 0;
for(i=0; i<40000; i++) __asm("\t	nop");
CKEN = 0x7;
PLLCSR = PLLEN;
CFGBRIDGE = 0x1;
__asm("\t	nop 8");
CFGBRIDGE = 0x0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил начать с частоты ядра, однако, не зная как проверить правильность работы решил подергать пином, заведенным на McASP (сконфигурировав его как GPIO), "поднимая" и "опуская" его через цикл for, предполагая, что при смене частоты ядра, циклы должны выполняться по разному. Однако этого не произошло.

Так Вы измерите только частоту работы GPIO, которая скорей всего не зависит от PLL.

Читайте документацию на PLL процессора - обычно в составе PLL процев TI имеется какой-нить пин, выводящий частоту PLL (CLKOUT, OBSCLK, ...).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо jcxz и Alex11 за ответы!

По отзывам на рунете, действительно мало кто советует пользоваться CSL, поэтому думаю творчески подойти к вопросу и,по совету, написать свою карту памяти.

Нашел на e2e gel-файл для pll,emif и spi с картой памяти и инициализацией, возможно перепостю его: c6722gel.txt

Еще возник отстраненный вопрос на:

Так Вы измерите только частоту работы GPIO, которая скорей всего не зависит от PLL.

Наверно Вы не поняли меня,т.к. если я правильно понимаю, то за скорость выполнения цикла for будет отвечать частота ядра. Возможно я ошибаюсь.

Вот как я "проверял" частоту меняя SYSCLK1:

/*кстати код брал с electonix.ru =)*/
for(i=0;i<100000;i++){}
*(int *)PDOUT0 |= 1<<8; // Up 
for(i=0;i<100000;i++){}
*(int *)PDOUT0 &= ~(1<<8); // Down

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверно Вы не поняли меня,т.к. если я правильно понимаю, то за скорость выполнения цикла for будет отвечать частота ядра. Возможно я ошибаюсь.

Вот как я "проверял" частоту меняя SYSCLK1:

/*кстати код брал с electonix.ru =)*/
for(i=0;i<100000;i++){}
*(int *)PDOUT0 |= 1<<8; // Up 
for(i=0;i<100000;i++){}
*(int *)PDOUT0 &= ~(1<<8); // Down

Во-первых: код у вас неверный - компилятор удалит эти пустые циклы и будет прав. Если хотите таким образом делать задержки, то используйте volatile. И смотрите в ассемблерный листинг.

Во-вторых: частота работы GPIO много меньше (в разы или даже на порядки) частоты ядра, т.е. - большую часть времени процессор будет ждать готовности шины GPIO и цикл будет выполняться с частотой близкой к частоте GPIO.

Вам уже объяснили, что использование GPIO - неверный путь и предложили несколько хороших способов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых: код у вас неверный - компилятор удалит эти пустые циклы и будет прав. Если хотите таким образом делать задержки, то используйте volatile. И смотрите в ассемблерный листинг.

Во-вторых: частота работы GPIO много меньше (в разы или даже на порядки) частоты ядра, т.е. - большую часть времени процессор будет ждать готовности шины GPIO и цикл будет выполняться с частотой близкой к частоте GPIO.

Вам уже объяснили, что использование GPIO - неверный путь и предложили несколько хороших способов.

Да, за сегодня уже полностью разобрался, отбросил идею с GPIO и установил нужные мне клоки =)

Еще раз спасибо за участие! =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...