 AlexG (18.12.2014 11:16, просмотров: 3631)
 AlexG (18.12.2014 11:16, просмотров: 3631)
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
}