在前面幾節講的都是 GPIO 的功能,本章我們會講解如何修改和配置 CPU 的主頻,了解 iMX6ULL 的時鐘系統。 15.1 i.MX6ULL 時鐘系統 iMX6ULL 的系統主頻為 528MHz,有些型號可以跑到 696MHz,但是默認情況下 iMX6ULL 的主頻為396MHz。我們想要讓 iMX6ULL 運行時候達到最大性能,就需要將主頻上調至最大 528MHz,或者更大,其它的外設時鐘也要設置到 NXP 官方推薦的值。 更多關于芯片的時鐘可以查閱 《IMX6ULL 參考手冊.pdf》的第 10 章“Chapter 10 Clock and PowerManagement”和第 18 章“Chapter 18 Clock Controller Module (CCM)”,這兩章有詳細的講解。 系統時鐘 我們打開核心板原理圖,搜索“RTC_XTALI”即可看到如圖 15.1.1 內容: 這里我們可以看到有兩個晶振。32.768KHz 的晶振是 RTC(實時時鐘)的時鐘源。24MHz 晶振是 CPU 內核及其他外設的時鐘源。 PPL(Phase Locked Loop)時鐘源 iMX6ULL 系列外設所需要的時鐘源,都是由 24MHz 晶振倍頻產生的,一共有 7 組,如圖 15.1.2 所示: PPL1(ARM_PLL):這個 PPL 供內核使用,可編程倍頻器,最高可達 1.3GHz。注意,此頻率高于芯片支持的最大頻率 1.0 GHz。 PPL2(System_PLL 或 528_PLL):固定 22 倍頻,產生 528MHz。這個 PPL 還分出 4 路 PFD,即PLL2_PFD0~PLL2_PFD3,528_PLL 和 PLL2_PFD0~PLL2_PFD3 為各種總線提供時鐘。他們不提供精確的或恒定的頻率,可以實現動態調頻。通常的,528_PLL 和 PLL2_PFD0~PLL2_PFD3 作為系統內部總線,內部邏輯處理單元,DDR 接口,NAND/NOR 接口模塊等的時鐘源。 PPL3(USB1_PLL):用于 USBPHY(OTG PHY),固定 20 倍頻,同樣分出 4 路 PFD,即 PLL3_PFD0~PLL3_PFD3,產生了 480MHz 的 VCO 頻率和 24MHz 振蕩器。主 PPL 和 4 路 PFD 也可作為其他接口時鐘輸入。 PPL4(Audio PLL):用于音頻外設,提供低抖動和高精度音頻時鐘,頻率范圍為 650MHz~1300MHz,頻率分辨率優于 1Hz。可以選擇 1/2/48/16 分頻。 PPL5(Video PLL):用于標準視頻顯示外設,提供低抖動和高精度音頻時鐘,頻率范圍為 650MHz~1300MHz,頻率分辨率優于 1Hz。該時鐘主要用作顯示和視頻接口的時鐘。可以選擇 1/2/48/16 分頻。 PPL6(ENET_PLL):固定為 20+5/6 倍頻,產生 500MHz,在此基礎上產生 25/50/100/125MHz 網絡時鐘。 PPL7(USB2_PLL):用于 USB2PHY(OTG PHY),固定 20 倍頻,產生了 480MHz 的 VCO 頻率和 24MHz振蕩器。 時鐘樹 如此多的時鐘分支都要一一對應不同的外設。我們要參考《IMX6ULL 參考手冊.pdf》里的 18.3 小結“CCMClock Tree”,來學習如何選擇 PPL 時鐘。 時鐘樹整體分為三個部分:CLOCK SWITCHER、CLOCK ROOT GENERATOR 和 SYSTEM CLOCKS。其中左邊的CLOCK_SWITCHER 就是我們上一小節講解的那 7 路 PLL 和 8 路 PFD,右邊的 SYSTEM CLOCKS 就是芯片外設,中間的 CLOCK ROOT GENERATOR 部分的作用就是選擇合適的時鐘接入外設接口,負責給 CLOCK SWITCHER 和SYSTEM CLOCKS 連線。就是在 7 路 PLL 和 8 路 PFD 選擇合適時鐘源,提供給外設使用。 我們以 ESAI 外設為例,ESAI 時鐘圖 15.1.5 所示: 這里的 CLOCK ROOT GENERATOR 又被分成三部分: ESAI_CLK_SEL:時鐘源選擇器,手冊中搜索“ESAI_CLK_SELESAI ”可知,有 4 個可選的時鐘源:PLL4、PLL5、PLL3_PFD2 和 pll3_sw_clk。具體選擇哪一路作為 ESAI 的時鐘源是由寄存器 CCM->CSCMR2 的ESAI_CLK_SEL 位來決定的,用戶可以自由配置。如圖 15.1.6 所示: 1. ESAI_CLK_PRED:一次分頻,手冊中搜索“ESAI_CLK_PRED”可知,有 1~8 分頻 8 種選擇,分頻值由寄存器 CCM_CS1CDR 的 ESAI_CLK_PRED 來確定的,假如現在 PLL4=650MHz,我們選擇 PLL4 作為 ESAI 時鐘,一次分頻選擇 2 分頻,那么此時的時鐘就是 650/2=325MHz。如圖 15.1.7 所示: 2. ESAI_CLK_PODF:二次分頻,手冊中搜索“ESAI_CLK_PODF”可知,在一次分頻的基礎上在此分頻,有 1~8 分頻 8 種選擇,經過此分頻器以后的時鐘就是 325/8=40.625MHz。因此最終進入到 ESAI 外設的時鐘就是 40.625MHz。 以上是以外設 ESAI 為例的設置方式,其他外設可以根據具體需求查看手冊去配置。 內核時鐘 上一節的時鐘樹上我們可以查找到 ARM 內核時鐘如圖 15.1.8 所示: 1. 時鐘源 PPL1,默認為 996MHz。 2. 寄存器 CCM_CACRR 的低三位即 ARM_PODF 位對 PLL1 進行分頻,有 0~7 分別對應 1~8 分頻 8 種選擇。這里選擇 2 分頻,經過分頻之后就是 996/2=498MHz,如圖 15.1.9 所示: 這樣,出來的就是 ARM 的內核時鐘,也就是芯片主頻(498MHz)。 如果我們要設置 528MHz,我們需要設置 PPL1 為 1056MHz,寄存器 CCM_CACRR 的 ARM_PODF 位配置為 2 分頻即可。如果我們要設置為 696MHz 主頻。我們需要將 PPL1 設置為 696MHz,那么寄存器 CCM_CACRR的 ARM_PODF 位配置為 2 分頻即可。 我們在來看下如何設置 PPL1。PPL1 是由寄存器 CCM_ANALOG_PLL_ARMn 決定的,結構如圖 15.1.10: 寄存器 CCM_ANALOG_PLL_ARMn 中有兩個主要位: ENABLE: 時鐘輸出使能。1:使能 PLL1 輸出,0:關閉 PLL1 輸出。 DIV_SELECT: 設置 PLL1 的輸出頻率,可設置范圍為:54~108,PLL1 CLK = Fin *div_seclec/2.0,Fin=24MHz。如果 PLL1 要輸出 1056MHz 的話,div_select 就要設置為 88。在修改 PLL1 時鐘頻率的時候我們需要先將內核時鐘源改為其他的時鐘源,PLL1 可選擇的時鐘源如圖 15.1.11 所示: 1. pll1_sw_clk 也就是 PLL1 的最終輸出頻率。 2. 選擇器,選擇 pll1_sw_clk 的時鐘源,寄存器 CCM_CCSR 的 PLL1_SW_CLK_SEL 位決定 pll1_sw_clk 是選擇 pll1_main_clk 還是 step_clk。正常情況下應該選擇 pll1_main_clk,但是如果要對 pll1_main_clk(PPL1)的頻率進行調整的話,比如我們要設置 PLL1=1056MHz,此時就要先將 pll1_sw_clk 切換到 step_clk 上。等pll1_main_clk 調整完成以后再切換回來。 3. 選擇器,選擇 step_clk 的時鐘源,由寄存器 CCM_CCSR 的 STEP_SEL 位來決定 step_clk 是選擇 osc_clk還是 secondary_clk。一般選擇 osc_clk,也就是 24MHz 的晶振。 這里我們就用到了一個寄存器 CCM_CCSR,結構如圖 15.1.12 所示: |