STM32有3個系統時鐘源(HSI、HSE和PLL)和2個RTC時鐘源(LSI和LSE),系統上電預設是HSI 8MHZ啟動,要想系統跑72MHZ,則必須對RTC時鐘進行配置。
寄存器配置大緻步驟:
1) 打開HSE外部高速時鐘,并等待至其打開
RCC_CR |= 0x00010000; //set HSEON ON
while((RCC_CR & (1<<17)) == 0); //HSERDY ON?
2) 設定HCLK、PCLK1和PCLK2時鐘
RCC_CFGR &= 0xFFFFFF0F; //HCLK=SYSCLK
RCC_CFGR &= 0xFFFFC7FF; //PCLK2=HCLK
RCC_CFGR = (RCC_CFGR & 0xFFFFF8FF) | 0x00000400; //PCLK1=HCLK/2
3)使能預取值緩沖
FLASH_ACR |= 0x00000010;
FLASH_ACR =(FLASH_ACR & 0xFFFFFFF8) | 0x00000002;
4)設定PLL倍頻,并打開PLL時鐘(PLL可取2~16,但最好别超過72MHZ)
RCC_CFGR = (RCC_CFGR & 0xFFDFFFFF) | 0x00D00000;
RCC_CR |= 1<<24;
while((RCC_CR & (1<<25)) == 0);
5)配置PLL時鐘為系統時鐘源,并等待配置完成
RCC_CFGR = (RCC_CFGR & 0xFFFFFFFE) | 0x00000002;
while((RCC_CFGR & 0x0000000C) != 0x08);
庫函數版:
RCC_DeInit(); //将外設RCC寄存器重設為預設值
//設定外部高速晶振(HSE)
RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打開(ON)
//等待HSE起振
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振穩定且就緒
{
//設定AHB時鐘(HCLK)
RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB時鐘= 系統時鐘
/*/設定高速AHB時鐘(PCLK2)
RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2時鐘= HCLK
//設定低速AHB時鐘(PCLK1)
RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1時鐘= HCLK / 2
//設定FLASH存儲器延時時鐘周期數
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延時周期
//選擇FLASH預取指緩存的模式
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 預取指緩存使能
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL=輸入時鐘HSEx 9
RCC_PLLCmd(ENABLE); //使能PLL
//檢查指定的RCC标志位(PLL準備好标志)設定與否
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
;
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //設定系統時鐘(SYSCLK),選擇PLL作為系統時鐘
while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作為系統時鐘
;