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