STM32使用外部16MHZ晶振總結

2021-08-21 11:18:32 字數 2014 閱讀 7767

做小封裝產品設計的朋友或許知道3225-4pin的晶振,為何8mhz晶振批量**要到2元一片,而16mhz晶振只需要0.4元甚至更少。究其原因是因為3225封裝的晶振目前全球最低頻率一般為8mhz,而國內8mhz達不到精度指標,所以市場上的8mhz晶振一般為進口晶振,因此成本被壟斷。

圖1  3225封裝晶振

stm32微控制器學習者一開始用的晶振一般是2pin的8mhz晶振,一旦正真做產品研發的時候,使用到3225的8mhz晶振的話,成本是個不小的挑戰。筆者現針對這個問題,提出使用16mhz晶振代替的方法。

圖2  stm32時鐘樹狀圖

由上圖可以看出,如果想相容8mhz晶振,必須在時鐘倍頻前2分頻。程式設計如下,在system_stm32f10x.c檔案下修改系統時鐘配置,配置為72mhz。

圖3  系統時鐘配置

修改setsysclockto72(void)檔案如下:

static void setsysclockto72(void)

while((hsestatus == 0) &&(startupcounter != hse_startup_timeout));

if ((rcc->cr & rcc_cr_hserdy) !=reset)

else

if (hsestatus == (uint32_t)0x01)

rcc->cfgr &= (uint32_t)~(rcc_cfgr_pllxtpre | rcc_cfgr_pllsrc| rcc_cfgr_pllmull);

rcc->cfgr|= (uint32_t)(rcc_cfgr_pllxtpre_prediv1 | rcc_cfgr_pllsrc_prediv1|

rcc_cfgr_pllmull9);

#else   

//16mhz2分頻如下改動,新增rcc_cfgr_pllxtpre_hse_div2

rcc->cfgr&= (uint32_t)((uint32_t)~(rcc_cfgr_pllsrc | rcc_cfgr_pllxtpre|

rcc_cfgr_pllxtpre_hse_div2

|rcc_cfgr_pllmull));

rcc->cfgr|= (uint32_t)(

rcc_cfgr_pllxtpre_hse_div2 | rcc_cfgr_pllsrc_hse  |rcc_cfgr_pllmull9);

#endif

rcc->cr|= rcc_cr_pllon;

while((rcc->cr & rcc_cr_pllrdy) == 0)

rcc->cfgr&= (uint32_t)((uint32_t)~(rcc_cfgr_sw));

rcc->cfgr|=(uint32_t)rcc_cfgr_sw_pll;   

while((rcc->cfgr & (uint32_t)rcc_cfgr_sws) !=(uint32_t)0x08)

}else

}到此,很多讀者認為設計已經完畢,這個系統也如願地倍頻至72mhz了,但忽略了乙個小細節。我們需要修改stm32f10x.h檔案裡面的外部時鐘巨集定義,有一些外設的時鐘是直接使用外部時鐘配置的,比如串列埠等。

#if !defined  hse_value

#ifdefstm32f10x_cl  

#definehse_value   ((uint32_t)25000000)

#else

#definehse_value   ((uint32_t)

16000000)

#endif

#endif

至此,程式修改完畢。整個系統圍繞8mhz倍頻至72mhz歡暢的執行.

STM32標準庫使用外部16MHZ晶振修改程式配置

參考時鐘樹,修改圖中紅框內的分頻。查詢prediv1,查詢手冊發現由rcc cfgr暫存器控制。在system stm32f10x.c檔案中對static void setsysclockto72 void 函式進行修改 將rcc cfgr的bit17置1。rcc cfgr uint32 t 0x0...

關於STM32外接12MHz晶振的處理辦法

關於stm32外接12mhz晶振的處理辦法 出處 amobbs 阿莫電子論壇 由於stm32f10x庫官方採用的是預設的外接8mhz晶振,因此造成很多使用者也採用了8mhz的晶振,但是,8mhz的晶振不是必須的,其他頻點的晶振也是可行的,只需要在庫中做相應的修改就行。在論壇上看到很多使用者反映,使用...

STM32外部中斷

一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...