STM32筆記 RCC結構與配置流程

2021-08-15 23:01:08 字數 1592 閱讀 2229

以前使用stm32寫程式的時候,使用的都是預設時鐘。因此寫數碼管顯示、a/d測量電壓的時候都沒有去關心rcc時鐘配置這個事情。那時候只知道在配置外設的時候使用gpio_inittypedef或者adc_inittypedef這些結構體對外設進行初始化,以及使用rcc_apb2periphclockcmd或者rcc_adcclkconfig函式對外設的時鐘開啟與配置。

這幾天嘗試使用stm32的usb通訊寫乙個滑鼠,發現一些例程中有關於時鐘配置的**,才注意起這個事情。為此進行了一些學習,並且記錄如下的筆記。

一、rcc的結構

以下是stm32時鐘系統的結構圖:

(lse)、內部rc振盪器提供的高速內部時鐘(hsi)、內部rc振盪器提供的低速內部時鐘(lsi)。看上去rcc的工作過程好像很複雜,其實細看並不然。

舉個例子吧,keil編寫程式是預設的時鐘為72mhz,其實是這麼來的:外部晶振提供

的8mhz(與電路板上的晶振的相關)通過pllxtpre分頻器

後,進入pllsrc選擇開關

,進而通過pllmul鎖相環

進行倍頻(x9)後,為系統提供72mhz的系統時鐘(sysclk)。之後是ahb預分頻器

對時鐘訊號進行分頻,然後為低速外設提供時鐘。

當然,在實際應用中,我們也可以為系統時鐘作其他的設定。譬如把內部高速rc振盪器(hsi rc)二分頻後,通過pllsrc選擇開關進行倍頻而不使用外部晶振作為輸入,hsi也可以直接通過sw選擇開關來提供系統時鐘。

此外,stm32還提供了乙個時鐘監視系統(css),用於監視高速外部時鐘(hse)的工作狀態。倘若hse失效,會自動切換(高速內部時鐘)hsi作為系統時鐘的輸入。

二、rcc配置流程

1、將rcc暫存器恢復為預設值   rcc_deinit

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

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

4、設定ahb時鐘    rcc_hclkconfig

5、設定高速apb時鐘    rcc_pclk2config

6、設定低速apb時鐘    rcc_pclk1config

7、設定pll鎖相環    rcc_pllconfig

8、開啟pll鎖相環    rcc_pllcmd

9、等待pll鎖相環工作    while(rcc_getflagstatus(rcc_flag_pllrdy)==reset)

10、設定系統時鐘    rcc_sysclkconfig

11、判斷pll是否為系統時鐘    while(rcc_getsysclksource()!=0x08)

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

以上步驟只是舉個例子。根據rcc的工作過程,查閱參考手冊與庫函式的手使用冊可以自己進行的配置。

使用**再舉乙個例子吧

[cpp]view plain

copy

void

rcc_configuration(

void

)    

stm32筆記 RCC時鐘實驗

stm32f103rbt6,包含的啟動 是 stm32f10x.s include mytype.h gpioa8是 led0 define gpioa crl vu32 0x40000000 0x10000 0x0800 0x00 volatile unsigned long define gpi...

STM32筆記記錄

串列埠記錄 stm32有好幾個串列埠。比如說stm32f103zet6有5個串列埠,串列埠1的引腳對應的io為pa9,pa10.pa9,pa10預設功能是gpio,所以當pa9,pa10引腳作為串列埠1的tx,rx引腳使用的時候,那就是埠復用。復用埠初始化有幾個步驟 1 gpio埠時鐘使能。要使用到...

STM32筆記 ADC DMA方式

adc流程,首先adc採集乙個訊號 訊號範圍大都為0 3.3v,ps 3.3v可通過更改vref暫存器修改 每隔相同時間菜一次數值傳送到乙個可變16位數中,下面是我們的陣列定義 io uint16 t adc convertedvalue 定義該16位數用來傳輸資料,原因是我們使用的12位ad,由於...