Search
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
FLASH_ACR
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); }