主频和时钟配置
一、硬件原理图分析
1.32.768Khz的晶振,供给RTC时钟。
2.在6U的T16和T17这两个IO上接了一个24MHz的晶振。
二、时钟树
1.7路PLL
为了方便生成时钟,从24MHz晶振生出来7路PLL。这7路PLL中有的又生出来PFD。
- PLL1:ARM PLL供给ARM内核
- PLL2:system PLL ,528MHz,此路分出了4路PFD
- PLL3:USB1PLL,480MHz,也分出来4luPFD
- PLL4:AudioPLL,供给音频使用
- PLL5:Video,供给视频外设,比如RGB LCD接口,主要是和图像处理有关的
- PLL6:ENET,主要供给网络外设
- PLL7:USB2PLL,480MHz,无PFD
2.要初始化的PLL和PFD
- PLL1
- PLL2,以及PLL2_PFD0 ~ PLL2_PFD3
- PLL3,以及PLL3_PFD0 ~ PLL2_PFD3
一般按照时钟树里面的值进行设置
三、I.MX6U系统时钟配置
1.系统时钟配置 (配置ARM_PLL)
- 要设置ARM内核主频为528MHz,设置CACRR寄存器的ARM_PODF位为2分频,然后设置PLL1=1056MHz即可。PLL1频率范围为650MHz到1.3GHz。CACRRbit3~0为ARM_PODF位,可设置0-7,分别对应1-8分频。应该设置CACRR寄存器的ARM_PODF = 1。
- 设置PLL1 = 1056MHz。PLL1 = pll1_sw_clk。pll1_sw_clk 有两路可以选择,分别为pll1_main_clk和step_clk,通过CCSR寄存器的pll1_sw_clk_sel(bit2)位来选择。为0的时候选择pll1_main_clk,为1的时候选择step_clk。
- 在修改PLL1的时候,也就是设置系统时钟的时候,需要给系统一个临时的时钟。也就是step_clk。在修改PLL1的时候需要将pll1_sw_clk切换到step_clk上。
- 设置step_clk。step_clk也有两路来源,由CCSR寄存器的step_sel位(bit8)来设置,为0的时候选择外部晶振直接输入。
- 时钟切换成功以后就可以修改PLL1的值。
- 通过CCM_ANALOG_PLL_ARM寄存器的DIV_SELECT位(bit6 - 0)来设置PLL1的频率,公式为:Output = fref*DIV_SEL/2 1056 = 24*DIV_SEL/2 计算可得DIV_SEL = 88。只要设置CCM_ANALOG_PLL_ARM寄存器的DIV_SELECT位等于88,PLL1 = 1056MHz。还要设置CCM_ANALOG_PLL_ARM寄存器的ENABLE位为1,使能时钟。
- 在切换回PLL1之前,设置CACRR寄存器的ARM_PODF = 1!!提前2分频后再切换回PLL1,这是为了防止有些SOC不支持太高频率。
2.配置PLL2和PLL3以及PFD
PLL2固定为528MHz,PLL3固定为480MHz。为固定的就不用初始化,但是这两个PLL下面的分别4个PFD需要初始化。
- 初始化PLL2_PFD0 - PFD3。寄存器CCM_ANALOG_PFD_528用于设置4路PFD的时钟,比如PFD0 = 528*18/PFD0_FRAC。设置PFD0_FRAC位即可。同理,剩下的3路PFD都是这样设置的。
- 初始化PLL3_PFD0 - PFD3
3.其他外设时钟源配置
AHB_CLK_ROOT、PERCLK_CLK_ROOT、IPG_CLK_ROOT。ROOT就是时钟源。
因为PERCLK_CLK_ROOT和IPG_CLK_ROOT要用到AHB_CLK_ROOT,所以我们要初始化AHB_CLK_ROOT。
- AHB_CLK_ROOT初始化。AHB_CLK_ROOT = 132MHz,设置CCM->CBCMR寄存器的PRE_PERIPH_CLK_SEL位为0。设置CCM->CBCDR寄存器的AHB_PODF位为2,三分频,因此396/3=132MHz。
- IPG_CLK_ROOT 初始化。PERCLK_CLK_ROOT = IPG_CLK_ROOT = 66MHz。
设置CCM->CBCDR寄存器的IPG_PODF位为1,二分频。132/2=66MHz。 - PERCLK_CLK_ROOT 初始化(只是配置一个多路选择器)。
设置CSCMR1寄存器的PERCLK_SEL位为0,选择IPG时钟源。