Всем привет!
Итак, взлетели!
Условия взлета чуток странные
В даташите написано, что для работы с внешним генератором БЕЗ PLL необходимо:
- записать счетчик запуска OSCOUNT и бит MOSCEN;
- дождаться запуска;
- записать значение селектора источника сигнала CSS;
- дождаться стабилизации частоты;
- записать значение делителя тактовой частоты PRES;
- дождаться стабилизации.
Говоря кодом:
Код:
// Счетчик запуска кварца, включение кварца
AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
// Выбираем источник тактирования - основной кварц
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Выбираем предделитель источника тактирования = 1
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_PRES_CLK;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
При этом везде сказано, что нельзя записывать одновременно значения полей в регистре MCKR, обязательно это делать в два прохода!
И... Внимание, рабочий код!
Код:
// Счетчик запуска кварца, включение кварца
AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
// Выбираем предделитель источника тактирования и источник тактирования - основной кварц
AT91C_BASE_PMC->PMC_MCKR = (AT91C_PMC_PRES_CLK | AT91C_PMC_CSS_MAIN_CLK);
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
Говоря иначе, работает оно только тогда, когда данные записаны в MCKR одновременно!
Резонный вопрос! Что за
*мяу* в доке и всех источниках?!
Ну вот как-то так... А теперь я пошел ковырять запуск с PLL на частотах over 18.432
YS, еще раз величайшее за все мысли и оказанную помощь
