Как известно конфинурирование PMC и тактовой частоты в keil происходит в файле SAM7.s
Исходный кварц 16.0 Мгц
Задаю
PLL divider 10
PLL multiplier 60
PLL clock frequency range 80..160Мгц
Clock source selection PLL clock
Prescaler 2
И ожидаю получить ровно 48000000 Гц, а получаю 48800000.

Раньше думал что это глюк эмулятора, теперь убедился что это не так.
Как это отловилось. Надо было выдать 16 Мгц с помощью PWM.
MCK в качестве тактовой, период 3, период скважности 2 - получаем 16Мгц
Пишем вот такой код
Код
void set_PWM0(void)
{
/* ïîäêëþ÷àåì ê PWM ñèñòåìíóþ ÷àñòîòó è âêëþ÷àåì âûâîä */
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PWMC);
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA23_PWM0);
/* âûáèðàåì èñòî÷íèê òàêòèðîâàíèÿ è leftAligment+íóëåâàÿ ïîëÿðíîñòü */
AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH1->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH2->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH3->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
/* êîíôèãóðèðóåì ïåðèîä øèìà è ñâàæíîñòü */
AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH2->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH2->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH3->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH3->PWMC_CDTYR = 2;
/* âêëþ÷àåì pwm0 */
AT91C_BASE_PWMC->PWMC_IER = AT91C_PWMC_CHID0;
AT91C_BASE_PWMC->PWMC_ENA = AT91C_PWMC_CHID0;
}
{
/* ïîäêëþ÷àåì ê PWM ñèñòåìíóþ ÷àñòîòó è âêëþ÷àåì âûâîä */
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PWMC);
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA23_PWM0);
/* âûáèðàåì èñòî÷íèê òàêòèðîâàíèÿ è leftAligment+íóëåâàÿ ïîëÿðíîñòü */
AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH1->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH2->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
AT91C_BASE_PWMC_CH3->PWMC_CMR = AT91C_PWMC_CPRE_MCK;
/* êîíôèãóðèðóåì ïåðèîä øèìà è ñâàæíîñòü */
AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH2->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH2->PWMC_CDTYR = 2;
AT91C_BASE_PWMC_CH3->PWMC_CPRDR = 3;
AT91C_BASE_PWMC_CH3->PWMC_CDTYR = 2;
/* âêëþ÷àåì pwm0 */
AT91C_BASE_PWMC->PWMC_IER = AT91C_PWMC_CHID0;
AT91C_BASE_PWMC->PWMC_ENA = AT91C_PWMC_CHID0;
}
Запускаем прошивку сгенерированную IARом с проверенным иницилизационным кодом с такимиже коэффициентами. Лезем цифровым осциллографом. Получаем частоту 15.99999. Вполне годится.
Далее запускаем прошивку сгенерированную в keil. Получаем частоту 16.2665 что дает нам частоту MCK равную 48.7995. чтд.
Вопрос: какого чОрта?
Если кто работает с САМ под кейл отзовитесь. Если не испытывали проблем киньте пожалуста файл SAM7.s на почту или сюда.