STM32 HAL時鐘初始化

2021-09-17 02:38:18 字數 3412 閱讀 7557

由cubmx生成的stm32f1工程的內部時鐘和外部時鐘定義在stm32f1xx_hal_config.h中的

#if !defined  (hse_value) 

#define hse_value ((uint32_t)16000000)

/*!< value of the external oscillator in hz */

#endif

/* hse_value */

#if !defined (hsi_value)

#define hsi_value ((uint32_t)8000000)

/*!< value of the internal oscillator in hz*/

#endif

/* hsi_value */

/* 結構體初始化 */

rcc_oscinittypedef rcc_oscinitstruct =

; rcc_clkinittypedef rcc_clkinitstruct =

;/** initializes the cpu, ahb and apb busses clocks

*/rcc_oscinitstruct.oscillatortype = rcc_oscillatortype_hse;

/* rcc_oscillatortype_hsi; //時鐘源為hsi內部高速時鐘 //rcc_oscillatortype_hse 高速外部時鐘 */

rcc_oscinitstruct.hsestate = rcc_hse_on;

/* 開啟hes */

rcc_oscinitstruct.hsepredivvalue = rcc_hse_prediv_div2;

/* */

rcc_oscinitstruct.hsistate = rcc_hsi_on;

/* 開啟hsi */

rcc_oscinitstruct.lsistate = rcc_lsi_on;

/* 開啟lsi */

rcc_oscinitstruct.pll.pllstate = rcc_pll_on;

/* 開啟pll */

rcc_oscinitstruct.pll.pllsource = rcc_pllsource_hse;

/* 設定pll時鐘源 */

rcc_oscinitstruct.pll.pllmul = rcc_pll_mul9;

/* pll vco輸入時鐘的倍頻係數 */if(

hal_rcc_oscconfig

(&rcc_oscinitstruct)

!= hal_ok)

/* 初始化 */

/** initializes the cpu, ahb and apb busses clocks

*//* 選中pll作為系統時鐘源並且配置hclk,pclk1和pclk2 */

rcc_clkinitstruct.clocktype = rcc_clocktype_hclk|rcc_clocktype_sysclk

|rcc_clocktype_pclk1|rcc_clocktype_pclk2;

/* 設定系統時鐘源 */

rcc_clkinitstruct.sysclksource = rcc_sysclksource_pllclk;

/* ahb分頻係數 */

rcc_clkinitstruct.ahbclkdivider = rcc_sysclk_div1;

/* apb1分頻係數 */

rcc_clkinitstruct.apb1clkdivider = rcc_hclk_div2;

/* apb2分頻係數 */

rcc_clkinitstruct.apb2clkdivider = rcc_hclk_div1;

/* 初始化並同時設定flash 的延遲週期 */if(

1、lsi rc,低速內部時鐘(rc振盪器),是看門狗(watchdogls)的唯一時鐘**,可以作為實時時鐘rtc和主時鐘輸出(mco)的時鐘源。

2、lse osc,外部低速時鐘(晶振),輸入輸出引腳接osc32_in、ocs32_out可以作為實時時鐘rtc和主時鐘輸出(mco)的時鐘源。精度高於內部低速時鐘。

3、msi rc,全稱為multispeedinternal rc oscillator,是stm32lxx低功耗系列獨有的時鐘,可提供12種頻率的時鐘源,範圍可以從100khz到48mhz之間變化。可以直接選擇為系統時鐘和ahb時鐘,也可以作為mco的時鐘源。msi為低功耗模式提供了更多的選擇,但是精度不高。官方提供的例程中多以msi作為時鐘源。

4、hsi,內部高速時鐘(rc振盪器),可以直接選擇為系統時鐘,可以作為pll(鎖相環倍頻輸出)時鐘源,經倍頻後選擇作為系統的system clock(系統時鐘)和ahb時鐘。hsi還可以作為adcclk時鐘源。

5、hse,外部高速時鐘(晶振),輸入輸出引腳接osc_in、ocs_out,可以直接選擇為系統時鐘,可以作為pll源,經倍頻後選擇作為系統的(系統時鐘)和ahb時鐘。還可以作為mco和rtc時鐘源。

6、system clock,系統時鐘,是供stm32 中絕大部分部件工作的時鐘源,是其他所有外設的時鐘的**。system clock通過 ahb 分頻器分頻後送給各模組使用。system clock還是ck_pwr和mco的時鐘源。

7、hclk,高速外設時鐘,是ahb匯流排時鐘源,systemclock經ahb預分頻得到。供記憶體和 dma 等使用。

8、fclk為自由振盪處理器時鐘,用來保證在休眠是取樣到中斷和跟蹤休眠事件,與hclk時鐘源相同。

9、pclk1,system clock經ahb預分頻後,送給 apb1 分頻器,得出pclk1,是apb1時鐘源,供 apb1 外設使用。apb1上面連線的是低速外設,包括電源介面、備份介面、can、usb、i2c1、i2c2、uart2、uart3 等等。另一路送給timx使用,若apb1分頻係數為1,則不倍頻,否則倍頻係數為2。

10、pclk2,system clock經ahb預分頻後,送給 apb2 分頻器,得出pclk2,是apb2時鐘源,供 apb2外設使用,apb2 上面連線的是高速外設包括uart1、spi1、timer1、adc1、adc2、所有普通 io 口(pa~pe)、第二功能 io 口等。另一路送給timx使用,若apb2分頻係數為1,則不倍頻,否則倍頻係數為2。

參考

STM32HAL 紅外遙控(NEC)

整理了乙個nec協議的紅外程式,nec協議,物理環境為f103原子戰艦v3,使用stm32cubemx生成初始程式。定時器配置72分頻,9999裝載值 10ms nec協議 資料格式 同步碼頭 位址碼 位址反碼 按鍵碼 按鍵反碼 lsb先行 同步碼頭 9ms低電平 4.5ms高電平 連發碼 9ms低...

STM32 HAL庫學習筆記

1 系統時鐘 一般用stm32cube生成,使用者只需要會用stm32cube就行。2 gpio輸出void led gpio config void 3 gpio輸入void key gpio config void 4 外部中斷void exti key config void void ext...

stm32 HAL 低功耗模式

最近學習了stm32的低功耗模式,發現很多可以學習的地方,微控制器功耗要低才能續航很久 低功耗模式 如果是中斷就先執行中斷的程式,然後執行上次停下的 這種模式感覺只有在等待中斷時候才有用,比如sleep 1 不過功耗不是降太多 只有靠外部中斷喚醒或者rtc定時器和看門狗喚醒 因為rtc的鬧鐘中斷是接...