<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32F207是如何將25M晶振時鐘轉換為120M系統主頻時鐘的?

冬至子 ? 來源:知曉編程 ? 作者:Firefly ? 2023-07-11 16:00 ? 次閱讀

01

時鐘系統介紹

圖片

▲時鐘系統專業名詞縮寫

時鐘系統關鍵組成部分

01

內部高速時鐘(HSI)

HSI時鐘信號可以通過內部16MHZ的RC振蕩器產生,可以直接用于系統時鐘或者用于PLL輸入。

HSI的RC振蕩器的優勢是: 在最小成本(沒有外部器件)情況下提供一個時鐘源。它的啟動速度要比HSE晶體振蕩器更快,但是即使校準頻率后,它的精度仍然小于外部晶體振蕩器或陶瓷諧振器。

02

外部高速時鐘(HSE)

外部高速時鐘信息(HSE)可以通過兩個時鐘源產生:

① 外部晶體/陶瓷諧振器

② 外部用戶時鐘

圖片

▲兩種時鐘源接入示意圖

03

主鎖相環時鐘(PLL)

STM32F2xx具有兩個PLL

① 主要的PLL通過HSE或HSI提供時鐘,并且有兩個輸出時鐘;

② 專用的PLL(PLLI2S)被用于產生一個精確的時鐘去實現高質量音頻效果在I2S接口;

圖片

HSE/M*N/P得到PLL時鐘

關于PLL鎖相環說明

圖片

從1處輸入,3處輸出是1的N倍。

3處除以N又作為輸入,當1和2的頻率一樣,就鎖定了。(之所以圖上是xN,因為從2看向3的)

04

低速外部時鐘(LSE)

LSE是一個32.768KHZ低速外部晶振或陶瓷諧振器。

它的優點:提供低速但是高精度時鐘給RTC外設,為時鐘/日歷或其他時間應用。

05

低速內部時鐘(LSI)

LSI RC作為一個低速時鐘源,它可以運行在停止和待機模式中給獨立看門狗(IWDG)和自動喚醒(AWU)。它的時鐘頻率在32MHZ左右。

02

代碼分析

時鐘初始化代碼在system_stm32f2xx.c文件中,大部分時候我們不需要修改時鐘代碼的,各個總線的頻率我們可以在文件頭看到。

=============================================================================
  *=============================================================================
  *        Supported STM32F2xx device revision    | Rev B and Y
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 120000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 120000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 25000000
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 25
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 240
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 5
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 3
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | ON
  *-----------------------------------------------------------------------------
  *        Instruction cache                      | ON
  *-----------------------------------------------------------------------------
  *        Data cache                             | ON
  *-----------------------------------------------------------------------------
  *        Require 48MHz for USB OTG FS,          | Enabled
  *        SDIO and RNG clock                     |
  *-----------------------------------------------------------------------------
  *=============================================================================
  ******************************************************************************

在文件開始定義的有系統時鐘頻率的全局變量SystemCoreClock,其他地方需要時鐘頻率,可以直接使用該變量。

uint32_t SystemCoreClock = 120000000;

時鐘配置從SystemInit函數執行,調用SystemInit的在匯編文件中startup_stm32f2xx.s(Keil編譯環境)。

IMPORT  __main
    LDR     R0, =SystemInit
    BLX     R0
    LDR     R0, =__main
    BX      R0
    ENDP

在這里說明一下文檔版本的問題:

圖片

STM32F20X_User_manual的V7版和V8版對比圖

上述兩圖的區別是系統最大時鐘從120MHZ變成了168MHZ,我的理解是同樣是STM32F20X,ST由于技術進步或其他,使得新版STM32F207芯片超頻支持168MHZ。

下面我們主要分析SystemCoreClock的120M時鐘怎么從一個外部25MHZ的HSE得到的。

圖片

我們要從25MHZ的外部時鐘得到120M的系統時鐘,需要上圖中標注的重要4點:

1、使能HSE

2、選擇HSE作為主PLL的輸入時鐘

3、主PLL倍頻后得到120MHZ時鐘

4、系統時鐘選擇主PLL時鐘輸出作為系統時鐘

我們找到對應的代碼

1、使能HSE

/* Enable HSE */
  RCC- >CR |= ((uint32_t)RCC_CR_HSEON);

在RCC_CR寄存器(RCCclock control register RCC時鐘控制器)中,有打開HSE的控制位

圖片

2、選擇HSE作為主PLL的輸入時鐘

/* Configure the main PLL */
RCC- >PLLCFGR = PLL_M | (PLL_N < < 6) | (((PLL_P > > 1) -1) < < 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q < < 24);

RCC_PLLCFGR_PLLSRC_HSE就是配置HSE作為主PLL的輸入時鐘

3、主PLL倍頻后得到120MHZ時鐘

/* Configure the main PLL */
RCC- >PLLCFGR = PLL_M | (PLL_N < < 6) | (((PLL_P > > 1) -1) < < 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q < < 24);

4、配置主PLL作為系統時鐘的輸入時鐘

/* Select the main PLL as system clock source */
RCC- >CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC- >CFGR |= RCC_CFGR_SW_PL

對于主PLL的配置寄存器,在RCC_PLLCFGR寄存器中有說明

圖片

整理后得知f(out)=f(in)* N / M / P

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25
#define PLL_N      240


/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

這樣就獲得了120M時鐘

注意:

圖片

PLL_M大于等于2且小于等于63

圖片

PLL_N大于等于64且小于等于432

圖片

PLL_P只能是2、4、6、或8

但2對應0,4對應1,6對應2,8對應3。

ST并沒有使用if或case語句判斷,因為對應的數據除以2減去1就是寄存器這兩位的值,所以可以按照下面這樣寫,這種寫法值得我們學習。

(((PLL_P > > 1) -1) < < 16)

其他外設的時鐘配置時

/* HCLK = SYSCLK / 1*/
RCC- >CFGR |= RCC_CFGR_HPRE_DIV1;


/* PCLK2 = HCLK / 2*/
RCC- >CFGR |= RCC_CFGR_PPRE2_DIV2;


/* PCLK1 = HCLK / 4*/
RCC- >CFGR |= RCC_CFGR_PPRE1_DIV4;

** 備 注 **

** 時鐘中斷**

圖片

可以配置外部晶振出錯時的中斷,還有RCC中斷,因此我們可以在外部時鐘出問題時,切換為內部時鐘,不至于整個系統掛掉。具體見ST給的官方代碼。

無源晶振不起振

沒有程序,無源晶振是不起振的,需要配置RCC時鐘控制寄存器的HSEON位打開或關閉HSE振蕩器。

關于APB和PCLK

F207是時鐘圖沒有顯示PCLK1和PCLK2,應該就是APB1和APB2

應該指的是一個PCLK應該是PeripheralClock的簡稱,看F105手冊

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 陶瓷諧振器
    +關注

    關注

    0

    文章

    22

    瀏覽量

    9500
  • PLL電路
    +關注

    關注

    0

    文章

    91

    瀏覽量

    6303
  • STM32F207
    +關注

    關注

    0

    文章

    9

    瀏覽量

    6541
  • rc振蕩器
    +關注

    關注

    3

    文章

    44

    瀏覽量

    9469
  • 時鐘系統
    +關注

    關注

    1

    文章

    86

    瀏覽量

    11442
收藏 人收藏

    評論

    相關推薦

    STM32F030K6T6和STM32F103C8T6的換成25M的可以嗎?

    大神們,如果 把STM32F030K6T6 和 STM32F103C8T6 的換成25M的,可以嗎?
    發表于 04-26 06:12

    雷達用25M、50M、100M高穩

    大家好我們是高穩的生產廠家,可提供雷達用25M、50M、100M高穩
    發表于 08-26 13:33

    stm32f439外部HSE不起,求大神解答

    stm32f439新做了塊板子,發現外部高速不起,但是能下載程序,程序的stm32內部的時鐘
    發表于 10-19 15:09

    STM32時鐘配置問題

    使用STM32,之前用的外部無源25M,現在硬件上改成了有源的25M
    發表于 04-21 20:29

    stm32F207 APB1輸出最大時鐘給TIMER3問題

    ”。AHB:即HPRE[3:0],PLL作為系統時鐘輸出為120M)(2)現象:配置TIMER3,120分頻,溢出中斷次數為1000,中斷產生周期是1ms(APB1,未分頻)。(3)疑
    發表于 12-11 09:01

    為什么LAN8720A的25M不起呢?

    STM32F407加LAN8720A以太網通信,原理圖都是按照開發板的原理圖設計的, 為什么LAN8720A的25M不起呢。LAN87
    發表于 10-16 04:35

    STM32F207時鐘系統如何將25M時鐘轉換為120M系統主頻時鐘

    在前幾天的文章《原理解析》中介紹了如何產生時鐘的,板子使用的是25M無源
    發表于 08-02 06:34

    STM32F429的時鐘走向

    是:2~63,一般取外部的頻率(比如 25M ,設置為 25)。注意,這個分頻系數,對主
    發表于 08-09 06:25

    STM32F103芯片外接去除使用內部HSI時鐘

    STM32F103使用內部的配置及64M主頻異常的解決方法為了節省空間與成本,
    發表于 08-12 07:51

    STM32F1最大的主頻時鐘

    ??STM32F1官方默認及大部分場合下都是使用8MHz的外部,STM32F1最大的主頻時鐘
    發表于 08-12 06:57

    時鐘跑的到底是多少M

    新到一家公司后,有個項目要用到STM32F207Vx單片機,找到網上的例子照貓畫虎的寫了幾個例子,比如ADC,可是到了ADC多通道轉換的時候就有點傻眼了,這里面的時鐘跑的到底是多少M
    發表于 08-12 08:09

    stm32外部時鐘源8M如何修改成12M

    stm32外部時鐘源8M換成12M
    發表于 08-12 08:30

    STM32F107的時鐘設置如何倍頻到72M呢 精選資料分享

    STM32F107的時鐘設置STM32的庫函數好像只有外部8M倍頻到72M,現在用的板子外部25M
    發表于 08-13 06:17

    如何將25M時鐘轉換為120M系統主頻時鐘

    時鐘系統有哪些關鍵組成部分?STM32F207時鐘系統如何將
    發表于 09-26 08:39

    gd32f303外部使用25M,會對rt thread中的定時器精度造成影響嗎?

    大家好因為項目需要gd32f303外部使用25M,不知道會不會對rt thread中的定時器精度造成影響?如果造成影響應該如何解決?大家好,咨詢個問題,因為功能需要gd32
    發表于 06-14 09:40
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>