Код
/* select main OSC, 12MHz, as the PLL clock source. */
SC->CLKSRCSEL = 0x1;
SC->PLL0CFG = 0x20031;
SC->PLL0FEED = PLLFEED_FEED1;
SC->PLL0FEED = PLLFEED_FEED2;
/* Enable PLL, disconnected. */
SC->PLL0CON = 1;
SC->PLL0FEED = PLLFEED_FEED1;
SC->PLL0FEED = PLLFEED_FEED2;
/* Set clock divider. */
SC->CCLKCFG = 0x03;
/* Configure flash accelerator. */
SC->FLASHCFG = 0x403a;
SC->CLKSRCSEL = 0x1;
SC->PLL0CFG = 0x20031;
SC->PLL0FEED = PLLFEED_FEED1;
SC->PLL0FEED = PLLFEED_FEED2;
/* Enable PLL, disconnected. */
SC->PLL0CON = 1;
SC->PLL0FEED = PLLFEED_FEED1;
SC->PLL0FEED = PLLFEED_FEED2;
/* Set clock divider. */
SC->CCLKCFG = 0x03;
/* Configure flash accelerator. */
SC->FLASHCFG = 0x403a;
Кварц у меня на плате (как и в исходниках фриртоса) = 12 МГц.
После этого я запускаю таймер 3, у которого ставлю делитель PCLK = 1/2 и следующее
Код
SC->PCONP |= 1<<23;
SC->PCLKSEL1 = (SC->PCLKSEL1 & ~(0x3<<14)) | (0x02 << 14);
TIM3->TCR = 0x02;
TIM3->CTCR = 0;
TIM3->PR = 0;
TIM3->MR0 = 100000000UL/2/100;
TIM3->MCR = 0x03;
TIM3->TCR = 0x01;
TIM3->IR = 0xff;
NVIC_SetPriority( TIMER3_IRQn, 6 );
NVIC_EnableIRQ( TIMER3_IRQn );
SC->PCLKSEL1 = (SC->PCLKSEL1 & ~(0x3<<14)) | (0x02 << 14);
TIM3->TCR = 0x02;
TIM3->CTCR = 0;
TIM3->PR = 0;
TIM3->MR0 = 100000000UL/2/100;
TIM3->MCR = 0x03;
TIM3->TCR = 0x01;
TIM3->IR = 0xff;
NVIC_SetPriority( TIMER3_IRQn, 6 );
NVIC_EnableIRQ( TIMER3_IRQn );
А далее я вижу, что прерывание от таймера 3 происходит не 100, а 200 раз в секунду. Изменением делителя в PCLKSEL1 можно ускорить в 2 раза или замедлить в 2/4 раза. То есть он нормально работает. Получается, что тактирование таймера происходит не от CCLK (то есть от ядра проца), а от частоты в 2 раза выше.
У меня мануал кривой или что это за глюк?