STM32時鐘配置

2021-07-05 04:33:25 字數 3044 閱讀 3191

大家都知道在使用微控制器時,時鐘速度決定於外部晶振或內部rc振盪電路的頻率,是不可以改變的。而arm的出現打破了這一傳統的法則,可以通過軟體隨意改變時鐘速度。

這一出現讓我們的設計更加靈活,但是也給我們的設計增加了複雜性。為了讓使用者能夠更簡單的使用這一功能,stm32的庫函式已經為我們設計的更加簡單方便。

在比較考前的版本中,我們需要向下面這樣設定時鐘:

用hse時鐘,程式設定時鐘引數流程:

步驟函式

定義型別變數(步驟3會用到)

errorstatus hsestartupstatus;

1、將rcc暫存器重新設定為預設值

rcc_deinit();

2、開啟外部高速時鐘晶振hse

rcc_hseconfig(rcc_hse_on);

3、等待外部高速時鐘晶振工作

hsestartupstatus = rcc_waitforhsestartup();

4、設定ahb時鐘

rcc_hclkconfig;

5、設定高速ahb時鐘

rcc_pclk2config;

6、設定低速速ahb時鐘

rcc_pclk1config;

7、設定pll

rcc_pllconfig;

8、開啟pll

rcc_pllcmd(enable);

9、等待pll工作

while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)

10、設定系統時鐘

rcc_sysclkconfig;

11、判斷是否pll是系統時鐘

while(rcc_getsysclksource() != 0x08)

12、開啟要使用的外設時鐘

rcc_apb2periphclockcmd()/rcc_apb1periphclockcmd()

**如下:

void rcc_configuration(void)

/* 開啟apb2匯流排上的gpioa時鐘*/

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa , enable);

}

隨著函式庫版本的不斷公升級,到3.0以上時,我們就不用再這樣編寫時鐘設定了,我們只要做如下三步即可:

第一步: 在system_stm32f10x.c 中 #define sysclk_freq_72mhz 72000000 

也可以定義其他的大小。

第二步:呼叫systeminit()

第三步:開啟對應的外設時鐘

這是因為在啟動檔案startup_stm32f10x_hd.s(其他型號和大小的啟動檔案相似)中有這樣兩句**

reset_handler:

...import systeminit

ldr r0,systeminit

這兩句**的意思是先定義systeminit,然後呼叫systeminit函式。

其中systeminit()函式在system_stm3210x.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檔案繼續往下看

1

#elif defined sysclk_freq_72mhz

2const uint32_t systemfrequency = sysclk_freq_72mhz;

3const uint32_t systemfrequency_sysclk = sysclk_freq_72mhz;

4const uint32_t systemfrequency_ahbclk = sysclk_freq_72mhz;

5const uint32_t systemfrequency_apb1clk = (sysclk_freq_72mhz/2);

6const uint32_t systemfrequency_apb2clk = sysclk_freq_72mhz;

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

再往下看,看到這個了:

#elif defined sysclk_freq_72mhz

static

void setsysclockto72(void);

看到這裡我們應該明白:

systeminit中呼叫setsysclock

setsysclock中呼叫setsysclocktoxx,其中xx代表具體的時鐘大小,如72表示72mhz。

在啟動檔案中先呼叫systeminit,再呼叫main

保險起見我們可以在main函式中可以再次呼叫systeminit,然後在開啟各個外設時鐘

main.c

systeminit();

/* 開啟apb2匯流排上的gpioa時鐘,即開啟相應的外設時鐘

其他外設開啟對應時鐘即可

*/rcc_apb2periphclockcmd(rcc_apb2periph_gpioa , enable);

STM32時鐘系統

下面我們根據這張圖說說有關stm32時鐘系統的那些事 io uint32 t cr hsi,hse,css,pll等的使能和就緒標誌位 io uint32 t cfgr pll等的時鐘源選擇,分頻係數設定 io uint32 t ahbenr dma,sdio等時鐘使能 io uint32 t ap...

stm32時鐘分割

不太明白 1 tim perscaler來設定預分頻係數 2 tim clockdivision來設定時鐘分割 時鐘分頻因子 3 tim countermode來設定計數器模式 時鐘分割定義的是在定時器時鐘頻率 ck int 與數字濾波器 etr,tix 使用的取樣頻率之間的分頻比例。tim clo...

STM32時鐘總結

系統時鐘可以由3種時鐘源提供 hse hsi和pll pll時鐘源是通過是由hsi時鐘除以2或則hse分頻得到,然後通過倍頻器得到pllclk 然後匯流排時鐘由系統時鐘提供 在hal庫中,使用stm32cubemx配置時鐘很方便,自動生成。rcc oscinitstruct.pll.pllstate...