STM32學(xué)習(xí)003_STM32F10X的時鐘配置
一、在STM32中,有5個時鐘源,為HSI,HSE,LSI,LSE,PLL.
①HSI是高速內(nèi)部時鐘,RC振蕩器,頻率為8MHz;
②HSE--高速外部時鐘,可接石英或者陶瓷諧振器,或者外部時鐘源,頻率范圍4MHz--15MHz.
③LSI--低速內(nèi)部時鐘,RC 振蕩器,頻率為40kHz.
④LSE--低速外部時鐘,接頻率為32.768KHz的石英晶體。
⑤PLL為鎖相環(huán)倍頻輸出,其時鐘輸入源可選擇為HSI/2,HSE或者HSE/2,倍頻可選擇為2--16倍,但是其輸出頻率最大不得超過72MHz.
下圖為STM32的時鐘樹。(圖1)
圖1
AHB (最大72M)
APB1 (最大36M): DAC, PWR, BKP, CAN, SRAM, I2C, USART2~5, SPI2/3, RTC, TIM2~7
APB2 (最大72M): ADC, SPI1, TIM1/8, GPIOA~F, EXTI, AFIO ,USART1
具體在RCC_Configuration函數(shù)中的體現(xiàn)。
第一步:系統(tǒng)時鐘選擇哪個,HSE、HSI還是PLLCLK。
RCC_HSEConfig(RCC_HSE_ON);//使用HSE
如果HSE時鐘已經(jīng)穩(wěn)定,硬件會將RCC_CR的HSERDY位置1。
第二步:判斷HSE時鐘是否穩(wěn)定
if(RCC_WaitForHSEStartUp()==SUCCESS)//SUCCESS的含義要提前定義
第三步:使能FLASH的預(yù)取址緩沖區(qū),并設(shè)置FLASH的等待狀態(tài)。(具體功能見FLASH部分)
FLASH_SetLatency(FLASH_Latency_2);//flash2等待狀態(tài),操作的一個延時
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//Flash讀取緩沖,加速
第四步:設(shè)置AHB預(yù)分頻系數(shù)。預(yù)分頻系數(shù)可以是1、2、4、8、16、32、64、128、256;)(圖2)
圖2
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB使用系統(tǒng)時鐘//HCLK = SYSCLK
第五步:設(shè)置APB2的預(yù)分頻系數(shù),來確定PCLK2頻率。預(yù)分頻系數(shù)可以是1、2、4、8、16
RCC_PCLK2Config(RCC_HCLK_Div1);//APB2為HCLK/1//PCLK2 = HCLK/1
第六步:設(shè)置APB1的預(yù)分頻系數(shù),來確定PCLK1頻率。預(yù)分頻系數(shù)可以是1、2、4、8、16
RCC_PCLK1Config(RCC_HCLK_Div2);//APB1為HCLK/2//PCLK1 = HCLK/2
第七步:設(shè)置PLL的時鐘源,以及PLL的倍頻系數(shù),來確定PLLCLK頻率。(圖3)
圖3
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//PLLCLK = 8MHz * 9 =72MHz
第八步:使能PLL。將RCC_CR的PLLON位置1。
RCC_PLLCmd(ENABLE);//啟動PLL //EnablePLL
如果PLL鎖定后,硬件會將RCC_CR的PLLRDY位置1。
第九步:等待PLL鎖定。
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET); //等待PLL啟動
第十步:選擇PLL作為SYSCLK(系統(tǒng)時鐘源)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//將PLL設(shè)置為系統(tǒng)時鐘源
第十一步:等待系統(tǒng)時鐘源的啟動
while(RCC_GetSYSCLKSource() != 0x08);//等待系統(tǒng)時鐘源的啟動
第十二步:開啟要使用的外設(shè)時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打開GPIOC時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//該引腳(TX)屬于復(fù)用功能引腳
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打開USART1 時鐘
二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法,如果使用內(nèi)部RC振蕩器而不用外部晶振,請按照下面方法處理,
①對于100腳或者144腳的產(chǎn)品,OSC_IN應(yīng)接地,OSC_OUT應(yīng)懸空;
②對于少于100腳的產(chǎn)品,有2種接法,第一種:OSC_IN和OSC_OUT分別通過10K電阻接地,此方法可以提高EMC性能,第二種:分別重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1為推挽輸出,并輸出0,此方法可以減小功耗并節(jié)省2個外部電阻。