реклама на сайте
подробности

 
 
> Какой подход выбрать?
VeDoK
сообщение Aug 22 2011, 18:47
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 6-06-11
Пользователь №: 65 530



Доброго времени суток.

Есть необходимость генерировать на AT91SAM7s256 сигнал с частотой 4 МГц и вызовом прерываниия.

Получится ли настроить прерывание от какого-нибудь таймера на такую частоту?
Можно ли программируемым тактовым сигналом PCKx вызывать прерывание контроллера ввода-вывода на изменение состояния порта?
Если нет, то удастся ли вывести PCKx наружу и тут же завести на соседний вывод с настроенным прерыванием на изменение состояния порта?
Стоит ли использовать для генерации сигнала и прерывания ШИМ контроллер?

Подскажите, пожалуйста, какой подход наиболее предпочтителен?

P. S. Если не затруднит, ещё один блиц-вопрос... У меня выход PLL равен 128 МГц. В регистре PMC_MCKR указал тактирование от PLL и значение делителя 4. Это означает, что задающий сигнал MCK равен 32 МГц, а процессорный тактовый сигнал PCK равен 128МГц?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Aug 22 2011, 19:06
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Генерацию прерывания с частотой 4 МГц на этом процессоре - зачем? (не успеть обработать). Или какие-то ещё побочные эффекты будут использоваться?
Просто выход с частотой 4 МГц получить при тактовой частоте, кратной 8 МГц (или 16 МГц в случае если требуется меандр на выходе) вполне возможно - минимальный предделителдь для таймера 2.


Вот вам кусок кода из проекта - может, поможет?
Код
/*
  инициализация внутреннего умножителя частоты.
  Вход - 12 МГц, кварцевый резонатор
  внутренняя тактовая - 48 МГц,
  частота генератора - 96 МГц
  Частота сравнения PLL = 12 МГц
*/
static void lowlevel_init_pll_clock_48_xtal12(void)
{
    enum { osc_mul = 8, osc_div = 1 };    // 12 MHz / 1 * 8 = 96 MHz

    // before reprogramming - set safe waitstates
    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_2FWS;

    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 1. Enable Main Oscillator
    // Main Oscillator startup time is board specific:
    // Main Oscillator Startup Time worst case (3MHz) corresponds to 15ms
    // (0x40 for AT91C_CKGR_OSCOUNT field)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_MOR = (((AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN));
    // Wait Main Oscillator stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS))
    ;
    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 2.
    // Set PLL to 96MHz (96,109MHz) and UDP Clock to 48MHz
    // PLL Startup time depends on PLL RC filter: worst case is choosen
    // UDP Clock (48,058MHz) is compliant with the Universal Serial Bus
    // Specification (+/- 0.25% for full speed)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_PLLR =
                        AT91C_CKGR_USBDIV_1 |
                        AT91C_CKGR_OUT_0 |
                        (AT91C_CKGR_PLLCOUNT & (16 << 8)) |        // PLL lock signalling delay
                        (AT91C_CKGR_MUL & ((osc_mul - 1) << 16)) |
                        (AT91C_CKGR_DIV & osc_div);        
    
    // Wait for PLL stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK))
    ;
    
    // Wait until the master clock is established for the case we already
    // turn on the PLL
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 3.
    // Selection of Master Clock MCK equal to (Processor Clock PCK) PLL/2=48MHz
    // The PMC_MCKR register must not be programmed in a single write operation
    // (see. Product Errata Sheet)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;    // тактовая частота процессора 96 / 2 = 48

    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    AT91C_BASE_PMC->PMC_MCKR = (AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLL_CLK);

    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    // as final stage - set desired waitstates
    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48 MHz
}


Сообщение отредактировал Genadi Zawidowski - Aug 22 2011, 19:07
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016