STM32F107的時鐘設定

2021-09-11 04:29:25 字數 3170 閱讀 6211

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 中 #define sysclk_freq_72mhz 72000000 

第二個:呼叫systeminit()

說明:在stm32韌體庫3.0中對時鐘頻率的選擇進行了大大的簡化,原先的一大堆操作都在後台進行。系統給出的函式為systeminit()。但在呼叫前還需要進行一些巨集定義的設定,具體的設定在system_stm32f10x.c檔案中。

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

//#define sysclk_freq_hse    hse_value 

//#define sysclk_freq_20mhz 20000000 

//#define sysclk_freq_36mhz 36000000 

//#define sysclk_freq_48mhz 48000000 

//#define sysclk_freq_56mhz 56000000 

#define sysclk_freq_72mhz 72000000

#define sysclk_freq_72mhz 72000000 

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

然後這個 c檔案繼續往下看 

#elif defined sysclk_freq_72mhz 

const uint32_t systemfrequency         = sysclk_freq_72mhz;    

const uint32_t systemfrequency_sysclk   = sysclk_freq_72mhz;    

const uint32_t systemfrequency_ahbclk   = sysclk_freq_72mhz;    

const uint32_t systemfrequency_apb1clk  = (sysclk_freq_72mhz/2);

const uint32_t systemfrequency_apb2clk  = sysclk_freq_72mhz;

這就是在定義了cpu跑72m的時候,各個系統的速度了.他們分別是:硬體頻率,系統時鐘,ahb匯流排頻率,apb1匯流排頻率,apb2匯流排頻率.再往下看,看到這個了: 

#elif defined sysclk_freq_72mhz 

static void setsysclockto72(void);

這就是定義 72m 的時候,設定時鐘的函式.這個函式被 setsysclock ()函式呼叫,而setsysclock ()函式則是被 systeminit()函式呼叫.最後 systeminit()函式,就是被你呼叫的了。

所以設定系統時鐘的流程就是: 首先使用者程式呼叫 systeminit()函式,這是乙個庫函式,然後 systeminit()函式裡面,進行了一些暫存器必要的初始化後,就呼叫 setsysclock()函式. setsysclock()函式根據那個#define sysclk_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 倍頻到72...

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...