之前在系統應用中都是直接用的void systeminit (void)函式進行系統時鐘的初始化,從來沒有考慮怎樣進行時鐘初始化的細節,但是突然硬體時鐘無法起振了,所以才考慮利用系統內部,stm32內部提供了乙個8m的內部時鐘,不是很準確,但是可以用。如果還是按照呼叫系統時鐘的方法,程式執行起來會很慢,因為systeminit函式執行之後如果硬體晶振無法啟動,就是自動切換到hsi時鐘啟動,所以只能用8m的時鐘,不能用pll進行倍頻。在網上找到一串內部晶振初始化的程式,先貼上。
void rcc_configuration(void)通過這個**在對比systeminit函式對系統初始化的整個過程就清楚許多。我們先看這個hsi作為時鐘源的初始化過程,首先呼叫rcc_deinit()將外設rcc暫存器設定為預設值,就是將系統時鐘從新設定為預設方式,這樣就將系統恢復為hsi時鐘,然後使能hsi時鐘(這個使能其實有點多餘,因為去掉之後也根本沒有作用,但是對於if(1)
//select pll as system clock source
rcc_sysclkconfig(rcc_sysclksource_pllclk);
//wait till pll is used as system clock source
// 0x00:hsi
// 0x04:hse
// 0x08:pll
while(rcc_getsysclksource() != 0x08)
}}
systeminit函式的理解具有一定的作用
),然後系統等待時鐘的啟動完畢,hsi時鐘啟動之後就開始進入系統其他時鐘匯流排的設定,前面是flash的設定(具體含義不太明白),在系統設定中也有相同的設定,然後設定hclk=sysclk,系統時鐘的分頻係數,然後分別設定plck2、plck1,這三個就是我們的系統時鐘、apb2時鐘、apb1時鐘的分頻係數的設定,然後設定pll,設定鎖相環時鐘**以及倍頻係數,這裡設定的是hsi二分頻作為時鐘源,16倍頻,設定之後對pll鎖相環進行使能,等待pll啟動完成,設定鎖相環作為時鐘源,最後等待設定成功。這就是整個設定的過程。而
systeminit()函式的設定過程與上面的一致,只是在程式直觀表達上不太容易理解,下面就是
systeminit函式的**我們可以通過第乙個設定**來理解這個系統時鐘的初始化過程。
void systeminit (void)
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...