STM32F4 時鍾體系


時鍾體系

  給處理器提供一個時鍾信號,能使處理器內部組件同步工作 ,並且和外部設備通信時也能達到同步。根據功耗需求,可以選擇三種不同的時鍾源:
   HSI振盪器時鍾:這個為處理器內部時鍾,能進行簡單控制的洗衣機,熱水器,電飯鍋一般會使用這個時鍾,精度低;
   HSE振盪器時鍾:這是高速外部時鍾,我使用的開發板的高速外部時鍾為8MHz,標准庫函數中的時鍾初始化的默認高速外部時鍾為25MHz,需要更改為8Mhz;
   PLL時鍾: HSE時鍾或HSI時鍾經過PLL后的輸出時鍾,系統運行一般都使用這個時鍾;
  開發板還有兩個低速時鍾分別是:
   32 kHz低速內部RC(LSI RC),用於驅動獨立看門狗。如果看門狗和系統時鍾一個時鍾的話,要是系統出現問題,系統的時鍾信號不工作了,看門狗也會卡死無法正常工作,所以就需要單獨給看門狗一個時鍾源,定時檢查處理器是否正常工作;
   32.768kHz低速外部晶振(LSE晶振),此時鍾是用於系統斷電后,用於RTC實時時鍾的一些操作。

PLL基本組成


  鎖相環路是一種反饋控制電路,簡稱鎖相環(PLL,Phase-Locked Loop),鎖相環通常由鑒相器(PD,Phase Detector)、環路濾波器(LF,Loop Filter)和壓控振盪器(VCO,Voltage Controlled Oscillator)三部分組成。鎖相環的特點是:通過外部輸入的參考信號和控制環路的壓控振盪器的輸入信號的相位差,來得到它們的電壓差,以這個電壓作為誤差電壓來控制振盪器的頻率,使壓控振盪器頻率達到與輸入參考信號頻率按一定比例輸出的頻率,因鎖相環可以實現輸出信號頻率對輸入信號頻率的自動跟蹤,所以鎖相環通常用於閉環跟蹤電路。鎖相環在工作過程中,當輸出信號的頻率成比例地反映輸入信號的頻率時,輸出電壓與輸入電壓保持固定的相位差值,這樣輸出電壓與輸入電壓的相位就被鎖住了。

stm32f4 PLL參數配置


  根據參考芯片手冊107頁中的時鍾樹,大概可以知道需要PLL參數配置需要先選擇HSI時鍾源或HSE時鍾源,根據上圖的標注可以得到如下的公式:

一共有三個倍/分頻因子PLLM、PLLN、PLLP,需要注意不同的芯片,倍頻公式是不一樣的,需要查詢芯片手冊。

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

修改stm32f4xx.h,127行將外部振盪器頻率修改為所使用的外部振盪器頻率,注意需要將該頭文件的只讀權限修改為可讀可寫。

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8     //為方便計算當HSE為8MHz時便修改為8,為25時便修改為25
/* 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 */

  在system_stm32f4xx.c文件中可以修改這三個因子的值,以此來到達自己需要的頻率。上面代碼是將PLL頻率修改為了168MHz,每個因子的值都有一定的取值范圍,具體需要查閱芯片手冊的PLL寄存器說明;

stm32f4 時鍾配置


  從時鍾樹中可以看出,系統時鍾源的選擇有三個,在特殊的應用場景,為了達到最高的能效比,沒有必要使用到PLL,可將HSE、HSI作為系統時鍾源。例如,在智能手表,智能手機鎖屏的情況下,如果使用PLL配置過后輸出的頻率會造成過多的功耗,降低自身的續航能力。因此,PLL在鎖屏下的應用場景並不合適,在保證功能實現的前提下,盡可能降低功耗,可以切換頻率更低的時鍾源提供給系統時鍾。
  從時鍾樹中可以看出,時鍾源選擇完成之后還需要配置AHB,APBx,以此來得到時鍾FCLK(CPU核供給時鍾),HCLK(高速總線時鍾),PCLKx(外設總線時鍾),查看源碼的匯編啟動文件可以發現,匯編代碼設置好了棧、堆、中斷向量表后便跳轉到了系統初始化C語言函數SystemInit(),在這個函數中可以發現其又調用了系統時鍾設置函數SetSysClock(),可以發現對於stm32f4的時鍾設置有如下代碼:

SetSysClock()
{
......
      /* Enable HSE */
      RCC->CR |= ((uint32_t)RCC_CR_HSEON);
      ......
      /* 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->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
.......
}

  從上面代碼可以看出系統默認使用外部振盪器HSE,當HSE響應成功后便可以配置HCLK時鍾,還可以看出stm32f4有兩條外設總線PCLK1,PCLK2,根據時鍾樹可上面的代碼便可以得出SYSCLK=FCLK=HCLK=168MHz,PCLK1=84MHz,PCLK1=42MHz,注意HCLK時鍾是給很多個AHB使用的。
  外設的時鍾在沒有使用的時候一般都是關閉的,因為可以節約功耗,當需要使用的時候就需要將其時鍾打開才能進行初始化配置,在文件stm32f4xx_rcc.c中的最后三分之一中根據函數的注釋可以知道AHB1,AHB2,AHB3,APB1,APB2分別連接了哪些外設,如下AHB1所示:

  可以看出GPIO端口全部都屬於AHB1總線,如需要使用端口A時,需要先打開端口A的時鍾進行才能進行初始化,如下所示

      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

更換時鍾源的代碼

      //選擇PLL作為系統時鍾源
      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_PLL;

      //選擇HSI作為系統時鍾源
      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_HSI;

      //選擇HSE作為系統時鍾源
      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_HSE;

總結

  1.時間配置是很重要的,很多外設都會涉及到時間的計算,如果一開始配置的時間和我們預期的不符合,那將發生很嚴重的錯誤;
  2.時鍾樹需要理解看明白,因為其中涉及了全部外設的時鍾來源,和時鍾配置方法;
  3.使用一個外設時不要忘記,需要打開它的時鍾。

相關下載

鏈接:https://pan.baidu.com/s/10gTR5-5cFMnb9XZZmtxjsQ 
提取碼:nfsj 
復制這段內容后打開百度網盤手機App,操作更方便哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM