AlexG (18.12.2014 11:16, просмотров: 3343)
STM32F100C8 - проблема с настройкой тактирования на ровном месте. Обнаружил что МК работает на тактовой 12 МГц вместо 24. Причина оказалась в том, что в регистре RCC_CFGR2 задано деление тактовой на 2 и, по неизвестной причине, изменить на что-то другое не удается. Пробую обходной вариант - увеличить коэффициент умножения PLL с 6 на 12 - в регистре все равно 6 (т.е. PLLMUL=4)!
Что бы это могло быть?
Код:
uint8_t InitClk()
{
uint32_t TimeOut = 10000;
//Запустить HSE
RCC->CR |= RCC_CR_HSEON; //Включить генератор HSE
while((RCC->CR & RCC_CR_HSERDY)==0 && TimeOut) TimeOut--; //Ожидание готовности HSE
if(TimeOut==0)
{
//Ошибка!!! Генератор HSE не запустился
RCC->CFGR &= ~RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSI с делением на 2
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //Очистить PLLMULL
RCC->CFGR |= RCC_CFGR_PLLMULL6; //Коефициент умножения = 6
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){}//Ожидание переключения на PLL
return 1;
}
RCC->CR |= RCC_CR_CSSON; //Разрешить работу системы защиты сбоя HSE
//Настройка делителя HSE
RCC->CFGR2 = RCC_CFGR2_PREDIV1_DIV1; // Делить частоту HSE на 1 << НЕ РАБОТАЕТ!
//Настройка PLL
RCC->CFGR |= RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSE
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //Очистить PLLMULL
//RCC->CFGR |= RCC_CFGR_PLLMULL6; //Коефициент умножения = 6
RCC->CFGR |= RCC_CFGR_PLLMULL12; //Коефициент умножения = 12 << пытаемся обойти глюк с неустановкой RCC_CFGR2
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){}//Ожидание переключения на PLL
return 0; //Все ok, работаем от HSE
}