有關STM32F103C8T6的超頻

2021-09-22 21:00:02 字數 4990 閱讀 2372

閒來無事突然對32的超頻來了興趣。其實是學校有個實訓,給的微控制器是stm32f1做,想著能弄的更好點就想著把f1超頻一下,感覺能完成更多的事情吧。

平台是**上通用的st32f103c8t6最小系統板。

看了正點原子的論壇之後感覺,雖然很多大佬都超頻過,但是具體超頻的方法好像沒有路子,我查了好久是沒有查到。可能太簡單了,大佬們都懶得寫。一開始確實是無從下手,不過弄懂之後也感覺確實是不難。不過我感覺我改的有點弄巧成拙,確實不是很好,各位大佬如果有更好的方法也可以指出,小弟虛心求教。而且我似乎是只改了主頻,還有外設等等一堆頻率沒有動,我感覺這個東西應該是牽一髮而動全身,所以說暫時應該也只是乙個半成品。

首先是查了《stm32不完全手冊_庫函式版本_v3.1》這個pdf,上面雖然說得簡單,但是都是對的而且給了我乙個大概的方向。然後又認真看了遍時鐘樹,但是還是很懵,英文差的一塌糊塗。

言歸正傳,開始說方法。主要就是system_stm32f10x.c這個檔案。對這個檔案稍加修改就可以了。這個檔案裡面採用了大量的條件編譯,就是給使用者選擇頻率的,檔案裡面最大的頻率是72m。紅色部分是我自己新增的一點**。

#ifdef sysclk_freq_hse。

#ifdef sysclk_freq_hse。

uint32_t systemcoreclock         = sysclk_freq_hse;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_24mhz

uint32_t systemcoreclock         = sysclk_freq_24mhz;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_36mhz

uint32_t systemcoreclock         = sysclk_freq_36mhz;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_48mhz

uint32_t systemcoreclock         = sysclk_freq_48mhz;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_56mhz

uint32_t systemcoreclock         = sysclk_freq_56mhz;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_72mhz

uint32_t systemcoreclock         = sysclk_freq_72mhz;        /*!< system clock frequency (core clock) */

#elif defined sysclk_freq_chaopin  

uint32_t systemcoreclock         = sysclk_freq_chaopin;   

#else /*!< hsi selected as system clock source */

uint32_t systemcoreclock         = hsi_value;        /*!< system clock frequency (core clock) */

#endif

static void setsysclock(void);

static void setsysclock(void);

#ifdef sysclk_freq_hse

static void setsysclocktohse(void);

#elif defined sysclk_freq_24mhz

static void setsysclockto24(void);

#elif defined sysclk_freq_36mhz

static void setsysclockto36(void);

#elif defined sysclk_freq_48mhz

static void setsysclockto48(void);

#elif defined sysclk_freq_56mhz

static void setsysclockto56(void);  

#elif defined sysclk_freq_72mhz

static void setsysclockto72(void);

#elif defined sysclk_freq_chaopin

static void setsysclocktochaopin(void);

#endif

static void setsysclock(void)

static void setsysclock(void)

頻率設定巨集定義

#else   //頻率設定巨集定義在這裡

/* #define sysclk_freq_hse    hse_value */

/* #define sysclk_freq_24mhz  24000000 */ 

/* #define sysclk_freq_36mhz  36000000 */

/* #define sysclk_freq_48mhz  48000000 */

/* #define sysclk_freq_56mhz  56000000 */

//#define sysclk_freq_72mhz  72000000

#define sysclk_freq_chaopin  

120000000

//在這裡修改頻率

#endif

又在#elifdefined sysclk_freq_72mhz後面加了乙個#elif defined sysclk_freq_chaopin

#elif defined sysclk_freq_chaopin

/*** @brief  sets system clock frequency to nmhz and configure hclk, pclk2 

*          and pclk1 prescalers. 

* @note   this function should be used only after reset.

* @param  none

* @retval none

*/static void setsysclocktochaopin(void)

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

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

else

if (hsestatus == (uint32_t)0x01)

/* pll configuration: pllclk = prediv1 * 9 = 72 mhz */ 

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    

/*  pll configuration: pllclk = hse * n = 8*n mhz */

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

rcc->cfgr |= (uint32_t)(rcc_cfgr_pllsrc_hse | rcc_cfgr_pllmull15);    //修改乘積倍數

#endif /* stm32f10x_cl */

/* enable pll */

rcc->cr |= rcc_cr_pllon;

/* wait till pll is ready */

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

/* select pll as system clock source */

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

rcc->cfgr |= (uint32_t)rcc_cfgr_sw_pll;    

#endif

大概是修改了這麼多內容

個人理解是每次超頻應該都是8mhz的倍數,因為晶振是8m的,後面經過不斷的倍頻產生各種的頻率。

rcc_cfgr_pllmull15這個是乙個巨集定義,開啟後是一堆數字,不用管那麼多,基本上最後兩個數字15代表了對8m15倍頻的意思,然後對應的8m*15=120000000

修改到#define sysclk_freq_chaopin  

120000000 這條語句上面就可以了

然後是對結果的驗證

本人採用了__nop();這個函式,因為這個函式的執行速度全部卻決於主頻。

led0=1;

for(i=0;i<5000000;i++)__nop();

led0=0;

for(i=0;i<5000000;i++)__nop();

主函式裡面迴圈讓燈閃

第一次燈閃的時候按下秒錶,至第三次燈閃的時候停止,在72m下耗時10.01s,在120m下耗時6.02s。

10.01/6.02和120/72應該是差不多的。

STM32F103C8T6 內部 FLASH讀寫

u16 people id 50 假設公司最多50人 u16 people clock t 50 每個人簽到次數 u16 people num 2 人數 define debug define flash size 64 所選mcu的flash容量大小 單位為k if flash size 256 ...

STM32F103C8T6學習筆記 中斷

1 nvic 巢狀向量中斷控制器 即中斷優先順序管理 scr aircr暫存器 bit10 8 111 0位搶占優先順序 4位響應優先順序 這是整個系統的 每乙個中斷 對應ip暫存器 可設定成搶占優先順序 響應優先順序0 16 這是對應具體乙個中斷的 110 1位搶占優先順序 3位響應優先順序 ip...

《STM32》F103C8T6最小系統

復位電路是一種用來使電路恢復到起始狀態的電路裝置,它的操作原理與計算器有著異曲同工之妙,只是啟動原理和手段有所不同。復位電路,就是利用它把電路恢復到起始狀態。就像計算器的清零按鈕的作用一樣,以便回到原始狀態,重新進行計算。和計算器清零按鈕有所不同的是,復位電路啟動的手段有所不同。一是在給電路通電時馬...