STM32有多個(gè)時(shí)鐘源,分別是
HSI:高速內(nèi)部時(shí)鐘,RC振蕩器,頻率為8MHz。上電默認(rèn)啟動(dòng),因精度不高所以先不采用,以后如果需要再使用。
HSE:外部高速時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為4MHz~16MHz。系統(tǒng)時(shí)鐘一般采用它,經(jīng)過PLL倍頻作為系統(tǒng)同時(shí)鐘。
LSE:外部低速時(shí)鐘,接頻率為32.768kHz的石英晶體。一般專門用于RTC,等到RTC模塊時(shí)再使用
LSI:內(nèi)部低速時(shí)鐘,RC振蕩器,頻率為40kHz。精度不高,一般用于IWDGCLK。
PLL:鎖相環(huán)倍頻輸出,其時(shí)鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。
時(shí)鐘系統(tǒng)框圖如下:
用戶可通過多個(gè)預(yù)分頻器配置AHB總線、高速APB2總線和低速APB1總線的頻率。AHB和APB2域的最大頻率是72MHZ。APB1域的最大允許頻率是36MHZ。SDIO接口的時(shí)鐘頻率固定為HCLK/2。
40kHz的LSI供獨(dú)立看門狗IWDG使用,另外它還可以被選擇為實(shí)時(shí)時(shí)鐘RTC的時(shí)鐘源。另外,實(shí)時(shí)時(shí)鐘RTC的時(shí)鐘源還可以選擇LSE,或者是HSE的128分頻。RTC的時(shí)鐘源通過RTCSEL[1:0]來選擇。
STM32中有一個(gè)全速功能的USB模塊,其串行接口引擎需要一個(gè)頻率為48MHz的時(shí)鐘源。該時(shí)鐘源只能從PLL輸出端獲取,可以選擇為1.5分頻或者1分頻,也就是,當(dāng)需要使用USB模塊時(shí),PLL必須使能,并且時(shí)鐘頻率配置為48MHz或72MHz。
另外,STM32還可以選擇一個(gè)PLL輸出的2分頻、HSI、HSE、或者系統(tǒng)時(shí)鐘SYSCLK輸出到MCO腳(PA8)上。系統(tǒng)時(shí)鐘SYSCLK,是供STM32中絕大部分部件工作的時(shí)鐘源,它可選擇為PLL輸出、HSI或者HSE,(一般程序中采用PLL倍頻到72Mhz)在選擇時(shí)鐘源前注意要判斷目標(biāo)時(shí)鐘源是否已經(jīng)穩(wěn)定振蕩。Max=72MHz,它分為2路,1路送給I2S2、I2S3使用的I2S2CLK,I2S3CLK;另外1路通過AHB分頻器分頻(1/2/4/8/16/64/128/256/512)分頻后送給以下8大模塊使用:
?、?送給SDIO使用的SDIOCLK時(shí)鐘。
?、?送給FSMC使用的FSMCCLK時(shí)鐘。
?、?送給AHB總線、內(nèi)核、內(nèi)存和DMA使用的HCLK時(shí)鐘。
④ 通過8分頻后送給Cortex的系統(tǒng)定時(shí)器時(shí)鐘(SysTick)。
?、?直接送給Cortex的空閑運(yùn)行時(shí)鐘FCLK。
?、?送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設(shè)使用(PCLK1,最大頻率36MHz),另一路送給定時(shí)器(Timer2-7)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器2、3、4、5、6、7使用。
?、?送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設(shè)使用(PCLK2,最大頻率72MHz),另一路送給定時(shí)器(Timer1、Timer8)1、2倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器1和定時(shí)器8使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后得到ADCCLK時(shí)鐘送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。
?、?2分頻后送給SDIO AHB接口使用(HCLK/2)。
STM32中各個(gè)模塊都有自己的時(shí)鐘,當(dāng)使用相應(yīng)的模塊時(shí)首先記得把此模塊時(shí)鐘開啟
本次學(xué)習(xí)使用標(biāo)準(zhǔn)固件庫(kù)3.3.0
好了,看明白上圖咱就開始吧。
? ? ? ? RCC時(shí)鐘配置詳解
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
//SystemInit(); //完全可以使用此函數(shù)配置,但是為了學(xué)習(xí)咱先不用
RCC_DeInit(); //復(fù)位RCC模塊的寄存器,復(fù)位成缺省值
RCC_HSEConfig(RCC_HSE_ON); //開啟HSE時(shí)鐘,咱是用HSE的時(shí)鐘作為PLL的時(shí)鐘源
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //獲取HSE啟動(dòng)狀態(tài)
if(HSEStartUpStatus == SUCCESS) //如果HSE啟動(dòng)成功
{
FLASH_PrefetchBufferCmd(ENABLE); //開啟FLASH的預(yù)取功能
FLASH_SetLatency(FLASH_Latency_2); //FLASH延遲2個(gè)周期(這里我也不明白,先用吧)
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置HCLK,PCLK2,PCLK1,PLL
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); //啟動(dòng)PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{} //等待PLL啟動(dòng)完成
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時(shí)鐘
while(RCC_GetSYSCLKSource() !=0x80) //檢查是否將HSE 9倍頻后作為系統(tǒng)時(shí)鐘
{}
}
}
設(shè)置時(shí)鐘流程:
1.將RCC寄存器重新設(shè)置為默認(rèn)值 ? ? ? ? ? RCC_DeInit
2.打開外部高速時(shí)鐘晶振 ? ? ? ? ? ? ? ? ? ? ? ? ? ?HSE RCC_HSEConfig(RCC_HSE_ON);
3.等待外部高速時(shí)鐘晶振工作 ? ? ? ? ? ? ? ? ? ?HSEStartUpStatus = RCC_WaitForHSEStartUp();
4.設(shè)置AHB時(shí)鐘 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?RCC_HCLKConfig;
5.設(shè)置高速APB2時(shí)鐘 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?RCC_PCLK2Config;
6.設(shè)置低速速APB1時(shí)鐘 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?RCC_PCLK1Config
7.設(shè)置 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PLL RCC_PLLConfig
8.打開 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PLL RCC_PLLCmd(ENABLE);
9.等待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的系統(tǒng)時(shí)鐘配置好了,系統(tǒng)時(shí)鐘72MHz,APH 72MHz,APB2 72MHz,APB1 32MHz,USB 48MHz
其他至于ADC什么的先用不管,用到時(shí)再設(shè)置,本次只是大體先熟悉下STM32的時(shí)鐘配置流程,便于以后程序的編寫
評(píng)論
查看更多