<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      STM32時鐘體系、SetSysClock、PLL、時鐘源

      V1.0 2024年7月12日



      一、時鐘體系

      給單片機提供一個時鐘信號(一個非常穩(wěn)定的頻率信號),使單片機各內(nèi)部組件同步工作,并且在和外部設(shè)備通信時是也能達到同步。

      動態(tài)調(diào)整運行頻率,就可以控制性能與功耗!

      STM32 的時鐘系統(tǒng)由外部晶振、PLL(鎖相環(huán))和內(nèi)部 RC 振蕩器組成。時鐘系統(tǒng)主要提供了處理器時鐘,以及可選的外設(shè)時鐘和RTC模塊時鐘。

      其作用包括:

      • 為處理器提供準確的時鐘信號,保證處理器、總線和外設(shè)的正確工作。
      • 通過 PLL 的倍頻功能,產(chǎn)生多種頻率的時鐘信號,滿足不同外設(shè)的時鐘需求。
      • 通過時鐘系統(tǒng)提供的時鐘分頻器、預(yù)分頻器等功能,進一步調(diào)整時鐘頻率,以適應(yīng)不同的應(yīng)用場景。

      時鐘系統(tǒng)在 STM32 的系統(tǒng)中扮演著關(guān)鍵的角色,它的穩(wěn)定性和精度對整個系統(tǒng)的性能影響很大。

      1、參考手冊

      STM32F4xx 中文參考手冊.pdf 第 106 頁

      2、時鐘源3種

      a.可以使用三種不同的時鐘源來驅(qū)動系統(tǒng)時鐘 (SYSCLK),CPU 運行的頻率為 168MHz:

      HSI 振蕩器時鐘(16MHz),也就是高速內(nèi)部時鐘,一般來說很少用,因為精度沒有外部高速時鐘那么高。

      HSE 振蕩器時鐘,也就是高速外部時鐘,GECM4 開發(fā)板 8MHz。

      主 PLL (PLL) 時鐘

      b.器件具有以下兩個次級時鐘源:

      32 kHz 低速內(nèi)部 RC (LSI RC),該 RC 用于驅(qū)動獨立看門狗,也可選擇提供給 RTC 用于停機/待機模式下的自動喚醒。

      32.768 kHz 低速外部晶振(LSE 晶振),用于驅(qū)動 RTC 時鐘 (RTCCLK)對于每個時鐘源來說,在未使用時都可單獨打開或者關(guān)閉,以降低功耗。

      3、時鐘樹

      時鐘樹就是關(guān)注時鐘源和時鐘的流向,嵌入式系統(tǒng)中的模塊和外設(shè)工作都以時鐘為基準。有了時鐘樹,就有了時鐘域。嵌入式中除了內(nèi)核,還有各個單元,每個單元工作在不同的時鐘頻率下,給每個單元提供不同的時鐘。

      實際應(yīng)用中根據(jù)需要配置外設(shè)的時鐘控制開關(guān),選擇需要的時鐘頻率,并可關(guān)閉不用外設(shè)時鐘。

      image

      stm32對每個外設(shè)的時鐘都設(shè)置了開關(guān),讓用戶可以精確地控制,關(guān)閉不需要的設(shè)備,達到節(jié)省供電的目的。如果不用的就完全關(guān)閉,盡可能降低芯片功耗,以下以GPIO作為舉例

      1. 降低功耗:STM32設(shè)計允許用戶精確控制各個外設(shè)的電源管理,包括時鐘的開關(guān)。當不使用某個外設(shè)時,通過關(guān)閉其時鐘可以顯著減少功耗。因此,GPIO的時鐘默認是關(guān)閉的,以節(jié)省電力。
      2. 激活功能:使能GPIO的時鐘是激活其功能的第一步。沒有時鐘,GPIO的寄存器無法讀寫,從而無法配置GPIO的工作模式(如輸入、輸出、上拉、下拉等)或讀取輸入狀態(tài)。
      3. 同步操作硬件時鐘為GPIO提供了必要的時序和同步信號,確保GPIO的操作與系統(tǒng)其他部分協(xié)調(diào)一致。這對于維持數(shù)據(jù)的穩(wěn)定傳輸和處理非常重要。
      4. 支持高級功能:對于某些高級功能,如復(fù)用功能(GPIO復(fù)用為其他外設(shè)功能)、中斷功能等,可能還需要額外使能AFIO(Alternate Function Input Output)的時鐘。這是因為這些功能涉及到更復(fù)雜的內(nèi)部信號路由和管理。

      實際上,在這里面還涉及到一個時鐘門控技術(shù),而這又涉及到同步電路,我們都知道(默認你們都知道)在同步電路中總是有一個時鐘控制。這里就不贅述了,回去翻翻一本叫《數(shù)字電子技術(shù)基礎(chǔ)》的書,可以找到答案。

      4. 時鐘詳解

      查看<<中文參考手冊 第六章, RCC寄存器>>

      HSE時鐘

      HSE:High Speed External Clock signal,即高速的外部時鐘。

      來源:有源晶振(1-50M)、無源晶振(4-26M)

      控制:RCC_CR 時鐘控制寄存器的位16:HSEON控制

      HSI時鐘

      HSI:Low Speed Internal Clock signal,即高速的內(nèi)部時鐘。

      來源:芯片內(nèi)部,大小為16M,當HSE故障時,系統(tǒng)時鐘會自動切換到HSI,直到HSE啟動成功。

      控制: RCC_CR 時鐘控制寄存器的位0:HSION控制

      鎖相環(huán)時鐘

      鎖相環(huán)時鐘:PLLCLK

      來源:HSI、HSE。由PLLSRC位配置。(0HSI 1HSE)

      HSE或者HSI先經(jīng)過一個分頻因子M進行分頻,然后再經(jīng)過一個倍頻因子N,然后再經(jīng)過一個分頻因子P,最后成為鎖相環(huán)時鐘PLLCLK = (HSE/M) * N / P = 25/25 * 336 / 2 = 168M

      控制: RCC_PLLCFGR :RCC PLL 配置寄存器

      PLL48CK:USB_FS(USB全速接口)、RANG(隨機發(fā)發(fā)生器)、SDIO提供時鐘

      image

      HSI精度不高.

      PLLM 分頻因子

      PLLN 倍頻

      PLLP分配

      系統(tǒng)時鐘

      縮寫:SYSCLK,最高為168M。

      來源:HSI、HSE,PLLCLK。

      控制: RCC_CFGR 時鐘配置寄存器的SW位( 一般配置為10 選擇PLL作為系統(tǒng)時鐘)

      image

      HCLK時鐘

      HCLK:AHB高速總線時鐘,最高為168M。為AHB總線的外設(shè)提供時鐘、為Cortex系統(tǒng)定時器提供時鐘(SysTick, 一般會8分頻)、為內(nèi)核提供時鐘(FCLK 自由運行時鐘)。

      AHB為advanced high-performance bus。

      來源:系統(tǒng)時鐘分頻得到。

      控制: RCC_CFGR 時鐘配置寄存器的HPRE位

      PCLK1時鐘

      PCLK1:APB1低速總線時鐘,最高為42M,為APB1總線的外設(shè)提供時鐘。

      來源:HCLK分頻得到,通常配置為4分頻

      控制: RCC_CFGR 時鐘配置寄存器的PPRE1位

      PCLK2時鐘

      PCLK1:APB高速總線時鐘,最高為84M,為APB2總線的外設(shè)提供時鐘。

      來源:HCLK分頻得到,通常配置為2分頻。

      控制: RCC_CFGR 時鐘配置寄存器的PPRE2位

      RTC時鐘

      RTC:為芯片內(nèi)部的RTC提供時鐘。

      來源:HSE_RTC(HSE分頻得到)、LSE(外部32.768KHZ的晶體提供)、LSI(32KHZ)。

      控制: RCC備份域控制寄存器RCC_BDCR:RTCSEL位控制

      獨立看門狗時鐘:

      IWDGCLK,由LSI提供

      image

      I2S時鐘:

      由外部的引腳I2S_CKIN或者PLLI2SCLK提供。

      以太網(wǎng)PHY時鐘:

      407沒有集成PHY,只能外接PHY芯片,比如LAN8720,那PHY時鐘就由外部的PHY芯片提供,大小為50M。

      USB PHY時鐘:

      407的USB沒有集成PHY,要想實現(xiàn)USB高速傳輸,只能外接PHY芯片,比如USB33000。那USB PHY時鐘就由外部的PHY芯片提供。

      MCO時鐘輸出

      MCO:把控制器的時鐘通過外部的引腳輸出,可以外外部的設(shè)備提供時鐘。MCO1為PA8,MCO2為PC9。

      控制: RCC_CFGR 時鐘配置寄存器的MCOX的PREx位

      image

      系統(tǒng)時鐘配置函數(shù)SetSysClock()

      打開匯編文件

      image

      找到時鐘初始化

      image

      image

      設(shè)置系統(tǒng)時鐘

      將下面這一段拷貝出, 進行裁剪:

      /**
        * @brief  Configures the System clock source, PLL Multiplier and Divider factors, 
        *         AHB/APBx prescalers and Flash settings
        * @Note   This function should be called only once the RCC clock configuration  
        *         is reset to the default reset state (done in SystemInit() function).   
        * @param  None
        * @retval None
        */
      static void SetSysClock(void)
      {
      #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
      /******************************************************************************/
      /*            PLL (clocked by HSE) used as System clock source                */
      /******************************************************************************/
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
        
        /* Enable HSE */
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);
       
        /* Wait till HSE is ready and if Time out is reached exit */
        do
        {
          HSEStatus = RCC->CR & RCC_CR_HSERDY;
          StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
      
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
          HSEStatus = (uint32_t)0x01;
        }
        else
        {
          HSEStatus = (uint32_t)0x00;
        }
      
        if (HSEStatus == (uint32_t)0x01)
        {
          /* Select regulator voltage output Scale 1 mode */
          RCC->APB1ENR |= RCC_APB1ENR_PWREN;
          PWR->CR |= PWR_CR_VOS;
      
          /* HCLK = SYSCLK / 1*/
          RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
      
      #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
          /* PCLK2 = HCLK / 2*/
          RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
          
          /* PCLK1 = HCLK / 4*/
          RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
      #endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */
      
      #if defined (STM32F401xx)
          /* PCLK2 = HCLK / 2*/
          RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
          
          /* PCLK1 = HCLK / 4*/
          RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
      #endif /* STM32F401xx */
         
          /* Configure the main PLL */
          RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                         (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
      
          /* Enable the main PLL */
          RCC->CR |= RCC_CR_PLLON;
      
          /* Wait till the main PLL is ready */
          while((RCC->CR & RCC_CR_PLLRDY) == 0)
          {
          }
         
      #if defined (STM32F427_437xx) || defined (STM32F429_439xx)
          /* Enable the Over-drive to extend the clock frequency to 180 Mhz */
          PWR->CR |= PWR_CR_ODEN;
          while((PWR->CSR & PWR_CSR_ODRDY) == 0)
          {
          }
          PWR->CR |= PWR_CR_ODSWEN;
          while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
          {
          }      
          /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
          FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
      #endif /* STM32F427_437x || STM32F429_439xx  */
      
      #if defined (STM32F40_41xxx)     
          /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
          FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
      #endif /* STM32F40_41xxx  */
      
      #if defined (STM32F401xx)
          /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
          FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
      #endif /* STM32F401xx */
      
          /* Select the main PLL as system clock source */
          RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
          RCC->CFGR |= RCC_CFGR_SW_PLL;
      
          /* Wait till the main PLL is used as system clock source */
          while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
          {
          }
        }
        else
        { /* If HSE fails to start-up, the application will have wrong clock
               configuration. User can add here some code to deal with this error */
        }
      #elif defined (STM32F411xE)
      #if defined (USE_HSE_BYPASS) 
      /******************************************************************************/
      /*            PLL (clocked by HSE) used as System clock source                */
      /******************************************************************************/
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
        
        /* Enable HSE and HSE BYPASS */
        RCC->CR |= ((uint32_t)RCC_CR_HSEON | RCC_CR_HSEBYP);
       
        /* Wait till HSE is ready and if Time out is reached exit */
        do
        {
          HSEStatus = RCC->CR & RCC_CR_HSERDY;
          StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
      
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
          HSEStatus = (uint32_t)0x01;
        }
        else
        {
          HSEStatus = (uint32_t)0x00;
        }
      
        if (HSEStatus == (uint32_t)0x01)
        {
          /* Select regulator voltage output Scale 1 mode */
          RCC->APB1ENR |= RCC_APB1ENR_PWREN;
          PWR->CR |= PWR_CR_VOS;
      
          /* HCLK = SYSCLK / 1*/
          RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
      
          /* PCLK2 = HCLK / 2*/
          RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
          
          /* PCLK1 = HCLK / 4*/
          RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
      
          /* Configure the main PLL */
          RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                         (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
          
          /* Enable the main PLL */
          RCC->CR |= RCC_CR_PLLON;
      
          /* Wait till the main PLL is ready */
          while((RCC->CR & RCC_CR_PLLRDY) == 0)
          {
          }
      
          /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
          FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
      
          /* Select the main PLL as system clock source */
          RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
          RCC->CFGR |= RCC_CFGR_SW_PLL;
      
          /* Wait till the main PLL is used as system clock source */
          while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
          {
          }
        }
        else
        { /* If HSE fails to start-up, the application will have wrong clock
               configuration. User can add here some code to deal with this error */
        }
      #else /* HSI will be used as PLL clock source */
        /* Select regulator voltage output Scale 1 mode */
        RCC->APB1ENR |= RCC_APB1ENR_PWREN;
        PWR->CR |= PWR_CR_VOS;
        
        /* HCLK = SYSCLK / 1*/
        RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
        
        /* PCLK2 = HCLK / 2*/
        RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
        
        /* PCLK1 = HCLK / 4*/
        RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
        
        /* Configure the main PLL */
        RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | (PLL_Q << 24); 
        
        /* Enable the main PLL */
        RCC->CR |= RCC_CR_PLLON;
        
        /* Wait till the main PLL is ready */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }
        
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
        
        /* Select the main PLL as system clock source */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= RCC_CFGR_SW_PLL;
        
        /* Wait till the main PLL is used as system clock source */
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
        {
        }
      #endif /* USE_HSE_BYPASS */  
      #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */  
      }
      

      啟動外部晶振, HSE高速的外部時鐘

      image

      image


      配置預(yù)分頻器

      RCC_CFGR

      image

          /* HCLK = SYSCLK / 1 AHB高速總線的分配因子 1分頻*/
          RCC->CFGR |= RCC_CFGR_HPRE_DIV1; 
          /* PCLK2 = HCLK / 2 APB2總線的分頻因子 2分頻*/
          RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;    
          /* PCLK1 = HCLK / 4 APB1總線的分頻因子 4分頻*/
          RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
      

      image-20240711210830924

      image

      注釋掉系統(tǒng)默認的系統(tǒng)時鐘匯編代碼, 系統(tǒng)默認使用HSI 16 MHz, 我們可以自定義的配置系統(tǒng)時鐘函數(shù)

      image
      image

      #include "bsp_clkconfig.h"
      
      void User_SetSysClock(void)
      {
        /******************************************************************************/
        /*            PLL (clocked by HSE) used as System clock source                */
        /******************************************************************************/
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
      
        /* 復(fù)位RCC的所有寄存器 */
        RCC_DeInit();
      
        /* Enable HSE */
        /* 使能HSE 《中文參考手冊 6.3.1 RCC時鐘控制寄存器》 ((uint32_t)0x00010000) */
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);
      
        /* Wait till HSE is ready and if Time out is reached exit */
        /* 等待HSE啟動穩(wěn)定,如果超時則退出  由RCC_CR HSERDY控制*/
        do
        {
          HSEStatus = RCC->CR & RCC_CR_HSERDY;
          StartUpCounter++;
        } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
      
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
          HSEStatus = (uint32_t)0x01;
        }
        else
        {
          HSEStatus = (uint32_t)0x00;
        }
      
        /* HSE 啟動成功 */
        if (HSEStatus == (uint32_t)0x01)
        {
          /* Select regulator voltage output Scale 1 mode */
          /* 選擇電壓調(diào)節(jié)器的模式為1  和電源控制器PWR有關(guān) PWR_CR寄存器VOS位, 實現(xiàn)功耗平衡*/
          RCC->APB1ENR |= RCC_APB1ENR_PWREN;
          PWR->CR |= PWR_CR_VOS;
      
          /* HCLK = SYSCLK / 1 AHB高速總線的分頻因子*/
          RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
          /* PCLK2 = HCLK / 2 APB2總線的分頻因子*/
          RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
          /* PCLK1 = HCLK / 4 APB1總線的分頻因子*/
          RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
      
          /**
           * Configure the main PLL
           * 配置主PLL
           * PLL_M分頻因子應(yīng)該和外部時鐘HSE一致, 分頻后為1
           * 因此N為336 P為2(/2得到168M), Q是7(得到48Mhz)
           * RCC_PLLCFGR_PLLSRC_HSE 選擇鎖相環(huán)時鐘來源, 這里選擇HSE 8M
           *
           * 可以設(shè)置N最大為432 《中文參考手冊 6.3.2 》, 可超頻到216M, 原168M
           */
          //    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
          //                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
      
          RCC->PLLCFGR = 25 | (336 << 6) | (((2 >> 1) - 1) << 16) |
                         (RCC_PLLCFGR_PLLSRC_HSE) | (7 << 24);
      
          /* Enable the main PLL */
          /* 使能主PLL  因為使能后無法修改! */
          RCC->CR |= RCC_CR_PLLON;
      
          /* Wait till the main PLL is ready */
          /* 等待主PLL穩(wěn)定 */
          while ((RCC->CR & RCC_CR_PLLRDY) == 0)
          {
          }
      
          /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
          /* 配置FLASH預(yù)取指(將指令提前準備好),指令緩存,數(shù)據(jù)緩存,等待周期(速度越快等待周期越長, 見中文參考手冊3.8.1)
           * 配置flash外設(shè)的acr寄存器
           */
          FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;
      
          /* Select the main PLL as system clock source */
          /* 選擇主PLL時鐘作為系統(tǒng)時鐘 */
          RCC->CFGR &= (uint32_t)((uint32_t) ~(RCC_CFGR_SW));
          RCC->CFGR |= RCC_CFGR_SW_PLL;
      
          /* Wait till the main PLL is used as system clock source */
          /* 確保主PLL時鐘選為系統(tǒng)時鐘, 若設(shè)置成功, 系統(tǒng)會硬件置1 《中文參考手冊 6.3.3 》*/
          while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL)
            ;
          {
          }
        }
        else
        { /* If HSE fails to start-up, the application will have wrong clock
               configuration. User can add here some code to deal with this error */
          /* HSE 啟動失敗,在這里添加啟動失敗的處理代碼 */
        }
      }
      
      

      若使用系統(tǒng)自帶的系統(tǒng)配置文件, 需要做HSE修改, 默認是25M

      image

      系統(tǒng)時鐘配置流程

      二、PLL

      2.1 概述

      PLL(Phase Locked Loop): 為鎖相回路或鎖相環(huán),用來統(tǒng)一整合時鐘信號,使高頻器件正常工作,如內(nèi)存的存取資料等。

      PLL基于振蕩器中的反饋技術(shù),許多電子設(shè)備要正常工作,通常需要外部的輸入信號與內(nèi)部的振蕩信號同步。

      一般的晶振由于工藝與成本原因,做不到很高的頻率,而在需要高頻應(yīng)用時,由相應(yīng)的器件VCO,實現(xiàn)轉(zhuǎn)成高頻,但并不穩(wěn)定,故利用鎖相環(huán)路就可以實現(xiàn)穩(wěn)定且高頻的時鐘信號。

      2.2 基本組成

      鎖相環(huán)路是一種反饋控制電路,簡稱鎖相環(huán)(PLL,Phase-Locked Loop)。鎖相環(huán)的特點是:利用外部輸入的參考信號控制環(huán)路內(nèi)部振蕩信號的頻率和相位。因鎖相環(huán)可以實現(xiàn)輸出信號頻率對輸入信號頻率的自動跟蹤,所以鎖相環(huán)通常用于閉環(huán)跟蹤電路。

      鎖相環(huán)在工作的過程中,當輸出信號的頻率與輸入信號的頻率相等時,輸出電壓與輸入電壓保持固定的相位差值,即輸出電壓與輸入電壓的相位被鎖住,這就是鎖相環(huán)名稱的由來。鎖相環(huán)通常由鑒相器(PD,Phase Detector)、環(huán)路濾波器(LF,Loop Filter)和壓控振蕩器(VCO,Voltage Controlled Oscillator)三部分組成。

      鎖相環(huán)的工作原理是檢測輸入信號和輸出信號的相位差,并將檢測出的相位差信號通過鑒相器轉(zhuǎn)換成電壓信號輸出,經(jīng)低通濾波器濾波后形成壓控振蕩器的控制電壓,對振蕩器輸出信號的頻率實施控制,再通過反饋通路把振蕩器輸出信號的頻率、相位反饋到鑒相器。

      鎖相環(huán)在工作過程中,當輸出信號的頻率成比例地反映輸入信號的頻率時,輸出電壓與輸入電壓保持固定的相位差值,這樣輸出電壓與輸入電壓的相位就被鎖住了。

      image

      2.3 類比說明

      我們剛開始學車的時候,在道路上開車,眼睛就好像一個鑒相器,負責發(fā)現(xiàn)車行駛的方向(反饋)和前方的路(輸入)是否有差別,把差別輸入大腦進行判斷,然后指揮雙手旋轉(zhuǎn)方向盤,旋轉(zhuǎn)方向盤的動作轉(zhuǎn)換成車的行駛方向,如下圖所示。

      image

      我們通過這么一個閉環(huán)過程不斷地調(diào)節(jié)方向盤,保證車行駛在正道上。

      2.3 相位差[拓展]

      兩個頻率相同的交流電相位的差叫做相位差,或者叫做相差,又稱“相角差”、“相差”、“周相差”或“位相差”。兩個作周期變化的物理量的相之間的差值。它為正值時稱前者超前于后者,為負值時則滯后于后者。它為零或π的偶數(shù)倍時,兩物理量同相;為π的奇數(shù)倍時則稱反相

      這兩個頻率相同的交流電,可以是兩個交流電流,可以是兩個交流電壓,可以是兩個交流電動勢,也可以是這三種量中的任何兩個。兩個同頻率正弦量的相位差就等于初相之差。是一個不隨時間變化的常數(shù)。也可以是一個元件上的電流與電壓的相位變化。任意一個正弦量y = Asin(wt+ j0)的相位為(wt+ j0),兩個同頻率正弦量的相位差(與時間t無關(guān))。設(shè)第一個正弦量的初相為 j01,第二個正弦量的初相為 j02,則這兩個正弦量的相位差為j12 = j01 - j02。

      image

      2.4 PLL配置參數(shù)

      image

      不同的芯片,倍頻(頻率翻倍)公式是不一樣的,需要查詢芯片手冊!

      三、SystemInit系統(tǒng)初始化函數(shù)

      1.其實第一個執(zhí)行的文件是匯編文件

      • 棧的初始化,提供函數(shù)調(diào)用的時候進行現(xiàn)場保護和現(xiàn)場恢復(fù)
      • 堆的初始化,為申請內(nèi)存提供空間,調(diào)用malloc
      • 執(zhí)行Reset_Handler,意思說上電復(fù)位后執(zhí)行的動作
      • 執(zhí)行SystemInit函數(shù)
      • 跳轉(zhuǎn)到main函數(shù)

      2.初始化Flash接口,更新PLL系統(tǒng)頻率

      /**
        * @brief  Setup the microcontroller system
        *         Initialize the Embedded Flash Interface, the PLL and update the
        *         SystemFrequency variable.
        * @param  None
        * @retval None
        */
      void SystemInit(void)
      {
          ................
              /* Configure the System clock source, PLL Multiplier and Divider factors,
           AHB/APBx prescalers and Flash settings ----------------------------------*/
              SetSysClock();
      
          ................
      
      }
      

      3.調(diào)用SetSysClock函數(shù)設(shè)置PLL時鐘,然后進行分頻

      /**
        * @brief  Configures the System clock source, PLL Multiplier and Divider factors,
        *         AHB/APBx prescalers and Flash settings
        * @Note   This function should be called only once the RCC clock configuration  
        *         is reset to the default reset state (done in SystemInit() function).   
        * @param  None
        * @retval None
        */
      static void SetSysClock(void)
      {
         .....................
             /* Configure the main PLL */
             RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
             (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
         .....................
      }
      

      system_stm32f4xx.c文件有以下倍頻(PLL_N)與分頻(PLL_M、PLL_P)因子:

      /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
      #define PLL_M      8     //(記得修改為8)
      /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
      #define PLL_Q      7
      
      #if defined (STM32F40_41xxx)
      #define PLL_N      336
      /* SYSCLK = PLL_VCO / PLL_P */
      #define PLL_P      2
      #endif /* STM32F40_41xxx */
      

      由于官方的代碼是使用外部高速晶振25MHz,GEC-M4開發(fā)板是使用外部高速晶振8MHz,所以PLL的倍頻因子要進行修改,只修改PLL_M為8

      4.閱讀system_stm32f4xx.c文件的頭部注釋

       *=============================================================================
       *=============================================================================
       *                    Supported STM32F40xxx/41xxx devices
       *-----------------------------------------------------------------------------
       *        System Clock source                    | PLL (HSE)
       *-----------------------------------------------------------------------------
       *        SYSCLK(Hz)                             | 168000000
       *-----------------------------------------------------------------------------
       *        HCLK(Hz)                               | 168000000
       *-----------------------------------------------------------------------------
       *        AHB Prescaler                          | 1
       *-----------------------------------------------------------------------------
       *        APB1 Prescaler                         | 4
       *-----------------------------------------------------------------------------
       *        APB2 Prescaler                         | 2
       *-----------------------------------------------------------------------------
       *        HSE Frequency(Hz)                      | 25000000   粵嵌開發(fā)板外部晶振是8MHz,我們要將25MHz修改為8MHz
       *-----------------------------------------------------------------------------
       *        PLL_M                                  | 25
       *-----------------------------------------------------------------------------
       *        PLL_N                                  | 336
       *-----------------------------------------------------------------------------
       *        PLL_P                                  | 2
       *-----------------------------------------------------------------------------
       *        PLL_Q                                  | 7
       *-----------------------------------------------------------------------------
       *        PLLI2S_N                               | NA
       *-----------------------------------------------------------------------------
       *        PLLI2S_R                               | NA
       *-----------------------------------------------------------------------------
       *        I2S input clock                        | NA
       *-----------------------------------------------------------------------------
       *        VDD(V)                                 | 3.3
       *-----------------------------------------------------------------------------
       *        Main regulator output voltage          | Scale1 mode
       *-----------------------------------------------------------------------------
       *        Flash Latency(WS)                      | 5
       *-----------------------------------------------------------------------------
       *        Prefetch Buffer                        | ON
       *-----------------------------------------------------------------------------
       *        Instruction cache                      | ON
       *-----------------------------------------------------------------------------
       *        Data cache                             | ON
       *-----------------------------------------------------------------------------
       *        Require 48MHz for USB OTG FS,          | Disabled
       *        SDIO and RNG clock                     |
       *-----------------------------------------------------------------------------
       *=============================================================================
      

      去掉stm32f4xx.h的只讀屬性

      image

      接著修改stm32f4xx.h以下內(nèi)容,行127將外部晶振頻率值修改為8MHz。

      #if !defined  (HSE_VALUE)
        #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
      #endif /* HSE_VALUE */
      

      最后按照PLL的運算公式,最終得到輸出頻率為168MHz。

      image

      #注意事項

      1.在《STM32F4xx中文參考手冊》 P117頁,PLL_M、PLL_N、PLL_P,這三個參數(shù)都有一定的范圍限制,詳細如下:

      2≤ PLL_M ≤63
      192≤ PLL_N ≤432
      PLL_P:2、4、6、8
      

      四、時鐘源

      在特殊的應(yīng)用場景,為了達到最高的能效比,沒有必要使用到PLL,可將HSE、HSI作為系統(tǒng)時鐘源。例如,在智能手表鎖屏的情況下,如果使用PLL配置過后輸出的頻率會造成過多的功耗,降低自身的續(xù)航能力;同時要維持計步與測量心率功能。因此,PLL在鎖屏下的應(yīng)用場景并不合適,在保證功能實現(xiàn)的前提下,盡可能降低功耗,可以切換頻率更低的時鐘源提供給系統(tǒng)時鐘。

      image

      1.選擇PLL作為系統(tǒng)時鐘源

      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_PLL;
      
      或
      
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);      	
      

      2.選擇HSI作為系統(tǒng)時鐘源

      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_HSI;
      
      或
      
      RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); 	
      

      3.選擇HSE作為系統(tǒng)時鐘源

      ```c	              
      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_HSE;
      
      或
      
      RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); 	
      ```
      

      五、應(yīng)用場景

      調(diào)節(jié) CPU 的運行頻率,來控制系統(tǒng)的性能與功耗。比較典型的例子就是說手機/筆記本電腦都有高性能模式、平衡模式、低性能模式。

      image

      image

      六、寄存器邊界地址

      詳見《STM32F4xx中文參考手冊》的P52 ~ P54頁,部分展示如下:

      image

      參考文章

      • 溫子祺筆記
      • 野火STM32庫開發(fā)實戰(zhàn)指南
      posted @ 2024-07-16 00:14  舟清颺  閱讀(1741)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 一本大道卡一卡二卡三乱码全集资源| 亚洲AV永久天堂在线观看| 国产精品男女爽免费视频| 成人无码潮喷在线观看| 欧美gv在线| av永久天堂一区| 中文字幕日韩人妻一区| 日韩一区二区三区不卡片| 无码成人一区二区三区| 免费国产好深啊好涨好硬视频| 国产精品揄拍一区二区久久 | 99在线精品免费视频| 护士张开腿被奷日出白浆| 国产又黄又爽又不遮挡视频| 成码无人AV片在线电影网站| 一本一道av无码中文字幕麻豆| 麻豆一区二区三区香蕉视频| 陆丰市| 亚洲精品一区二区三区在| 久久精品不卡一区二区| 免费观看欧美猛交视频黑人| 亚洲国产综合精品2020| 久久人人97超碰爱香蕉| 成人午夜在线观看日韩| 免费观看羞羞视频网站| 亚洲悠悠色综合中文字幕| 亚洲一本二区偷拍精品| 四虎精品视频永久免费| 激情六月丁香婷婷四房播| 亚洲综合一区二区三区不卡| 日韩va中文字幕无码电影| 欧美v国产v亚洲v日韩九九| 国产91久久精品成人看| 一区二区三区国产不卡| 宝贝腿开大点我添添公口述视频 | 少妇精品亚洲一区二区成人| 日韩精品成人一区二区三区| 一区二区三区av天堂| 中文字幕日韩有码第一页| 国产精品日韩av在线播放| 五月丁香激激情亚洲综合|