====== 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 {{ :courses:b2m37mam:stm32f401_refmanual.pdf#page=46 | Read interface}}. Při nastavování {{ :courses:b2m37mam:stm32f401_refmanual.pdf#page=93 | PLL}}musí 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 {{ :courses:b2m37mam:stm32f401_refmanual.pdf#page=102 | RCC_CR}} a v {{ :courses:b2m37mam:stm32f401_refmanual.pdf#page=104 | 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); }