aod 0 17 октября, 2011 Опубликовано 17 октября, 2011 · Жалоба Всем Добрый День! Продолжая разбираться с процом С6722 возникла необходимость использовать PLLC для увеличения частоты как самого ядра (SYSCLK1), периферии (SYSCLK2), так и частоты EMIF (SYSCLK3). Для этого решил воспользоваться CSL v.3. Решил начать с частоты ядра, однако, не зная как проверить правильность работы решил подергать пином, заведенным на McASP (сконфигурировав его как GPIO), "поднимая" и "опуская" его через цикл for, предполагая, что при смене частоты ядра, циклы должны выполняться по разному. Однако этого не произошло. Не подскажите ли как еще можно проверить SYSCLK1..3 ? Заранее Спасибо, aod. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 17 октября, 2011 Опубликовано 17 октября, 2011 · Жалоба Первое и самое простое - смотрите 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 октября, 2011 Опубликовано 18 октября, 2011 · Жалоба Решил начать с частоты ядра, однако, не зная как проверить правильность работы решил подергать пином, заведенным на McASP (сконфигурировав его как GPIO), "поднимая" и "опуская" его через цикл for, предполагая, что при смене частоты ядра, циклы должны выполняться по разному. Однако этого не произошло. Так Вы измерите только частоту работы GPIO, которая скорей всего не зависит от PLL. Читайте документацию на PLL процессора - обычно в составе PLL процев TI имеется какой-нить пин, выводящий частоту PLL (CLKOUT, OBSCLK, ...). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aod 0 18 октября, 2011 Опубликовано 18 октября, 2011 · Жалоба Спасибо 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 октября, 2011 Опубликовано 18 октября, 2011 · Жалоба Наверно Вы не поняли меня,т.к. если я правильно понимаю, то за скорость выполнения цикла 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 - неверный путь и предложили несколько хороших способов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aod 0 18 октября, 2011 Опубликовано 18 октября, 2011 · Жалоба Во-первых: код у вас неверный - компилятор удалит эти пустые циклы и будет прав. Если хотите таким образом делать задержки, то используйте volatile. И смотрите в ассемблерный листинг. Во-вторых: частота работы GPIO много меньше (в разы или даже на порядки) частоты ядра, т.е. - большую часть времени процессор будет ждать готовности шины GPIO и цикл будет выполняться с частотой близкой к частоте GPIO. Вам уже объяснили, что использование GPIO - неверный путь и предложили несколько хороших способов. Да, за сегодня уже полностью разобрался, отбросил идею с GPIO и установил нужные мне клоки =) Еще раз спасибо за участие! =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться