STM32F103x RCC寄存器配置
主要是設(shè)置時(shí)鐘樹中的內(nèi)容,如下圖所示:
具體在RCC_Configuration函數(shù)中的體現(xiàn)。
第一步:系統(tǒng)時(shí)鐘選擇哪個(gè),HSE、HSI還是PLLCLK。
RCC_HSEConfig(RCC_HSE_ON); //使用HSE
如果HSE時(shí)鐘已經(jīng)穩(wěn)定,硬件會(huì)將RCC_CR的HSERDY位置1。
第二步:判斷HSE時(shí)鐘是否穩(wěn)定
if(RCC_WaitForHSEStartUp()==SUCCESS)
第三步:使能FLASH的預(yù)取址緩沖區(qū),并設(shè)置FLASH的等待狀態(tài)。(具體功能見FLASH部分)
/*EnablePrefetchBuffer*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*Flash2waitstate*/
FLASH_SetLatency(FLASH_Latency_2);
第四步:設(shè)置AHB預(yù)分頻系數(shù)。預(yù)分頻系數(shù)可以是1、2、4、8、16、32、64、128、256
/*HCLK=SYSCLK*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);//沒分頻
第五步:設(shè)置APB2的預(yù)分頻系數(shù),來(lái)確定PCLK2頻率。預(yù)分頻系數(shù)可以是1、2、4、8、16
/*PCLK2=HCLK*/
RCC_PCLK2Config(RCC_HCLK_Div1);//沒分頻
第六步:設(shè)置APB1的預(yù)分頻系數(shù),來(lái)確定PCLK1頻率。預(yù)分頻系數(shù)可以是1、2、4、8、16
/*PCLK1=HCLK/2*/
RCC_PCLK1Config(RCC_HCLK_Div2);//2分頻
第七步:設(shè)置PLL的時(shí)鐘源,以及PLL的倍頻系數(shù),來(lái)確定PLLCLK頻率。
/*PLLCLK=8MHz*9=72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
第八步:使能PLL。將RCC_CR的PLLON位置1。
/*EnablePLL*/
RCC_PLLCmd(ENABLE);
如果PLL鎖定后,硬件會(huì)將RCC_CR的PLLRDY位置1。
第九步:等待PLL鎖定。
/*WaittillPLLisready*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}
第十步:選擇PLL作為SYSCLK(系統(tǒng)時(shí)鐘源)
/*SelectPLLassystemclocksource*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
第十一步:將程序中用到的外設(shè)時(shí)鐘打開,統(tǒng)一都放在此處。
例如:將GPIO外設(shè)時(shí)鐘打開。
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_Configuration函數(shù)具體代碼如下:
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08) {}
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}
}
評(píng)論