一、在STM32中,有五個時鐘源,為HSI、HSE、LSI、LSE、PLL。
①HSI是高速內(nèi)部時鐘,RC振蕩器,頻率為8MHz。
②HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率范圍為4MHz~16MHz。
③LSI是低速內(nèi)部時鐘,RC振蕩器,頻率為40kHz。
④LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。
⑤PLL為鎖相環(huán)倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。
二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用內(nèi)部RC振蕩器而不使用外部晶振,請按照下面方法處理:
①對于100腳或144腳的產(chǎn)品,OSC_IN應接地,OSC_OUT應懸空。
②對于少于100腳的產(chǎn)品,有2種接法:第1種:OSC_IN和OSC_OUT分別通過10K電阻接地。此方法可提高EMC性能;第2種:分別重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1為推挽輸出并輸出'0'。此方法可以減小功耗并(相對上面)節(jié)省2個外部電阻。
三、用HSE時鐘,程序設置時鐘參數(shù)流程:
01、將RCC寄存器重新設置為默認值RCC_DeInit;
02、打開外部高速時鐘晶振HSERCC_HSEConfig(RCC_HSE_ON);
03、等待外部高速時鐘晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp();
04、設置AHB時鐘RCC_HCLKConfig;
05、設置高速AHB時鐘RCC_PCLK2Config;
06、設置低速速AHB時鐘RCC_PCLK1Config;
07、設置PLLRCC_PLLConfig;
08、打開PLLRCC_PLLCmd(ENABLE);
09、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
10、設置系統(tǒng)時鐘RCC_SYSCLKConfig;
11、判斷是否PLL是系統(tǒng)時鐘while(RCC_GetSYSCLKSource()!=0x08)
12、打開要使用的外設時鐘RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
四、例程
本文用的為STM32中容量的產(chǎn)品
void RCC_Configuration(){
ErrorStatus HSEStartUpStatus;
// 復位RCC時鐘
RCC_DeInit();
// 打開外部高速時鐘
RCC_HSEConfig(RCC_HSE_ON);
// 查看 HSE 的 啟動狀態(tài)
HSEStartUpStatus = RCC_WaitForHSEStartUp();
// 如果成功開啟
if(HSEStartUpStatus == SUCCESS)
{
//配置 HCLK,PCLK2,PCLK1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
// 配置 /FLASH 延時2 周期?
FLASH_SetLatency(FLASH_Latency_2);
// Flash 預取(pre Fetch)功能開啟
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// PLL 9 倍頻
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// PLL開啟
RCC_PLLCmd(ENABLE);
// 等待PLL開始工作
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 配置系統(tǒng)時鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 檢查 是否將 HSE-9倍頻作為系統(tǒng)時鐘
while(RCC_GetSYSCLKSource() != 0x08);
}
}