STM32 時鐘配置與使用

2022-09-11 10:36:14 字數 2996 閱讀 1216

rcc-復位和時鐘控制器

可以實現配置系統時鐘sysclk,配置ahb(hclk)匯流排時鐘,配置外設apb1(pclk1)apb2(pclk2)時鐘

庫函式的標準配置為pclk2=hclk=sysclk=pllclk=72m,pclk1=hclk/2=36m

系統初始化時會呼叫函式實現時鐘配置。

#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) */

static void setsysclock(void)

// 當pll穩定之後,把pll時鐘切換為系統時鐘sysclk

rcc_sysclkconfig(rcc_sysclksource_pllclk);

// 讀取時鐘切換狀態位,確保pllclk被選為系統時鐘

while (rcc_getsysclksource() != 0x08){}}

else

}}

/* 設定 系統時鐘:sysclk, ahb匯流排時鐘:hclk, apb2匯流排時鐘:pclk2, apb1匯流排時鐘:pclk1

* pclk2 = hclk = sysclk

* pclk1 = hclk/2,最高只能是36m

* 引數說明:pllmul是pll的倍頻因子,在呼叫的時候可以是:rcc_pllmul_x , x:[2,3,...16]

* 舉例:hsi_setsysclock(rcc_pllmul_9); 則設定系統時鐘為:4mhz * 9 = 72mhz

* hsi_setsysclock(rcc_pllmul_16); 則設定系統時鐘為:4mhz * 16 = 64mhz

* * hsi作為時鐘**,經過pll倍頻作為系統時鐘,這是在hse故障的時候才使用的方法

* hsi會因為溫度等原因會有漂移,不穩定,一般不會用hsi作為時鐘**,除非是迫不得已的情況

* 如果hsi要作為pll時鐘的**的話,必須二分頻之後才可以,即hsi/2,而pll倍頻因子最大只能是16

* 所以當使用hsi的時候,sysclk最大只能是4m*16=64m

*/void hsi_setsysclock(uint32_t pllmul)

// 當pll穩定之後,把pll時鐘切換為系統時鐘sysclk

rcc_sysclkconfig(rcc_sysclksource_pllclk);

// 讀取時鐘切換狀態位,確保pllclk被選為系統時鐘

while (rcc_getsysclksource() != 0x08)

}else

}}

mco gpio初始化

/*

* 初始化mco引腳pa8

* 在f1系列中mco引腳只有乙個,即pa8,在f4系列中,mco引腳會有兩個

*/void mco_gpio_config(void)

輸出

// mco 引腳初始化

mco_gpio_config();

// 設定mco引腳輸出時鐘,用示波器即可在pa8測量到輸出的時鐘訊號,

// 我們可以把pllclk/2作為mco引腳的時鐘來檢測系統時鐘是否配置準確

// mco引腳輸出可以是hse,hsi,pllclk/2,sysclk

//rcc_mcoconfig(rcc_mco_hse);

//rcc_mcoconfig(rcc_mco_hsi);

//rcc_mcoconfig(rcc_mco_pllclk_div2);

rcc_mcoconfig(rcc_mco_sysclk);

systick——系統定時器是屬於 cm3 核心中的乙個外設,內嵌在 nvic 中。

系統定時器是乙個 24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/sysclk,一般我們設定系統時鐘 sysclk 等於 72m。當重裝載數值暫存器的值遞減到 0 的時候,系統定時器就產生一次中斷,以此迴圈往復。

因為 systick 是屬於 cm3 核心的外設,所以所有基於 cm3 核心的微控制器都具有這個系統定時器,使得軟體在 cm3 微控制器中可以很容易的移植。系統定時器一般用於作業系統,用於產生時基,維持作業系統的心跳。

STM32時鐘配置

大家都知道在使用微控制器時,時鐘速度決定於外部晶振或內部rc振盪電路的頻率,是不可以改變的。而arm的出現打破了這一傳統的法則,可以通過軟體隨意改變時鐘速度。這一出現讓我們的設計更加靈活,但是也給我們的設計增加了複雜性。為了讓使用者能夠更簡單的使用這一功能,stm32的庫函式已經為我們設計的更加簡單...

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