STM32F107的時鐘設定

2021-07-29 15:00:21 字數 3464 閱讀 2745

stm32f107

的時鐘設定

stm32

的庫函式好像只有外部

8m倍頻到

72m,現在用的板子外部

25m的晶振,如何倍頻到

72m呢?

解決辦法:

stm32f107

的時鐘分

4步的:

1>25mhz先除5

分頻到5mhz;

2>再8

倍頻到40mhz;

3>再5

分頻到8mhz;

4>再9

倍頻到72mhz.

stm32f103

和stm32f105/stm32f107

的rcc

設定是不一樣的,仔細查

st的參考手冊,很容易得到答案的,新版的庫中,有

stm32f105/stm32f107

的時鐘設定**,通過全域性巨集來選定的。看一下《

stm32f10x.h

》中的開頭部分的巨集判斷。

errorstatus hsestartupstatus;

rcc_deinit();

rcc_hseconfig(rcc_hse_on);

hsestartupstatus =rcc_waitforhsestartup();

if(hsestartupstatus== success)

rcc_prediv1config(rcc_prediv1_source_pll2,rcc_prediv1_div5);

rcc_pllconfig(rcc_pllsource_prediv1,rcc_pllmul_9);

rcc_pll3config(rcc_pll3mul_11);

rcc_pll3cmd(enable);   

while(rcc_getflagstatus(rcc_flag_pll3rdy) ==reset){}

rcc_i2s3clkconfig(rcc_i2s3clksource_pll3_vco);

rcc_i2s2clkconfig(rcc_i2s2clksource_pll3_vco); 

#endif

rcc_pllcmd(enable);

while(rcc_getflagstatus(rcc_flag_pllrdy)== reset)

rcc_sysclkconfig(rcc_sysclksource_pllclk);

while(rcc_getsysclksource()!= 0x08) }

函式庫的不斷公升級,到

3.0以上時,我們就不用再這樣編寫時鐘設定了,我們只要做如下兩部即可:

第乙個:system_stm32f10x.c

中#definesysclk_freq_72mhz 72000000 

第二個:呼叫

systeminit()

說明:在

stm32

韌體庫3.0

中對時鐘頻率的選擇進行了大大的簡化,原先的一大堆操作都在後台進行。系統給出的函式為

systeminit()

。但在呼叫前還需要進行一些巨集定義的設定,具體的設定在

system_stm32f10x.c

檔案中。

檔案開頭就有乙個這樣的定義: 

//#definesysclk_freq_hse    hse_value 

//#definesysclk_freq_20mhz 20000000 

//#definesysclk_freq_36mhz 36000000 

//#definesysclk_freq_48mhz 48000000 

//#definesysclk_freq_56mhz 56000000 

#definesysclk_freq_72mhz 72000000

st官方推薦的外接晶振是

8m,所以庫函式的設定都是假定你的硬體已經接了

8m 晶振來運算的

.以上東西就是預設晶振

8m 的時候

,推薦的

cpu

頻率選擇

.在這裡選擇了:

#definesysclk_freq_72mhz 72000000 

也就是103系列能跑到的最大值

72m

然後這個

c檔案繼續往下看

#elif definedsysclk_freq_72mhz 

const uint32_tsystemfrequency         =sysclk_freq_72mhz;    

const uint32_tsystemfrequency_sysclk   = sysclk_freq_72mhz;    

const uint32_tsystemfrequency_ahbclk   = sysclk_freq_72mhz;    

const uint32_tsystemfrequency_apb1clk  = (sysclk_freq_72mhz/2);

const uint32_tsystemfrequency_apb2clk  = sysclk_freq_72mhz;

這就是在定義了

cpu跑

72m的時候

,各個系統的速度了

.他們分別是

:硬體頻率

,系統時鐘

,ahb

匯流排頻率

,apb1

匯流排頻率

,apb2

匯流排頻率

.再往下看

,看到這個了: 

#elif definedsysclk_freq_72mhz 

static void setsysclockto72(void);

這就是定義

72m

的時候,

設定時鐘的函式

.這個函式被

setsysclock ()

函式呼叫,而

setsysclock ()

函式則是被

systeminit()

函式呼叫.最後

systeminit()函式,

就是被你呼叫的了。

所以設定系統時鐘的流程就是

: 首先使用者程式呼叫

systeminit()函式,

這是乙個庫函式,然後

systeminit()

函式裡面

,進行了一些暫存器必要的初始化後

,就呼叫

setsysclock()

函式. setsysclock()

函式根據那個

#definesysclk_freq_72mhz 72000000

的巨集定義

,知道了要呼叫

setsysclockto72()

這個函式,於是

,就一堆麻煩而複雜的設定

~!@#$%^

然後,cpu

跑起來了

,而且速度是

72m.

stm32f107:

STM32F107的時鐘設定

stm32的庫函式好像只有外部8m倍頻到72m,現在用的板子外部25m的晶振,如何倍頻到72m呢?解決辦法 stm32f107的時鐘分4步的 1 25mhz先除5分頻到5mhz 2 再8倍頻到40mhz 3 再5分頻到8mhz 4 再9倍頻到72mhz.stm32f103和stm32f105 stm...

STM32F107的串列埠通訊總結

stm32f107的串列埠通訊總結 stm32f107 的串列埠通訊總結 1.stm32 的一般規律,首先要使用串列埠必先使能串列埠時鐘,比如串列埠1 rcc apb2periphclockcmd rcc apb2periph usart1,enable 2.串列埠使用的gpio口設定 首先使能gp...

野火STM32F429設定的時鐘頻率

一 1.系統時鐘 sysclk sysclk pllclk 180mhz.2.hclk ahb匯流排時鐘 系統時鐘sysclk經過ahb預分頻器分頻之後得到的時鐘叫apb匯流排時鐘,即hclk,大部分外設的時鐘都是經過hclk分頻得到,我們這裡設定1分頻hclk sysclk 180hmz。3.pc...