日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

STM32学习笔记1----STM32F429系统时钟

發(fā)布時(shí)間:2024/1/1 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32学习笔记1----STM32F429系统时钟 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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(PLL)由 HSE 或者 HSI 提供時(shí)鐘信號(hào),并具有兩個(gè)不同的輸出時(shí)鐘。 第一個(gè)輸出 PLLP用于生成高速的系統(tǒng)時(shí)鐘(最高 180MHz) 第二個(gè)輸出 PLLQ 為 48M 時(shí)鐘,用于 USB OTG FS 時(shí)鐘,隨機(jī)數(shù)發(fā)生器的時(shí)鐘和 SDIO 時(shí)鐘。
  • 第一個(gè)專用 PLL(PLLI2S)用于生成精確時(shí)鐘,在 I2S 和 SAI1上實(shí)現(xiàn)高品質(zhì)音頻性能。其 中,N 是用于 PLLI2S vco 的倍頻系數(shù),其取值范圍是:192~432;R 是 I2S 時(shí)鐘的分頻系數(shù),其取值范圍是:2~7;Q 是 SAI 時(shí)鐘分頻系數(shù),其取值范圍是:2~15;P 沒(méi)用到。
  • 第二個(gè)專用PLL(PLLSAI)同樣用于生成精確時(shí)鐘,用于 SAI1 輸入時(shí)鐘,同時(shí)還為 LCD_TFT 接口提供精確時(shí)鐘。其中,N 是用于PLLSAI vco 的倍頻系數(shù),其取值范圍是:192~432; Q 是 SAI 時(shí)鐘分頻系數(shù),其取值范圍是:2~15;R 是 LTDC時(shí)鐘的分頻系數(shù),其取值范 圍是:2~7;P 沒(méi)用到。
  • 這里我們著重看看主 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);
    }

    //選中PLL作為系統(tǒng)時(shí)鐘源并且配置HCLK,PCLK1和PCLK2RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//系統(tǒng)時(shí)鐘源 PLLRCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB 分頻系數(shù)為 1RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1 分頻系數(shù)為 4RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2 分頻系數(shù)為 2ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同時(shí)設(shè)置FLASH延時(shí)周期為5WS,也就是6個(gè)CPU周期。

    第一個(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

    TIM3_Init(5000-1,9000-1); //定時(shí)器3初始化,定時(shí)器時(shí)鐘為90M,分頻系數(shù)為9000-1,//所以定時(shí)器3的頻率為90M/9000=10K,自動(dòng)重裝載為5000-1,那么定時(shí)器周期就是500ms

    總結(jié)

    以上是生活随笔為你收集整理的STM32学习笔记1----STM32F429系统时钟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。