STM32F4時(shí)鐘系統(tǒng)初探(一)
在開始之前先解釋幾個(gè)名詞:
HSI: High Speed Internal clock, 高速內(nèi)部時(shí)鐘, STM32F429xx默認(rèn)為16MHz.
HSE: High Speed External clock, 高速外部時(shí)鐘, 最大可接受50MHz時(shí)鐘(可外接最大的晶振為26MHz).
LSI: Low Speed Internal clock, 低速內(nèi)部時(shí)鐘, 32KHz.
LSE: Low Speed External clock, 低速外部時(shí)鐘, 一般為32.768KHz.
PLL: Phase-Locked loops, 鎖相環(huán), 用于倍頻時(shí)鐘.
VCO: Voltage-Controlled Oscillator, 壓控振蕩器, PLL的組成部分.
AHB: Advanced High Performance Bus, 高性能總線, 用于高性能模塊之間的連接, 如CPU, DMA.
APB: Advanced Peripheral Bus, 外設(shè)總線, 用于連接低速設(shè)備, 如UART, Timer.
STM32有兩條APB總線, APB1和APB2, APB2的工作頻率大于APB1.
APB2最高工作頻率為84MHz, APB1最高工作頻率為42MHz, AHB最高工作頻率同系統(tǒng)時(shí)鐘, 168MHz.
SYSCLK: 系統(tǒng)時(shí)鐘.可被HSI, HSE, Main PLL直接驅(qū)動(dòng), 最大168MHz.
HCLK: CPU, AHB, DMA, 存儲(chǔ)器的時(shí)鐘, 經(jīng)AHB預(yù)分頻器得到.
PCLK1: APB1時(shí)鐘.
PCLK2: APB2時(shí)鐘.
下圖是STM32時(shí)鐘樹的一部分, 這里注要研究一下STM32F4系統(tǒng)時(shí)鐘和PLL配置相關(guān)的東西.
從圖中可以看出,HSI和HSE可以直接向SYSCLK提供時(shí)鐘(紅線), 它們經(jīng)過一個(gè)預(yù)分頻器/M(綠色方框)后向PLL提供時(shí)鐘, 同時(shí)這個(gè)時(shí)鐘(藍(lán)線)也提供給PLLI2S和PLLSAI(圖中未標(biāo)出).
從VCO倍頻出來后的時(shí)鐘一路經(jīng)過預(yù)分頻器 /P 就是PLLCLK(紫色),可以提供給系統(tǒng)時(shí)鐘SYSCLK.
一路經(jīng)過預(yù)分頻器 /Q 后就是PLL48CK(黃色線),這個(gè)時(shí)鐘提供給USB OTG FS, SDIO, 一般這個(gè)時(shí)鐘需要固定48MHz.
水綠色方框里的xN 是VCO倍頻的倍數(shù),VCO輸出的頻率為HSE/HSI的頻率經(jīng)過 /M 分頻后的數(shù)值乘以N.
接下來看一下ST固件庫中提供的PLL配置函數(shù):
12345
voidRCC_PLLConfig(uint32_tRCC_PLLSource,uint32_tPLLM,uint32_tPLLN,uint32_tPLLP,uint32_tPLLQ);
RCC_PLLSource為PLL的時(shí)鐘源選擇, 可選擇為RCC_PLLSource_HSE或者RCC_PLLSource_HSI.
這里的PLLM, PLLN, PLLP, PLLQ便指的是上述的幾個(gè)分頻器的分頻因子.
并且這些分頻因子取值是有限制如下:
2 <= PLLQ <= 15
2 <= PLLM <= 63
192 <= PLLN <= 432
PLLP 只能是2, 4, 6, 8其中之一.
其中PLLN就是PLL的倍頻倍數(shù)N.
并且, PLL之后得到的頻率不得超過器件的限制頻率.
舉個(gè)實(shí)際的例子, 外部晶振為8MHz, 我們想讓CPU運(yùn)行于168MHz, 該怎么配置?
因?yàn)镻LLM最小只能是2, 所以選擇PLLM為2.
這里8MHz的HSE被PLLM二分頻后只有4MHz了.
PLLP最小也只能是2, 我們所需要的SYSCK為168MHz, 所以從VCO出來的頻率為168 * 2 = 336MHz.
則倍頻倍數(shù)N為336 / 4 = 84, 所以PLLN為84.
PLLQ是USB OGT FS的時(shí)鐘, 固定為48MHz, 所以預(yù)分頻因子為336 / 48 =7.
則PLL配置函數(shù)應(yīng)該為:
1
RCC_PLLConfig(RCC_PLLSource_HSE,2,84,2,7);
當(dāng)然只使用這一句就不可能讓PLL工作的, 還需要配合其它配置才行.
(全文完)