STM32 時鐘源
- HSI是高速内部時鐘,RC振蕩器,頻率為8MHz,精度不高。
- HSE是高速外部時鐘,可以由有源晶振或者無源晶振提供,頻率從 4-26MHZ不等。當使用有源晶振時,時鐘從 OSC_IN 引腳進入, OSC_OUT 引腳懸空,當選用無源晶振時,時鐘從 OSC_IN 和 OSC_OUT 進入,并且要配諧振電容LSI是低速内部時鐘,RC振蕩器,頻率為40kHz,提供低功耗時鐘。
- LSI是低速内部時鐘,RC振蕩器,頻率為40kHz
- LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。
- PLL為鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,可是其輸出頻率最大不得超過72MHz。
系統時鐘源有3個:HSI振蕩器時鐘,HSE振蕩器時鐘,PLL時鐘。
AHB總線時鐘HCLK:系統時鐘 SYSCLK 經過 AHB 預分頻器分頻之後得到時鐘叫 APB 總線時鐘,即 HCLK,分頻因子可以是:[1,2,4,8,16,64,128,256,512], 具體的由時鐘配置寄存器RCC_CFGR的HPRE 位設定。
APB2 總線時鐘HCLK2:APB2總線時鐘PCLK2由HCLK經過高速APB2預分頻器得到,分頻因子可以是:[1,2,4,8,16],具體由時鐘配置寄存器 RCC_CFGR 的PPRE2位設定。 HCLK2屬于高速的總線時鐘,片上高速的外設就挂載到這條總線上,比如全部的GPIO、 USART1、SPI1等。
APB1 總線時鐘HCLK:APB1總線時鐘PCLK1由HCLK 經過低速APB預分頻器得到,分頻因子可以是:[1,2,4,8,16],具體由時鐘配置寄存器RCC_CFGR的PPRE1位設定。HCLK1屬于低速的總線時鐘,最高為 45M,片上低速的外設就挂載到這條總線上,比如USART2/3/4/5、SPI2/3、I2C1/2 等。
STM32軟體固件庫的程式中對RCC的配置函數(使用外部8MHz晶振)
void RCC_Configuration(void)
{
RCC_DeInit();/*将外設RCC寄存器重設為預設值*/
/*設定外部高速晶振(HSE)*/
RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打開(ON)
HSEStartUpStatus = RCC_WaitForHSEStartUp();/*等待HSE起振*/
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); // 預取指緩存使能
/*設定PLL時鐘源及倍頻系數*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// PLL的輸入時鐘= HSE時鐘頻率;RCC_PLLMul_9——PLL輸入時鐘x 9
RCC_PLLCmd(ENABLE); /*使能PLL */
/*檢查指定的RCC标志位(PLL準備好标志)設定與否*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*設定系統時鐘(SYSCLK)*/
//RCC_SYSCLKSource_PLLCLK——選擇PLL作為系統時鐘
/* PLL傳回用作系統時鐘的時鐘源*/
while(RCC_GetSYSCLKSource() != 0x08);//0x08:PLL作為系統時鐘
}
/*使能或者失能APB2外設時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC , ENABLE);
//RCC_APB2Periph_GPIOA GPIOA時鐘 //RCC_APB2Periph_GPIOB GPIOB時鐘
//RCC_APB2Periph_GPIOC GPIOC時鐘 //RCC_APB2Periph_GPIOD GPIOD時鐘
}