系統時鐘和分頻
首先來手冊裡的一段話。
三種不同的時鐘源可被用來驅動系統時鐘
(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系統時鐘和分頻的一點理解
摘自 系統時鐘和分頻 首先來手冊裡的一段話。三種不同的時鐘源可被用來驅動系統時鐘 sysclk 一般用的是pll時鐘,後面有證據。我們可以通過庫函式獲取各時鐘值 void rcc getclocksfreq rcc clockstypedef rcc clocks 在我的系統裡,把時鐘值列印 資訊如...
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暫存器 其實滴答定時器很簡單,就是設定初值,然後延遲,最後就是...