對STM32系統時鐘和分頻的一點理解

2021-07-04 23:08:12 字數 3249 閱讀 4001

摘自:

系統時鐘和分頻

首先來手冊裡的一段話。

三種不同的時鐘源可被用來驅動系統時鐘 (sysclk)

一般用的是pll時鐘,後面有證據。

我們可以通過庫函式獲取各時鐘值

void rcc_getclocksfreq(rcc_clockstypedef* rcc_clocks)

在我的系統裡,把時鐘值列印

資訊如下:

sysclk:0x44aa200          //72000000, 72mhz

hclk:0x44aa200               //72000000, 72mhz

pclk1:0x2255100            //36000000, 36mhz

pclk2:0x44aa200            //72000000, 72mhz

adcclk:0x2255100        //36000000,36mhz

rcc->cfgr:0x001d040a

//pll輸出作為系統時鐘

可推測幾個預分頻值為

ahb prescaler = 1

apb1 prescaler = 2

apb2 prescaler = 1

adc prescaler = 2

根據讀取rcc->cfgr暫存器值為:0x001d040a,上面推測完全正確。

cfgr暫存器的sws段也說明:pll輸出作為系統時鐘。

tim2使用pclk1,但注意時鐘樹里有這一段

見附圖

已知apb1 prescaler=2,故tim2clk = pclk1*2 = 72mhz.

所以被tim2分頻的時鐘大小是72mhz。

我的程式也證明了這點

tim_timebaseinittypedef tim2_initstruct;

tim_deinit(tim2);

rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable);//enable timer2 clock.

nvic_configurationfortimer2();

// pclk1=36mhz, psc=36000-1, ck_cnt=36mhz/(psc+1)=1000

// arr=2000,  1s/1000 * 2000 = 2s.

tim2_initstruct.tim_prescaler = 36000-1;

tim2_initstruct.tim_period = 2000-1;

tim2_initstruct.tim_countermode = tim_countermode_up;

tim2_initstruct.tim_clockdivision = tim_ckd_div1;

tim2_initstruct.tim_repetitioncounter = 0;

tim_timebaseinit(tim2, &tim2_initstruct);

tim_clearflag(tim2, tim_flag_update);

tim_itconfig(tim2, tim_it_update, enable);//enables the specified tim interrupts.

這段配置原本以為定時時間是2s,實際只有1s。看了手冊才理解原因。

摘自:stm32 rcc復位與時鐘配置,我首先忽略掉復位,首先學習時鐘配置,復位以後用到再學習

stm32有多個時鐘源,分別是

hsi:上電預設啟動,因精度不高所以先不採用,以後如果需要再使用

hse:外部高速時鐘,系統時鐘一般採用它,經過pll倍頻作為系統同時鐘

lse:外部低速時鐘,一般專門用於rtc,等到rtc模組時再使用

lsi:內部低速時鐘,精度不高,一般用於iwdgclk

時鐘系統框圖如下:

stm32中各個模組都有自己的時鐘,當使用相應的模組時首先記得把此模組時鐘開啟

本次學習使用標準韌體庫3.3.0

好了,看明白上圖咱就開始吧:

void rcc_configuration(void)

//等待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的時鐘配置流程,便於以後程式的編寫

對STM32系統時鐘和分頻的一點理解

系統時鐘和分頻 首先來手冊裡的一段話。三種不同的時鐘源可被用來驅動系統時鐘 sysclk 一般用的是pll時鐘,後面有證據。我們可以通過庫函式獲取各時鐘值 void rcc getclocksfreq rcc clockstypedef rcc clocks 在我的系統裡,把時鐘值列印 資訊如下 s...

STM32系統時鐘

1 參考資料 stm32f1開發指南 庫函式版本 4.3小節 時鐘系統 stm32中文參考手冊v10 第六章 復位和時鐘控制 rcc 2 時鐘系統知識總結 1 stm32有5個時鐘源 hsi hse lsi lse pll hsi是高速內部時鐘,rc振盪器,頻率為8mhz,精度不高 hse是高速外部...

stm32系統時鐘

hsi 約等於8mhz rc振盪器產生的時鐘 hse 外部時鐘 css 如果檢測到外部時鐘的損壞,自動切換到hsi 系統時鐘和rtc時鐘 均有三個 systick定時器 簡單的定時器,常用來做延時和心跳時鐘 24位的倒計時定時器 ctrl暫存器 其實滴答定時器很簡單,就是設定初值,然後延遲,最後就是...