Всем доброго времени суток!
Хотел данную проблему поднять на форуме Миландра, но там активация аккаунта что-то затягивается... жду ответа от админов форума.
Есть Отладочный комплект для микроконтроллера 1986ВЕ1Т. Пытаюсь настроить тактирование камня на частоте 80 МГц (внешний кварц 8 МГц).
Делаю так:
/* Включаем генератор на внешнем кварце (8 МГц) */
RST_CLK_HSEconfig(RST_CLK_HSE_ON);
while (RST_CLK_HSEstatus() != SUCCESS); /* Ждем стабилизации частоты */
/* Настраиваем источник и коэффициент умножения PLL
* (CPU_C1_SEL = HSE / 1 * 10 = 8 МГц / 1 * 10 = 80 МГц)
*/
RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul10);
/* Включаем PLL, но еще не подключаем к кристаллу (Блок умножения частоты) */
RST_CLK_CPU_PLLcmd(ENABLE);
while (RST_CLK_CPU_PLLstatus() != SUCCESS); /* Ждем стабилизации */
/* Делитель С3 (CPU_C3_SEL = CPU_C2_SEL) */
RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
/* На С2 идет с PLL, а не напрямую с С1 (CPU_C2_SEL = PLL) */
RST_CLK_CPU_PLLuse(ENABLE);
/* CPU берет тактирование с выхода С3
* (HCLK_SEL = CPU_C3_SEL = 80 МГц)
*/
RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);
Проверить пытаюсь так:
void delay_ms(volatile uint64_t milisec)
{
milisec *= 80000; /* CLK_CPU = 80 MHz -> 80000 - 1ms */
while (milisec)
milisec--;
}
....
int main(void)
{
freq_init(); /* 80 МГц */
tmr_init();
while(1)
{
delay_ms(1000);
}
}
Еще настраиваю таймер на прерывание каждую миллисекунду (на вход модуля должно быть 80 МГц после настройки частот):
/* Модуль tmr.c */
#define CLOCK_PCLK RST_CLK_PCLK_TIMER1
#define TIMERn MDR_TIMER1
#define TIMER_IRQ TIMER1_IRQn
/* 1 ms */
void tmr_init(void)
{
TIMER_CntInitTypeDef tmr;
RST_CLK_PCLKcmd(CLOCK_PCLK, ENABLE); /* Тактирование таймера */
/* 80 MHz на вход. Настройка на 1ms */
tmr.TIMER_ETR_Prescaler = TIMER_ETR_Prescaler_None; /* Не делить входную частоту */
tmr.TIMER_Prescaler = 8000;
tmr.TIMER_Period = 10; /* Дойдя до этого значения - перезагружаем таймер */
tmr.TIMER_CounterMode = TIMER_CntMode_ClkFixedDir; /* Фиксированное направление счета */
tmr.TIMER_CounterDirection = TIMER_CntDir_Up; /* счет вверх */
tmr.TIMER_ARR_UpdateMode = TIMER_ARR_Update_On_CNT_Overflow; /* Обновление по переполнению */
tmr.TIMER_IniCounter = 0;
TIMER_CntInit(TIMERn, &tmr);
TIMER_ITConfig(TIMERn, TIMER_STATUS_CNT_ZERO | TIMER_STATUS_CNT_ARR, ENABLE);
NVIC_EnableIRQ(TIMER_IRQ);
TIMER_Cmd(TIMERn, ENABLE);
}
void TIMER1_IRQHandler(void)
{
TIMER_ClearFlag(TIMERn, TIMER_STATUS_CNT_ZERO | TIMER_STATUS_CNT_ARR);
led_set(LED_1, led_get(LED_1) ^ 1); /* Блинк светодиодом */
}
Но не получаю частоты 80 МГц даже близко...
Подскажите, возможно, я жестко косячу...