STM32 – Internal 8MHz Clock Setup Routine
Here is the setup code to use the internal 8MHz clock – but with the internal clock, we are only able to get a max frequency of 36MHz.
void clock_init(){
/*Configure all clocks to max for best performance.
* If there are EMI, power, or noise problems, try slowing the clocks*/
/* First set the flash latency to work with our clock*/
/*000 Zero wait state, if 0 MHz < SYSCLK <= 24 MHz
001 One wait state, if 24 MHz < SYSCLK <= 48 MHz
010 Two wait states, if 48 MHz < SYSCLK <= 72 MHz */
FLASH_SetLatency(FLASH_Latency_1);
/* Start with HSI clock (internal 8mhz), divide by 2 and multiply by 9 to
* get maximum allowed frequency: 36Mhz
* Enable PLL, wait till it's stable, then select it as system clock*/
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Set HCLK, PCLK1, and PCLK2 to SCLK (these are default */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
/* Set ADC clk to 9MHz (14MHz max, 18MHz default)*/
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
/*To save power, use below functions to stop the clock to ceratin
* peripherals
* RCC_AHBPeriphClockCmd
*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, ENABLE);
}