STM32学习笔记1----STM32F429系统时钟
FreeRTOS任務(wù)基本知識(shí)
1.系統(tǒng)時(shí)鐘
????在 STM32F429 中,有 5 個(gè)最重要的時(shí)鐘源,為 HSI、HSE、LSI、LSE、PLL。其中 PLL實(shí)際是分為三個(gè)時(shí)鐘源,分別為主 PLL 和 I2S 部分專用 PLLI2S 和 SAI 部分專用 PLLSAI。
從時(shí)鐘頻率來(lái)分可以分為高速時(shí)鐘源和低速時(shí)鐘源,在這 5 個(gè)中HSI,HSE以及PLL是高速時(shí)鐘,LSI 和 LSE 是低速時(shí)鐘。從來(lái)源可分為外部時(shí)鐘源和內(nèi)部時(shí)鐘源,外部時(shí)鐘源就是從外部通過(guò)接晶振的方式獲取時(shí)鐘源,其中 HSE 和 LSE 是外部時(shí)鐘源,其他的是內(nèi)部時(shí)鐘源。下面我們看看 STM32F429 的這 5 個(gè)時(shí)鐘源,我們講解順序是按圖中紅圈標(biāo)示的順序:
①、LSI 是低速內(nèi)部時(shí)鐘,RC 振蕩器,頻率為 32kHz 左右。供獨(dú)立看門(mén)狗和自動(dòng)喚醒單元使用。
②、LSE 是低速外部時(shí)鐘,接頻率為 32.768kHz 的石英晶體。這個(gè)主要是 RTC 的時(shí)鐘源。
③、HSE 是高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為 4MHz~26MHz。我們的開(kāi)發(fā)板接的是 25M 的晶振。 HSE 也可以直接做為系統(tǒng)時(shí)鐘或者 PLL 輸入。
④、HSI 是高速內(nèi)部時(shí)鐘,RC 振蕩器,頻率為 16MHz。可以直接作為系統(tǒng)時(shí)鐘或者用作 PLL輸入。
⑤、PLL 為鎖相環(huán)倍頻輸出。STM32F4 有三個(gè) PLL:
這里我們著重看看主 PLL 時(shí)鐘第一個(gè)高速時(shí)鐘輸出 PLLP 的計(jì)算方法。圖 4.3.1.2 是主 PLL 的時(shí)鐘圖。
從圖 4.3.1.2 可以看出。主 PLL 時(shí)鐘的時(shí)鐘源要先經(jīng)過(guò)一個(gè)分頻系數(shù)為 M 的分頻器,然后經(jīng)過(guò)倍頻系數(shù)為 N 的倍頻器出來(lái)之后還需要經(jīng)過(guò)一個(gè)分頻系數(shù)為 P(第一個(gè)輸出 PLLP)或者 Q(第二個(gè)輸出 PLLQ)的分頻器分頻之后,最后才生成最終的主 PLL 時(shí)鐘。
例如我們的外部晶振選擇 25MHz。同時(shí)我們?cè)O(shè)置相應(yīng)的分頻器 M=25,倍頻器倍頻系數(shù) N=360,分頻器分頻系數(shù) P=2,那么主 PLL 生成的第一個(gè)輸出高速時(shí)鐘 PLLP 為:
PLL=25MHz * N/ (M * P)=25MHz* 360 / (25 * 2) = 180MHz
如果我們選擇HSE為PLL時(shí)鐘源,同時(shí)SYSCLK時(shí)鐘源為PLL,那么SYSCLK時(shí)鐘為 180MHz。這對(duì)于我們后面的實(shí)驗(yàn)都是采用這樣的配置。
時(shí)鐘樹(shù)E標(biāo)號(hào)處: 這里我們指的是以太網(wǎng) PTP 時(shí)鐘,AHB 時(shí)鐘,APB2 高速時(shí)鐘,APB1 低速時(shí)鐘。這些時(shí)鐘都是來(lái)源于 SYSCLK 系統(tǒng)時(shí)鐘。其中以太網(wǎng) PTP 時(shí)鐘是使用系統(tǒng)時(shí)鐘。AHB,APB2 和 APB1 時(shí)鐘是經(jīng)過(guò) SYSCLK 時(shí)鐘分頻得來(lái)。這里大家記住,AHB最大時(shí)鐘為180MHz, APB2高速時(shí)鐘最大頻率為90MHz,而APB1低速時(shí)鐘最大頻率為 45MHz。
Several prescalers are used to configure the AHB frequency, the
high-speed APB (APB2) and the low-speed APB (APB1) domains. The
maximum frequency of the AHB domain is 180 MHz. The maximum allowed
frequency of the high-speed APB2 domain is 90 MHz. The maximum allowed
frequency of the low-speed APB1 domain is 45 MHz
HAL 庫(kù)的 SystemInit 函數(shù)并沒(méi)有像標(biāo)準(zhǔn)庫(kù)的 SystemInit 函數(shù)一樣進(jìn)行時(shí)鐘的初始化配置。HAL庫(kù)的 SystemInit 函數(shù)除了打開(kāi) HSI 之外,沒(méi)有任何時(shí)鐘相關(guān)配置,所以使用 HAL 庫(kù)我們必須編寫(xiě)自己的時(shí)鐘配置函數(shù)。首先我們打開(kāi)工程模板看看我們?cè)诠こ蘏YSTEM分組下面定義的sys.c文件中的時(shí)鐘初始化函數(shù) Stm32_Clock_Init 的內(nèi)容:
//時(shí)鐘設(shè)置函數(shù)
// VCO 頻率 Fvco=Fs*(plln/pllm);
//系統(tǒng)時(shí)鐘頻率 Fsys=Fvco/pllp=Fs*(plln/(pllmpllp));
// USB,SDIO,RNG 等的時(shí)鐘頻率 Fusb=Fvco/pllq=Fs(plln/(pllmpllq));
//Fs:PLL 輸入時(shí)鐘頻率,可以是 HSI,HSE 等.
//plln:主 PLL 倍頻系數(shù)(PLL 倍頻),取值范圍:64~432.
//pllm:主 PLL 和音頻 PLL 分頻系數(shù)(PLL 之前的分頻),取值范圍:2~63.
//pllp:系統(tǒng)時(shí)鐘的主 PLL 分頻系數(shù)(PLL 之后的分頻),取值范圍:2,4,6,8.(僅限這 4 個(gè)值!)
//pllq:USB/SDIO/隨機(jī)數(shù)產(chǎn)生器等的主 PLL 分頻系數(shù)(PLL 之后的分頻),取值范圍:2~15.
//外部晶振為 25M 的時(shí)候,推薦值:plln=360,pllm=25,pllp=2,pllq=8.
//得到:Fvco=25(360/25)=360Mhz
// Fsys=360/2=180Mhz
// Fusb=360/8=45Mhz
//返回值:0,成功;1,失敗
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
HAL_StatusTypeDef ret = HAL_OK;
RCC_OscInitTypeDef RCC_OscInitStructure;
RCC_ClkInitTypeDef RCC_ClkInitStructure;
__HAL_RCC_PWR_CLK_ENABLE(); //使能 PWR 時(shí)鐘
//下面這個(gè)設(shè)置用來(lái)設(shè)置調(diào)壓器輸出電壓級(jí)別,以便在器件未以最大頻率工作
//時(shí)使性能與功耗實(shí)現(xiàn)平衡,此功能只有 STM32F42xx 和 STM32F43xx 器件有,
__HAL_PWR_VOLTAGESCALING_CONFIG(
PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //時(shí)鐘源為 HSE
RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打開(kāi) HSE
RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON; //打開(kāi) PLL
RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL 時(shí)鐘源為 HSE
RCC_OscInitStructure.PLL.PLLM=pllm;
RCC_OscInitStructure.PLL.PLLN=plln;
RCC_OscInitStructure.PLL.PLLP=pllp;
RCC_OscInitStructure.PLL.PLLQ=pllq;
ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);
if(ret!=HAL_OK) while(1);
ret=HAL_PWREx_EnableOverDrive(); //開(kāi)啟 Over-Driver 功能
if(ret!=HAL_OK) while(1);
//選中 PLL 作為系統(tǒng)時(shí)鐘源并且配置 HCLK,PCLK1 和 PCLK2
RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;
RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;
RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;
ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);
if(ret!=HAL_OK) while(1);
}
第一個(gè)參數(shù) ClockType 配置說(shuō)明我們要配置的是SYSCLK,HCLK,PCLK1 和PCLK2 四個(gè)時(shí)鐘。
第二個(gè)參數(shù) SYSCLKSource 配置選擇系統(tǒng)時(shí)鐘源為 PLL。
第三個(gè)參數(shù) AHBCLKDivider 配置 AHB 分頻系數(shù)為 1。
第四個(gè)參數(shù) APB1CLKDivider 配置 APB1 分頻系數(shù)為 4。
第五個(gè)參數(shù) APB2CLKDivider 配置 APB2 分頻系數(shù)為 2。
根據(jù)我們?cè)谥骱瘮?shù)中調(diào)用 Stm32_Clock_Init(360,25,2,8)時(shí)候設(shè)置的入口參數(shù)值,我們可以計(jì)算出,PLL 時(shí)鐘為 PLLCLK=HSEN/MP=25MHz360/(252)=180MHz,
同時(shí)我們選擇系統(tǒng)時(shí)鐘源為 PLL,所以系統(tǒng)時(shí)鐘 SYSCLK=180MHz。AHB 分頻系數(shù)為 1,故其頻率為HCLK=SYSCLK/1=180MHz。APB1 分頻系數(shù)為 4,故其頻率為 PCLK1=HCLK/4=45MHz。APB2分頻系數(shù)為 2,故其頻率為 PCLK2=HCLK/2=180/2=90MHz。最后我們總結(jié)一下通過(guò)調(diào)用函數(shù)
Stm32_Clock_Init(360,25,2,8)之后的關(guān)鍵時(shí)鐘頻率值:
SYSCLK(系統(tǒng)時(shí)鐘) =180MHz
PLL 主時(shí)鐘 =180MHz
AHB 總線時(shí)鐘(HCLK=SYSCLK/1) =180MHz
APB1 總線時(shí)鐘(PCLK1=HCLK/4) =45MHz
APB2 總線時(shí)鐘(PCLK2=HCLK/2) =90MHz
從STM32F4的內(nèi)部時(shí)鐘樹(shù)可知,
(1)當(dāng)APB1和APB2分頻數(shù)為1的時(shí)候,TIM1、TIM8 ~ TIM11的時(shí)鐘為APB2的時(shí)鐘,TIM2~ TIM7、TIM12~TIM14的時(shí)鐘為APB1的時(shí)鐘;
(2)而如果APB1和APB2分頻數(shù)不為1,那么TIM1、TIM8~ TIM11的時(shí)鐘為APB2的時(shí)鐘的兩倍,TIM2~ TIM7、TIM12~ TIM14的時(shí)鐘為APB1的時(shí)鐘的兩倍。即HCLK/4*2 =90MHz
總結(jié)
以上是生活随笔為你收集整理的STM32学习笔记1----STM32F429系统时钟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EXSI的安装配置和使用
- 下一篇: java信息管理系统总结_java实现科