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

Работаю с платой на основе OMAP-L138. В качестве ОС Linux. Настало время запустить DSP. Пока задача простая: дёргать GPIO таймером под SYSBIOS (в дальнейшем будет использоваться как клок для внешнего АЦП)

Сразу возникает вопрос: где настраивается тактирование перифирии? скачал примеры с сайта TI. Там только main.c и *.cfg файлы. Нигде не упоминается PLL. GEL файлов тоже нет.

ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046:

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


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

ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046:

Изучить в мануале схему тактирования, затем считать нужные регистры PLLC и регистр CHIPCFG3 и вычислить требуемую частоту.

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


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

Работаю с платой на основе OMAP-L138. В качестве ОС Linux. Настало время запустить DSP. Пока задача простая: дёргать GPIO таймером под SYSBIOS (в дальнейшем будет использоваться как клок для внешнего АЦП)

И что-ж - вы собираетесь именно GPIO дёргать? В прерывании?

Если так - вам следует пересмотреть архитектуру системы.

 

Сразу возникает вопрос: где настраивается тактирование перифирии? скачал примеры с сайта TI. Там только main.c и *.cfg файлы. Нигде не упоминается PLL. GEL файлов тоже нет.

ЧТобы задать период необходимо значть частоту тактирования таймера, а узнать не могу. Что делать? :smile3046:

Как уже ответили - открыть мануал и читать, читать, читать...

И скачивать в первую очередь нужно не примеры, а мануалы на периферию и CPU.

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


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

Да понятно, что скачивать мануалы надо и читать читать.... да только вот с примерами как-то быстрее дело продвигается. хотя конечно дело во мне...

 

Изучить схему тактирования и регистры - это конечно хорошо, но это когда писать без ОС, всё самому.

А у меня стоит Linux и из под него хочу запускать приложения для DSP-ядра. В моём случае, как я понял, PLL настраивается в Linux. Никак не могу найти в исходниках какая всё таки частота ASYNC3(тактирование таймера P2) задаётся. Или, если не хадаётся, то какова она по умолчанию?

Изменено пользователем Dubov

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


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

Или, если не хадаётся, то какова она по умолчанию?

Равна частоте DDR2 (подключена к PLL1).

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


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

Равна частоте 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 сконфигурировано?

Изменено пользователем Dubov

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


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

И что-ж - вы собираетесь именно GPIO дёргать? В прерывании?

Если так - вам следует пересмотреть архитектуру системы.

 

а как ещё частоту через таймер ввести на пин?

 

 

P.S. пардон, только сейчас заметил что ASYNC3 по умолчанию тактируется от PLL0_SYSCLK2, но потом конфигурируется для работы от PLL1_SYSCLK2. И, если я правильно понял, то, делится на 2, т.е. 150MHz / 2 = 75Mhz

 

нет?

post-72052-1400662248_thumb.jpg

Изменено пользователем Dubov

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


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

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.

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


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

а как ещё частоту через таймер ввести на пин?

Есть выходы таймеров (впрочем Вам уже посоветовал уважаемый 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) или внешней (какие-то чипы через вых. пин таймера)).

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


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

Спасибо за совет.

Переписал код инициализации таймера. таймер 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);

 

Но сигнал на ноге не наблюдается

Изменено пользователем Dubov

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


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

    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_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & (~(SYSCFG_PINMUX4_PINMUX4_11_8))) | (PINMUX4_TM64P2_OUT12_ENABLE);

 

слеш наверное в другу сторону нужен, если эту же строку продолжаем на новой строке.

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


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

Слэши при переносе строк в си не нужны ни в какую сторону.

Учите матчасть!

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


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

Слэши при переносе строк в си не нужны ни в какую сторону.

Учите матчасть!

 

из примера выдержка:

 

/* 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);

 

 

Кто-то может что-то по делу сказать?

проект компилируется и сигнал на пине не появляется явно не из-за слеша...

Изменено пользователем Dubov

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


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

зачем там слеш?

Изучив матчасть Вы как раз и узнаете зачем там он нужен, а у вас - не нужен.

Учимся отличать препроцессор от си-компилятора.

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


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

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

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

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

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

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

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

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

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

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