以前使用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,由於...