STM32學習筆記之時鐘分析(硬件設計(535)&keil(476)&Cortex-M3(171)&PCB(334)很有見解)

STM32學習筆記之時鐘分析http://www.cnblogs.com/heiyue/p/7231350.html

本文結合網上的兩篇時鐘分析文章,並結合本人的理解來分析STM32的時鐘系統。

衆所周知,一個微控制器或處理器的運行必須要依賴週期性的時鐘脈衝來驅動,通常是通過外接晶振來實現的。在學習單片機(51系列,AVR系列,PIC系列)的過程中,只要設定了外接晶振,我們就只關心的時序圖,無需再進行時鐘的配置,而STM32微控制器的時鐘樹則是可配置的,其時鐘輸入源與最終達到外設處的時鐘速率不再有固定的關係,本文將來詳細解析STM32微控制器的時鐘樹。

在官方提供的STM32參考手冊或數據手冊中,提供瞭如下的時鐘樹結構圖:

爲了方便分析,簡化爲如下的時鐘樹,

  由圖可知:STM32主要有5個時鐘源,分別爲HSI、HSE、LSI、LSE、PLL,如灰藍色如示,而PLL是由鎖相環電路倍頻得到PLL時鐘。從上到下分析,分別 爲:

  1. HSI是高速內部時鐘,內置RC振盪器,頻率爲8MHz;
  2. HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率範圍爲4MHz~16MHz,一般接8MHz石英晶振;
  3. LSE是低速外部時鐘,接頻率爲32.768kHz的石英晶體,主要提供一個精確的時鐘源一般作爲RTC時鐘使用;
  4. LSI是低速內部時鐘,RC振盪器,頻率爲40kHz。它供獨立看門狗IWDG使用,另外它還可以被選擇爲實時時鐘RTC的時鐘源。另外,實時時鐘RTC的時鐘源還可以選擇LSE,或者是HSE的128分頻。RTC的時鐘源通過RTCSEL[1:0]來選擇;
  5. PLL爲鎖相環倍頻輸出,其時鐘輸入源可選擇爲HSI/2、HSE或者HSE/2,倍頻可選擇爲2~16倍,但是其輸出頻率最大不得超過72MHz。 

 

  系統時鐘SYSCLK,它是供STM32中絕大部分部件工作的時鐘源。系統時鐘可選擇爲PLL輸出、HSI或者HSE。系統時鐘最大頻率爲72MHz,它通過AHB分頻器分頻後送給各模塊使用,AHB分頻器可選擇1、2、4、8、16、64、128、256、512分頻。其中AHB分頻器輸出的時鐘送給5大模塊使用: 

  1. 送給AHB總線、內核、內存和DMA使用的HCLK時鐘;
  2. 通過8分頻後送給Cortex的系統定時器時鐘;
  3. 直接送給Cortex的空閒運行時鐘FCLK;
  4. 送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設使用(PCLK1,最大頻率36MHz),另一路送給定時器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器2、3、4使用;
  5. 送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設使用(PCLK2,最大頻率72MHz),另一路送給定時器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻後送給ADC模塊使用。ADC分頻器可選擇爲2、4、6、8分頻。 

  另外:

  (1)STM32中有一個全速功能的USB模塊,其串行接口引擎需要一個頻率爲48MHz的時鐘源。該時鐘源只能從PLL輸出端獲取,可以選擇爲1.5分頻或者1分頻,也就是,當需要使用USB模塊時,PLL必須使能,並且時鐘頻率配置爲48MHz或72MHz。
  (2)STM32還可以選擇一個時鐘信號輸出到MCO腳(PA8)上,可以選擇爲PLL輸出的2分頻、HSI、HSE、或者系統時鐘。

 

  在STM32處理器,對應每一模塊,都需要爲其配置時鐘源,我們將官方提供的時鐘樹再進行細化,就得到如下的時鐘樹,其中圖中的標號分別爲:1:內部低速振盪器(LSI,40Khz);2:外部低速振盪器(LSE,32.768Khz);3:外部高速振盪器(HSE,3-25MHz);4:內部高速振盪器(HSI,8MHz);5:PLL輸入選擇位;6:RTC時鐘選擇位;7:PLL1分頻數寄存器;8:PLL1倍頻寄存器;9:系統時鐘選擇位;10:USB分頻寄存器;11:AHB分頻寄存器;12:APB1分頻寄存器;13:AHB總線;14:APB1外設總線;15:APB2分頻寄存器;16:APB2外設總線;17:ADC預分頻寄存器;18:ADC外設;19:PLL2分頻數寄存器;20:PLL2倍頻寄存器;21:PLL時鐘源選擇寄存器;22:獨立看門狗設備;23:RTC設備


 

  假設我們要設置位於APB2控制的GPIO外設時鐘,則我們得到的時鐘軌跡應該是:3-->5-->7-->21-->8-->9-->11-->15-->16。即:首先(3)是外部的3-25MHz(前文已假設爲8MHz)輸入;通過(5)PLL選擇位預先選擇後續PLL分支的輸入時鐘(假設選擇外部晶振);設置(7)外部晶振的分頻數(假設1分頻);選擇(21)PLL倍頻的時鐘源(假設選擇經過分頻後的外部晶振時鐘);對於8,設置(8)PLL倍頻數(假設9倍頻);選擇(9)系統時鐘源(假設選擇經過PLL倍頻所輸出的時鐘);設置(11)AHB總線分頻數(假設1分頻);設置(15)APB2總線分頻數(假設1分頻);時鐘到達APB2總線(16)。

GPIO設備的最大驅動時鐘速率(各個條件已在上述要點中假設):

1)   由3所知晶振輸入爲8MHz,由5——21知PLL的時鐘源爲經過分頻後的外部晶振時鐘,並且此分頻數爲1分頻,因此首先得出PLL的時鐘源爲:8MHz / 1 = 8MHz。

2)   由8、9知PLL倍頻數爲9,且將PLL倍頻後的時鐘輸出選擇爲系統時鐘,則得出系統時鐘爲 8MHz * 9 = 72MHz。

3)   時鐘到達AHB預分頻器,由11知時鐘經過AHB預分頻器之後的速率仍爲72MHz。

4)   時鐘到達APB2預分頻器,由15經過APB2預分頻器後速率仍爲72MHz。

5)   時鐘到達APB2總線外設。

因此STM32的APB2總線外設,所能達到的最大速率爲72MHz。

 

接下來從程序的角度分析時鐘樹的設置,程序清單如下:

複製代碼
void RCC_Configuration(void)
{
    ErrorStatusHSEStartUpStatus;                                    (1)
    RCC_DeInit();                                                    (2)
    RCC_HSEConfig(RCC_HSE_ON);                                        (3)
    HSEStartUpStatus= RCC_WaitForHSEStartUp();                        (4if(HSEStartUpStatus== SUCCESS)                                    (5)
    {
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                            (6)
        RCC_PCLK2Config(RCC_HCLK_Div1);                                (7)
        RCC_PCLK1Config(RCC_HCLK_Div2);                                (8)
        FLASH_SetLatency(FLASH_Latency_2);                            (9)
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        (10)
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);        (11)
        RCC_PLLCmd(ENABLE);                                            (12while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);            (13)
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                    (14while(RCC_GetSYSCLKSource() != 0x08);                        (15)
    }
} 
複製代碼

即:
(1)定義一個ErrorStatus類型的變量HSEStartUpStatus;
(2)將時鐘樹復位至默認設置;
(3)開啓HSE晶振;
(4)等待HSE晶振起振穩定,並將起振結果保存至HSEStartUpStatus變量中;
(5)判斷HSE晶振是否起振成功(假設成功了,進入if內部);
(6)設置HCLK時鐘爲SYSCLK的1分頻;
(7)設置PLCK2時鐘爲SYSCLK的1分頻;
(8)設置PLCK1時鐘爲SYSCLK的2分頻;
(11)選擇PLL輸入源爲HSE時鐘經過1分頻,並進行9倍頻;
(12)使能PLL輸出;
(13)等待PLL輸出穩定;
(14)選擇系統時鐘源爲PLL輸出;
(15)等待系統時鐘穩定;

注:(1)PLLCLK表示PLL鎖相環的輸出時鐘,SYSCLK表示系統時鐘,HCLK表示AHB總線的時鐘,PCLK1表示APB1總線的時鐘,PCLK2則表示APB2總線的時鐘

(2)以上是ST官方所提供的STM32時鐘樹配置函數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章