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