標(biāo)題: STM32F103時(shí)鐘配置流程 [打印本頁(yè)]

作者: IdeaMing    時(shí)間: 2018-3-15 11:06
標(biāo)題: STM32F103時(shí)鐘配置流程
本帖最后由 IdeaMing 于 2018-3-16 10:15 編輯

STM32F103時(shí)鐘配置流程



前言:
一般情況下單片機(jī)的時(shí)鐘配置是單片機(jī)程序中的第一步,也是很重要的一步。這時(shí)候我們需要考慮以下幾個(gè)問(wèn)題。
1. 系統(tǒng)時(shí)鐘的時(shí)鐘源用哪個(gè)。
2. 系統(tǒng)時(shí)鐘頻率要多少。
3. 每個(gè)模塊的時(shí)鐘頻率要多少。
4. 如果外部時(shí)鐘出了問(wèn)題,這個(gè)時(shí)候時(shí)鐘是怎么運(yùn)行的。

下面就針對(duì)性的講一講STM32F103的時(shí)鐘配置。



知識(shí)點(diǎn):
1. 系統(tǒng)復(fù)位后,HSI振蕩器被選為系統(tǒng)時(shí)鐘。當(dāng)時(shí)鐘源被直接或通過(guò)PLL間接作為系統(tǒng)時(shí)鐘時(shí),它將不能被停止。

2. STM32F103的三個(gè)可以作為系統(tǒng)時(shí)鐘的時(shí)鐘源,分別是HSI、HSE、PLL。而PLL的時(shí)鐘源是HSI/2(內(nèi)部RC振蕩器二分頻)、HSE。

3.如果使用HSI,系統(tǒng)時(shí)鐘我們能達(dá)到的最大頻率是64MHz,如果使用HSE,系統(tǒng)時(shí)鐘最大頻率是72MHz

4.APB時(shí)鐘有低速PCLK1和高速PCLK2;PCLK1是從HCLK二分頻得到的,最大36MHZ,根據(jù)上一條知識(shí)點(diǎn)如果是使用HSI,則最快是32MHz。

5. PLL的設(shè)定需要在使能之前,一旦PLL使能后參數(shù)不可更改。

6.附錄是一些縮寫(xiě)的英文全稱(chēng),也有一些補(bǔ)充的知識(shí)點(diǎn)。


步驟:
第一步     初始化時(shí)鐘
         不管現(xiàn)在SYSCLK的時(shí)鐘源是哪個(gè),我們要更換時(shí)鐘源。先RCC_DeInit();

第二步              打開(kāi)時(shí)鐘
         內(nèi)部高速時(shí)鐘HSI           RCC_HSICmd(ENABLE);
         外部高速時(shí)鐘HSE          RCC_HSEConfig(RCC_HSE_ON);

第三步              等待時(shí)鐘晶振工作
         HSI            While(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
         HSE           While(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);

第四步              設(shè)置AHB時(shí)鐘HCLK
                                                                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
        分頻系數(shù)自己設(shè)定,一般都是RCC_SYSCLK_Div1即不分頻。

第五步              設(shè)置低速APB時(shí)鐘
                                                                 RCC_PCLK1Config(RCC_HCLK_Div2);

第六步              設(shè)置高速APB時(shí)鐘
                                                                 RCC_PCLK2Config(RCC_HCLK_Div1);
第七步              設(shè)置Flash預(yù)緩沖
                                                                 FLASH_SetLatency(FLASH_Latency_2);
                                              FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 使能flash預(yù)緩沖
       Flash的操作也沒(méi)有總線時(shí)鐘快,所以需要總線在操作flash時(shí)稍作等待。推薦根據(jù)HCLK設(shè)置。
0-24MHz時(shí),取FLASH_Latency_0;24-48MHz,取FLASH_Latency_1;48-72MHz時(shí),取FLASH_Latency_2。

第八步              設(shè)置PLL                     如果不使用PLL,請(qǐng)略過(guò)此步驟
         HSI                                                  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16 );
         HSE                                                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 );

第九步              打開(kāi)PLL                     如果不使用PLL,請(qǐng)略過(guò)此步驟
                                                                 RCC_PLLCmd(ENABLE);

第十步              等待PLL工作          如果不使用PLL,請(qǐng)略過(guò)此步驟
                                                                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);

第十一步              設(shè)置系統(tǒng)時(shí)鐘
         HSI                                                  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
         HSE                                                 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
         PLL                                                  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
第十二步         判斷是否是設(shè)置的時(shí)鐘
         HSI                                                  while(RCC_GetSYSCLKSource()!= 0x00);
         HSE                                                 while(RCC_GetSYSCLKSource()!= 0x04);
         PLL                                                  while(RCC_GetSYSCLKSource()!= 0x08);



附錄:一些縮寫(xiě)的英文全稱(chēng)及中文翻譯,幫助理解記憶。
IWDG       IndependentWatchdog                                   獨(dú)立看門(mén)狗

RTC           RealTime Clock                                                      實(shí)時(shí)時(shí)鐘
                   時(shí)鐘源可以是LSI,或者LSE,再或者HSE128分頻。
LSI             LowSpeed Internal                                                       內(nèi)部低速時(shí)鐘
                   RC振蕩器,頻率為40kHz。供IWDG使用,還能作為RTC的時(shí)鐘源。
HSI            HighSpeed Internal                                             內(nèi)部高速時(shí)鐘
                   RC振蕩器,頻率為8MHz
HSE           HighSpeed External                                             外部高速時(shí)鐘
                   可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為4MHz~16MHz。

PLL          PhaseLockedLoop                                                   鎖相環(huán)倍頻輸出
                   其時(shí)鐘輸入源可選擇為HSI/2HSE或者HSE/2。倍頻可選擇為2~16倍,

SYSCLK     SystemColock                                                                 系統(tǒng)時(shí)鐘

AHB          AdvancedHigh performance Bus                   高級(jí)高性能總線
                   AHB主要用于高性能模塊(CPU、DMADSP)之間的連接。

APB          Advanced PeripheralBus                                  高級(jí)外圍設(shè)備總線
                   APB主要用于外設(shè)模塊(ADC、USB、SPI、UART)AHB之間的連接。

HCLK         Advanced High performance Bus Clock                 高級(jí)高性能總線時(shí)鐘
                   就是SYSCLK經(jīng)過(guò)AHBPrescaler(預(yù)分頻器)后得到的AHB的時(shí)鐘。

PCLK         PeripheralBus Clock                                            外圍設(shè)備總線時(shí)鐘                  
                   PCLK有兩個(gè),一個(gè)是低速的PCLK1,另一個(gè)是高速的PCLK2。
                   PCLK1是經(jīng)過(guò)APB1Prescaler后得到的APB1時(shí)鐘。
PCLK2是經(jīng)過(guò)APB2 Prescaler后得到的APB2時(shí)鐘。

FCLK                   FreeRuning Clock                                                  自由運(yùn)行時(shí)鐘
為供給CPU內(nèi)核的時(shí)鐘信號(hào),CPU的主頻就是指這個(gè)信號(hào);1/FCLK就是CPU時(shí)鐘周期。
為什么叫自由運(yùn)行時(shí)鐘呢?下面是別人家的講解。
ARMJISHU注:FCLK 為處理器的自由振蕩的處理器時(shí)鐘,用來(lái)采樣中斷和為調(diào)試模塊計(jì)時(shí)。在處理器休眠時(shí),通過(guò)FCLK 保證可以采樣到中斷和跟蹤休眠事件。 Cortex-M3內(nèi)核的“自由運(yùn)行時(shí)鐘(free running clock)”FCLK!白杂伞北憩F(xiàn)在它不來(lái)自系統(tǒng)時(shí)鐘HCLK,因此在系統(tǒng)時(shí)鐘停止時(shí)FCLK也繼續(xù)運(yùn)行。FCLK和HCLK 互相同步。FCLK 是一個(gè)自由振蕩的HCLK。FCLK 和HCLK 應(yīng)該互相平衡,保證進(jìn)入Cortex-M3 時(shí)的延遲相同。


STM32F103時(shí)鐘配置流程.pdf (394.67 KB, 下載次數(shù): 165)




作者: IdeaMing    時(shí)間: 2018-3-16 09:06
這個(gè)時(shí)鐘配置完了之后就是端口時(shí)鐘的開(kāi)關(guān),外設(shè)總線的時(shí)鐘速度,比如SPI.
作者: IdeaMing    時(shí)間: 2018-3-16 10:16
IdeaMing 發(fā)表于 2018-3-16 09:06
這個(gè)時(shí)鐘配置完了之后就是端口時(shí)鐘的開(kāi)關(guān),外設(shè)總線的時(shí)鐘速度,比如SPI.

第二版本增加了第七步,flash的操作延時(shí)設(shè)置和flash預(yù)緩沖的設(shè)置。
作者: 51hei大小    時(shí)間: 2018-3-16 15:47
非常有用,果斷下載 先謝樓主
作者: cnc2020    時(shí)間: 2018-7-8 21:49
good job
作者: pc333    時(shí)間: 2018-7-9 17:48
贊!真的很清楚明白,小弟有個(gè)疑問(wèn),恭請(qǐng)樓主幫忙解惑,感謝!

小弟啟用的是外部時(shí)鐘,即HSE,前十步都與樓主一致,但在第十一、十二步,使用的是PLL對(duì)應(yīng)的代碼,這個(gè)與使用HSE對(duì)應(yīng)的代碼有啥區(qū)別和影響呢?再次感謝!
作者: a7727347    時(shí)間: 2018-7-9 21:20
非常感謝
作者: IdeaMing    時(shí)間: 2018-8-23 16:40
pc333 發(fā)表于 2018-7-9 17:48
贊!真的很清楚明白,小弟有個(gè)疑問(wèn),恭請(qǐng)樓主幫忙解惑,感謝!

小弟啟用的是外部時(shí)鐘,即HSE,前十步都 ...

HSE就是你外面接的那個(gè)晶振頻率。
作者: 一直填填    時(shí)間: 2018-11-15 13:12
厲害啊
作者: chauvet2010    時(shí)間: 2019-1-16 17:13
不錯(cuò)~~
作者: wangdunyuan1    時(shí)間: 2019-6-11 20:11
非常有用
作者: kissme    時(shí)間: 2019-6-23 19:03
急需的東東,,謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1