PLL - Zvýšení Kmitočtu CPU

Základní frekvence krystalů je obvykle do 25 MHz a pokud chceme, aby procesor pracoval na vyšší frekvenci, obvykle se to řeší pomocí fázového závěsu (PLL). V následujícím kódu je uveden příklad, jak zvýšit frekvenci z 16 MHz na 84 MHz, na maximální frekvenci, na kterou je mikrokontrolér STM32F401RE navržen.

Jelikož Flash paměť je pomalejší, je třeba zvýšit latenci o 2 wait states v registru FLASH_ACR, aby byly data korektně načítáná. Detailní informace najdete v referenčním manuálu v sekci Read interface. Při nastavování PLLmusí být za výstupem každého členu M/P/Q/N dodržena nejenom maximální, ale i minimální frekvence. Jednotlivá nastavení najdete v registrech RCC_CR a v RCC_PLLCFGR

void initPLL84MHz(void){
  while(!(RCC->CR & RCC_CR_HSIRDY));       // vyckej na spusteni HSI
 
  // nastavit latenci Flash pameti na 2 wait stavy
  FLASH->ACR |= 2 << FLASH_ACR_LATENCY_Pos;
 
  uint32_t temp = RCC->PLLCFGR;
  temp &= ~(RCC_PLLCFGR_PLLM_Msk | RCC_PLLCFGR_PLLN_Msk | RCC_PLLCFGR_PLLP_Msk | RCC_PLLCFGR_PLLQ_Msk); // vynulovani P, Q, M a N casti PLL
  temp |= 8    << RCC_PLLCFGR_PLLM_Pos;    // nastaveni /M na /8
  temp |= 168  << RCC_PLLCFGR_PLLN_Pos;    // nastaveni xP na x168
  temp |= 0x01 << RCC_PLLCFGR_PLLP_Pos;    // nastaveni /P na /4
  temp |= 7    << RCC_PLLCFGR_PLLQ_Pos;    // nastaveni /Q na /7
  temp &= ~RCC_PLLCFGR_PLLSRC;             // vyber HSI jako hodiny pro PLL
  RCC->PLLCFGR = temp;
 
  RCC->CR |= RCC_CR_PLLON;                 // spusteni PLL
  while(!(RCC->CR & RCC_CR_PLLRDY));       // vyckej na spusteni PLL
 
  RCC->CFGR |= 4 << RCC_CFGR_PPRE1_Pos;    // nastaveni preddelicky pro APB1 na /2
  RCC->CFGR |= 2 << RCC_CFGR_SW_Pos;       // vybereme PLL jako systemove hodiny
 
  // vyckej na prepnuti systemovych hodin na PLL
  while((RCC->CFGR & RCC_CFGR_SWS_Msk) != RCC_CFGR_SWS_PLL);
}

courses/b2m37mam/priklady/stm32/05-pll.txt · Last modified: 2023/09/27 13:57 by nentvond