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