ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
7 июля
225751
ZED“ (06.12.2010 12:36, просмотров: 25248)
Имеется AT91SAM9260 + IAR + J-Link. У меня тут заминка с настройкой PLL. Я хочу, чтобы моя частота тактирования процессора [B]PCK[/B] была [B]192 МГц[/B], а задающая частота, которая тактирует периферию [B]MCK[/B] была в 2 раза меньше, т.е. [B]96 МГц[/B]. Я написал функцию [B]Init_CLK[/B], которая осуществляет. Включил функцию в свой код "дрыгания лапкой". Смотрю осциллографом, лапка переключается с частотой [B]9.2 МГц[/B]. Вот мой код: [CODE]#include "at91sam9260/AT91SAM9260.h" //------------------------------------------------------------------------------ /// Настройка PLL //------------------------------------------------------------------------------ void Init_CLK(void) { unsigned int MAINF; // Частота медленного RC-генератора SLCK 32.768 кГц. Период 1/32768 = 30.51 мкс // Максимальное время запуска основоного генератора: 75 мкс // Время запуска основного генератора:8 * OSCOUNT(=64) * 30.51 мкс = 15.6 мс // Запуск основного генератора: AT91C_BASE_PMC->PMC_MOR = (AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN; // Ждать пока пройдет время запуска: while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Переключение блока задающей частоты на основную тактовую частоту AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK; // Настройка PLL на частоту 192 МГц: AT91C_BASE_PMC->PMC_PLLAR = ( AT91C_CKGR_SRCA // 29 бит = 1 | (0x2 << 14) // OUTA = 2 | (0xBF << 8) // PLLACOUNT = 191 | (AT91C_CKGR_MULA & (0x7C << 16)) // MULA = 124 | (AT91C_CKGR_DIVA & 12)); // DIVA = 12 // Ждать пока пройдет время запуска: while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Выбор задающей частоты и тактовой частоты процессора: // Предделитель тактовой частоты PRES = 1, Предделитель задающей частоты MDIV = 2. AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; // Ждать пока пройдет время запуска: while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // В качестве основной частоты использовать частоту PLL: AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK; // Ждать пока пройдет время запуска: while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); } /* Главная функция программы */ int main(void) Init_CLK(); enum { WORKMASK = AT91C_PIO_PB0 }; // Битовая маска, определяет каким выводом управлять AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Отключение сторожевого таймера AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_PIOB); // Разрешение тактирования PIO B AT91C_BASE_PIOB->PIO_PER = WORKMASK; // Установка управления PIO выводом (отключение управления выводом переферийным устройством). AT91C_BASE_PIOB->PIO_PPUER = WORKMASK; // Разрешение подтягивающих резисторов AT91C_BASE_PIOB->PIO_OER = WORKMASK; // Установка вывада в качестве выходад while(1) { AT91C_BASE_PIOB->PIO_SODR = WORKMASK; // Установка вывода в единицу AT91C_BASE_PIOB->PIO_CODR = WORKMASK; // Сброс вывода в ноль } } [/CODE] Пожалуйста укажите мне на ошибку.