STM32系统时钟默认设置
“我們一直都說(shuō)STM32有一個(gè)非常復(fù)雜的時(shí)鐘系統(tǒng),然而在原子或者野火的例程中,只要涉及到時(shí)鐘,我們卻只能看到類似的庫(kù)函數(shù)調(diào)用,如RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);這個(gè)僅僅只是起到開啟掛載在APB2線上的USART1時(shí)鐘的作用罷了,APB2的時(shí)鐘頻率是多少我們并不知道”
我們先來(lái)了解一些stm32的時(shí)鐘結(jié)構(gòu)。- 1
- 2
,
這個(gè)圖說(shuō)明了STM32的時(shí)鐘走向,從圖的左邊開始,從時(shí)鐘源一步步分配到外設(shè)時(shí)鐘。?
從時(shí)鐘頻率來(lái)說(shuō),又分為高速時(shí)鐘和低速時(shí)鐘,高速時(shí)鐘是提供給芯片主體的主時(shí)鐘,而低速時(shí)鐘只是提供給芯片中的RTC(實(shí)時(shí)時(shí)鐘)及獨(dú)立看門狗使用。
從芯片角度來(lái)說(shuō),時(shí)鐘源分為內(nèi)部時(shí)鐘與外部時(shí)鐘源 ,內(nèi)部時(shí)鐘是在芯片內(nèi)部RC振蕩器產(chǎn)生的,起振較快,所以時(shí)鐘在芯片剛上電的時(shí)候,默認(rèn)使用內(nèi)部高速時(shí)鐘。而外部時(shí)鐘信號(hào)是由外部的晶振輸入的,在精度和穩(wěn)定性上都有很大優(yōu)勢(shì),所以上電之后我們?cè)偻ㄟ^(guò)軟件配置,轉(zhuǎn)而采用外部時(shí)鐘信號(hào)。
所以,STM32有以下4個(gè)時(shí)鐘源:?
高速外部時(shí)鐘(HSE):以外部晶振作時(shí)鐘源,晶振頻率可取范圍為4~16MHz,我們一般采用8MHz的晶振。?
高速內(nèi)部時(shí)鐘(HSI): 由內(nèi)部RC振蕩器產(chǎn)生,頻率為8MHz,但不穩(wěn)定。?
低速外部時(shí)鐘(LSE):以外部晶振作時(shí)鐘源,主要提供給實(shí)時(shí)時(shí)鐘模塊,所以一般采用32.768KHz。?
低速內(nèi)部時(shí)鐘(LSI):由內(nèi)部RC振蕩器產(chǎn)生,也主要提供給實(shí)時(shí)時(shí)鐘模塊,頻率大約為40KHz。
時(shí)鐘頻率當(dāng)然是可以通過(guò)代碼來(lái)配置的,然而main函數(shù)中我們卻沒(méi)看到配置時(shí)鐘的相關(guān)代碼。這說(shuō)明了我們一直用的是默認(rèn)的設(shè)置,也就是說(shuō),在進(jìn)入main函數(shù)之前時(shí)鐘頻率就已經(jīng)被設(shè)置好了。這時(shí)候,大家應(yīng)該都已經(jīng)想到了,就是stm32的啟動(dòng)文件,startup_stm32f10x_hd.s。于是我們打開這個(gè)文件,會(huì)發(fā)現(xiàn)有這么一塊用匯編寫的代碼。
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInitLDR R0, =SystemInitBLX R0 LDR R0, =__mainBX R0ENDP- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
從這里我們可以看到,我們的程序在進(jìn)入到main函數(shù)之前,先要執(zhí)行systeminit,跳轉(zhuǎn)到這個(gè)函數(shù)的定義。里面的代碼是對(duì)寄存器直接進(jìn)行操作了,我查找了用戶手冊(cè),寄存器的相關(guān)配置說(shuō)明寫在了注釋里面(IDE里面文字設(shè)置為ANSI格式了,直接復(fù)制過(guò)來(lái)會(huì)出現(xiàn)亂碼,大家將就下看看圖片吧)
這里涉及到了兩個(gè)寄存器RCC_CR,與RCC_CFGR,分別是時(shí)鐘控制寄存器與時(shí)鐘配置寄存器,它們的作用顧名思義,就是起到了控制和配置時(shí)鐘的作用。想具體了解寄存器每一位的功能,請(qǐng)查閱用戶手冊(cè)。?
這段代碼實(shí)現(xiàn)了時(shí)鐘的初始化,也就是所謂的默認(rèn)設(shè)置了。?
執(zhí)行完后,我們繼續(xù)往下走
- 1
- 2
- 3
我們可以看到,這里還有一個(gè)函數(shù),看它的命名,顯然就是對(duì)時(shí)鐘進(jìn)行設(shè)置的函數(shù)。?
我們看一下它的實(shí)現(xiàn)過(guò)程。
因?yàn)槲覀儾](méi)有這些宏定義,所以相當(dāng)于執(zhí)行了一個(gè)nop函數(shù)。顯然,在這個(gè)程序中,這個(gè)函數(shù)并沒(méi)有起到改變時(shí)鐘配置的作用,我們用的還是初始化的默認(rèn)配置。?
到這里,關(guān)于stm32系統(tǒng)時(shí)鐘的默認(rèn)設(shè)置就已經(jīng)結(jié)束了。?
對(duì)照著時(shí)鐘樹,我們結(jié)合代碼來(lái)回顧一下。
首先從左端的OSC_OUT和OSC_IN開始,假設(shè)我們外接的是8MHz的晶振,兩個(gè)引腳分別接到外部晶振的兩端。
8MHz的時(shí)鐘遇到了第一個(gè)分頻器PLLXTPRE(HSE divider for PLL entry),在這個(gè)分頻器中,可以通過(guò)寄存器配置,選擇它的輸出。它的輸出時(shí)鐘可以是對(duì)輸入時(shí)鐘的二分頻或不分頻。本例子中,我們選擇不分頻,所以經(jīng)過(guò)PLLXTPRE后,還是了8MHz的時(shí)鐘。
8MHz的時(shí)鐘遇到開關(guān)PLLSRC(PLL entry clock source),我們可以選擇其輸出,輸出為外部高速時(shí)鐘(HSE)或是內(nèi)部高速時(shí)鐘(HSI)。這里選擇輸出為HSI(HSE經(jīng)二分頻后變成了4MHz的時(shí)鐘),接著遇到鎖相環(huán)PLL,具有倍頻作用,在這里我們可以輸入倍頻因子PLLMUL(PLL multiplication factor),經(jīng)過(guò)PLL的時(shí)鐘稱為PLLCLK。倍頻因子我們?cè)O(shè)定為2倍頻,也就是說(shuō),經(jīng)過(guò)PLL之后,我們的時(shí)鐘從原來(lái)4MHz的 HSE變?yōu)?MHz的PLLCLK。
緊接著又遇到了一個(gè)開關(guān)SW,經(jīng)過(guò)這個(gè)開關(guān)之后就是STM32的系統(tǒng)時(shí)鐘(SYSCLK)了。通過(guò)這個(gè)開關(guān),可以切換SYSCLK的時(shí)鐘源,可以選擇為HSI、PLLCLK、HSE。我們選擇為HSI時(shí)鐘,所以SYSCLK就為8MHz了。
PLLCLK在輸入到SW前,還流向了USB預(yù)分頻器,這個(gè)分頻器輸出為USB外設(shè)的時(shí)鐘(USBCLK),在本例子中我們的USB預(yù)分頻系數(shù)為1.5,此時(shí)USBCLK為5.33MHz。
回到SYSCLK,SYSCLK經(jīng)過(guò)AHB預(yù)分頻器,分頻后再輸入到其它外設(shè)。如輸出到稱為HCLK、FCLK的時(shí)鐘,還直接輸出到SDIO外設(shè)的SDIOCLK時(shí)鐘、存儲(chǔ)器控制器FSMC的FSMCCLK時(shí)鐘,和作為APB1、APB2的預(yù)分頻器的輸入端。本例子設(shè)置AHB預(yù)分頻器不分頻,即輸出的頻率為8MHz。
GPIO外設(shè)是掛載在APB2總線上的, APB2的時(shí)鐘是APB2預(yù)分頻器的輸出,而APB2預(yù)分頻器的時(shí)鐘來(lái)源是AHB預(yù)分頻器。因此,把APB2預(yù)分頻器設(shè)置為不分頻,那么我們就可以得到GPIO外設(shè)的時(shí)鐘也等于HCLK,為8MHz了。
APB2的時(shí)鐘為8MHz,ADC預(yù)分頻系數(shù)為2,所以,ADCCLK為4MHz。
STM32的時(shí)鐘系統(tǒng)確實(shí)是很復(fù)雜,不僅有倍頻,分頻,還有一系列的外設(shè)時(shí)鐘開關(guān)。倍頻是考慮到了電磁兼容性,如果外部直接提供一個(gè)72MHz的晶振,太高的震蕩頻率會(huì)給電路板的制作帶來(lái)一定的難度。分頻則是因?yàn)镾TM32既有高速外設(shè),也有低速外設(shè),各外設(shè)的工作頻率不相同,需要分開來(lái)管理。最后,每個(gè)外設(shè)時(shí)鐘還有自己獨(dú)立的開關(guān)(在圖上可以看到,在外設(shè)時(shí)鐘之前需要經(jīng)過(guò)一個(gè)與門,這就是它們的開關(guān))在我們不使用該外設(shè)時(shí),需要把時(shí)鐘關(guān)閉以減少STM32的功耗。
總結(jié)
以上是生活随笔為你收集整理的STM32系统时钟默认设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STM32初识——中断初始化过程(by
- 下一篇: STM32单片机,禁止系统启动时的变量初