Dubov 0 20 мая, 2014 Опубликовано 20 мая, 2014 · Жалоба Работаю с платой на основе OMAP-L138. В качестве ОС Linux. Настало время запустить DSP. Пока задача простая: дёргать GPIO таймером под SYSBIOS (в дальнейшем будет использоваться как клок для внешнего АЦП) Сразу возникает вопрос: где настраивается тактирование перифирии? скачал примеры с сайта TI. Там только main.c и *.cfg файлы. Нигде не упоминается PLL. GEL файлов тоже нет. ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 мая, 2014 Опубликовано 20 мая, 2014 · Жалоба ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046: Изучить в мануале схему тактирования, затем считать нужные регистры PLLC и регистр CHIPCFG3 и вычислить требуемую частоту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 20 мая, 2014 Опубликовано 20 мая, 2014 · Жалоба Работаю с платой на основе OMAP-L138. В качестве ОС Linux. Настало время запустить DSP. Пока задача простая: дёргать GPIO таймером под SYSBIOS (в дальнейшем будет использоваться как клок для внешнего АЦП) И что-ж - вы собираетесь именно GPIO дёргать? В прерывании? Если так - вам следует пересмотреть архитектуру системы. Сразу возникает вопрос: где настраивается тактирование перифирии? скачал примеры с сайта TI. Там только main.c и *.cfg файлы. Нигде не упоминается PLL. GEL файлов тоже нет. ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046: Как уже ответили - открыть мануал и читать, читать, читать... И скачивать в первую очередь нужно не примеры, а мануалы на периферию и CPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 21 мая, 2014 Опубликовано 21 мая, 2014 (изменено) · Жалоба Да понятно, что скачивать мануалы надо и читать читать.... да только вот с примерами как-то быстрее дело продвигается. хотя конечно дело во мне... Изучить схему тактирования и регистры - это конечно хорошо, но это когда писать без ОС, всё самому. А у меня стоит Linux и из под него хочу запускать приложения для DSP-ядра. В моём случае, как я понял, PLL настраивается в Linux. Никак не могу найти в исходниках какая всё таки частота ASYNC3(тактирование таймера P2) задаётся. Или, если не хадаётся, то какова она по умолчанию? Изменено 21 мая, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Или, если не хадаётся, то какова она по умолчанию? Равна частоте DDR2 (подключена к PLL1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 21 мая, 2014 Опубликовано 21 мая, 2014 (изменено) · Жалоба Равна частоте DDR2 (подключена к PLL1). хммм. странно, выдержка из RTM : The ASYNC3 modules use PLL0_SYSCLK2 by default, but all these modules can be configured as a group to use PLL1_SYSCLK2 by programming the ASYNC3_CLKSRC bit in the chip configuration 3 register (CFGCHIP3) of the system configuration (SYSCFG) module. или в Linux именно на PLL1 сконфигурировано? Изменено 21 мая, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 21 мая, 2014 Опубликовано 21 мая, 2014 (изменено) · Жалоба И что-ж - вы собираетесь именно GPIO дёргать? В прерывании? Если так - вам следует пересмотреть архитектуру системы. а как ещё частоту через таймер ввести на пин? P.S. пардон, только сейчас заметил что ASYNC3 по умолчанию тактируется от PLL0_SYSCLK2, но потом конфигурируется для работы от PLL1_SYSCLK2. И, если я правильно понял, то, делится на 2, т.е. 150MHz / 2 = 75Mhz нет? Изменено 21 мая, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба P.S. пардон, только сейчас заметил что ASYNC3 по умолчанию тактируется от PLL0_SYSCLK2, но потом конфигурируется для работы от PLL1_SYSCLK2. И, если я правильно понял, то, делится на 2, т.е. 150MHz / 2 = 75Mhz нет? Нет. PLL1 делает 2X_CLK для контроллера DDR. Поэтому 300(356)MHz / 2 = 150(156)MHz Вообще все просто: mount -t debugfs debugfs /sys/kernel/debug cat /sys/kernel/debug/davinci_clocks а как ещё частоту через таймер ввести на пин? У таймера есть выходной пин и режим Clock. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба а как ещё частоту через таймер ввести на пин? Есть выходы таймеров (впрочем Вам уже посоветовал уважаемый aaarrr). Если их не хватает (или трудно получить с них нужную частоту по каким-то причинам), то есть всякие McASP/McBSP и пр. периферия с источниками периодических сигналов. Причём - это касается всех МК, а DSP - так в большей степени. Даже если не вспоминать о неоптимальности и затратах производительности на такое ISR+GPIO, то можно хотя-бы подумать о джиттере и как он повлияет на работу АЦП? А в DSP прерывания и оптимальная работа алгоритмов цифровой обработки - вещи несовместимые, во многих местах вообще лучше запрещать прерывания надолго. Так что джиттер будет БОЛЬШОЙ. Никак не могу найти в исходниках какая всё таки частота ASYNC3(тактирование таймера P2) задаётся. Или, если не хадаётся, то какова она по умолчанию? Вот именно - это потому, что ищете в исходниках, а не в мануалах. Для OMAP-L137 достаточно открыть "OMAP-L137 Applications Processor. System Reference Guide" разделы "Device Clocking" и "Phase-Locked Loop Controller (PLLC)" как всё становится предельно понятно - что и откуда. Всё подробно расписано, с разными схемами. Я работал с L137, но для L138 думаю имеется аналогичный документ. PS: Вообще - как только вижу "прерывания, дёргать ногой GPIO", это почти однозначный признак чайника. Ибо сразу видно - незнание работы периферии и нежелание изучать её. Ещё другой характерный признак - нехватка таймеров CPU (и это при том, что их там штук под 10-ок). С большой уверенностью можно сделать прогноз, что всё в "проге" построено на куче прерываний от этих таймеров с ногодрыгом через GPIO внутри. Почему-то я в своих проектах умудряюсь обходиться одним, в редких случаях - двумя таймерами (конечно за исключением тех случаев, когда таймер обеспечивает тактирование какой-то другой периферии, внутренней (типа DMA) или внешней (какие-то чипы через вых. пин таймера)). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 22 мая, 2014 Опубликовано 22 мая, 2014 (изменено) · Жалоба Спасибо за совет. Переписал код инициализации таймера. таймер P2 должен выводить сигнал на выход. код инициализации таймера int period = 1000; HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) / & (~(SYSCFG_PINMUX4_PINMUX4_11_8))) | (PINMUX4_TM64P2_OUT12_ENABLE); HWREG(SOC_TMR_2_REGS + TMR_GPDATGPDIR) |= TMR_GPDATGPDIR_GPDIRO12;//пин как выход HWREG(SOC_TMR_2_REGS + TMR_GPINTGPEN) &= ~TMR_GPINTGPEN_GPENO12; HWREG(SOC_TMR_2_REGS + TMR_TCR) = 0; /* Configuration of Timer */ TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT); /* Set the 64 bit timer period */ TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, (uint32_t)period); TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, (uint32_t)(period >> 32)); TimerCounterSet(SOC_TMR_2_REGS, TMR_TIMER12, 0); TimerCounterSet(SOC_TMR_2_REGS, TMR_TIMER34, 0); TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONTRELOAD); TimerPulseWidthSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PULSE_WIDTH_1_CLK); TimerPulseModeSet(SOC_TMR_2_REGS, TMR_TIMER12); TimerInvertOUTEnable(SOC_TMR_2_REGS, TMR_TIMER12); Но сигнал на ноге не наблюдается Изменено 22 мая, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 мая, 2014 Опубликовано 22 мая, 2014 · Жалоба HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) / & (~(SYSCFG_PINMUX4_PINMUX4_11_8))) | (PINMUX4_TM64P2_OUT12_ENABLE); Это не должно даже компилироваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 23 мая, 2014 Опубликовано 23 мая, 2014 · Жалоба при компиляции писал так: HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & (~(SYSCFG_PINMUX4_PINMUX4_11_8))) | (PINMUX4_TM64P2_OUT12_ENABLE); слеш наверное в другу сторону нужен, если эту же строку продолжаем на новой строке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 23 мая, 2014 Опубликовано 23 мая, 2014 · Жалоба Слэши при переносе строк в си не нужны ни в какую сторону. Учите матчасть! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 23 мая, 2014 Опубликовано 23 мая, 2014 (изменено) · Жалоба Слэши при переносе строк в си не нужны ни в какую сторону. Учите матчасть! из примера выдержка: /* Pin Multiplexing bit mask to select GP2[15] pin. */ #define PINMUX5_GPIO2_15_ENABLE (SYSCFG_PINMUX5_PINMUX5_3_0_GPIO2_15 << \ SYSCFG_PINMUX5_PINMUX5_3_0_SHIFT) зачем там слеш? Я просто конструкции перепутал. в компилируемом коде конечно же писал в строчку HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & (~(SYSCFG_PINMUX4_PINMUX4_11_8))) | (PINMUX4_TM64P2_OUT12_ENABLE); Кто-то может что-то по делу сказать? проект компилируется и сигнал на пине не появляется явно не из-за слеша... Изменено 23 мая, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 23 мая, 2014 Опубликовано 23 мая, 2014 · Жалоба зачем там слеш? Изучив матчасть Вы как раз и узнаете зачем там он нужен, а у вас - не нужен. Учимся отличать препроцессор от си-компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться