一、hw原理图
1、32.768kHz的晶振,供给rtc使用
2、在T16和T17两个io上面接了一个24MHz的晶振,整个系统的时钟由该时钟源提供
二、imx6ul系统时钟分析
1、7 路 PLL 时钟源 (都是来自 24 MHZ)(驱动外设)
为了方便生成时钟,6ul从24MHZ晶振生成了7路PLL,这7路PLL有的又生成
- PLL1 :arm_pll,arm内核用
- PLL2 : system_pll,固定528m,由24 * 22 = 528,固定22倍频不能修改。又叫做528_pll。此路PLL又分出了4路PFD。共同作为其它外设的根时钟源,如内部系统总线。
- PLL3 : usb1_pll,可以供usb1phy和其它外设。固定是20倍频,为480MHz,也有四路PFD。pll3_pfd0 -> pll3_pfd3
- PLL4 : audio_pll , 供音频使用
- PLL5 : video_pll , 主供视频外设,图像处理有关的外设用,如rgb lcd
- PLL6 : enet_pll , pll固定为 20 + 5/6 倍频,固定频率为500 MHz,主供网络外设使用
- PLL7 : usb2_pll,固定频率为480m,固定倍频为20倍,无pfd
2、各路pll分出的pfd
3、时钟树
4、外设如何选择合适的时钟
比如esai的时钟选择
pll4,pll3的pfd2,pll5,pll3
5、要初始化的pll和pfd
PLL1
PLL2及其所有的pfd(528)
PLL3及其所有的pfd(428)
其它按实际需要配置
一般按照时钟树里面的值进行设置(开发指南 page 398)
常用外设时钟数值(参考手册 page 643)
三、imx6ul 时钟配置
1、系统时钟的配置
- 需要528m,所以在2分频的话—PLL1应该设置为1056m
分频因子可以是2,也可以配置成其他的值:1 - 8
- PLL1 = 1056m ,pll1_sw_clk有两路可以选择,分别为pll1_main_clk 和 step_clk , 通过 CCSR 寄存器的pll1
_sw_clk_sel 位来选择。为 0 的时候是 pll1_main _clk , 为 1 step_clk - 在修改PLL1也就是设置系统时钟的时候,需要给6ull一个临时的时钟,它就是step_clk。
在修改PLL1的时候需要将 pll1_sw _clk 切换到 step_clk 上 - 设置step_clk,step_clk有两路来源,由 CCSR 的 step_sel位(bit8)来设置,为0 是step_clk = 24MHz
- 始终切换成功以后,就可以修改PLL1的值
- PLL output frequency = Fref * DIV_SEL / 2
fref = 24mhz
通过CCM_ANALOG_PLL_ARM 寄存器的DIV_SELECT位(bit6 - 0 )来算
1056 = 24 * DIV_SEL / 2 --------------> DIV_SEL = 88
还要设置CCM_ANALOG_PLL_ARM寄存器的ENABLE位(bit13)为1,也就是使能输出。 - 在切换回PLL1之前,设置CACRR寄存器的ARM_PODF = 1 , 也就是2分频
(一开始的时钟是内部boot_rom初始化的
2、各个PLL时钟的配置
PLL2和PLL3。PLL2固定为528MHZ,PLL3固定为480MHZ,PLL3固定为 480 MHZ。
- 1、初始化PLL2_PFD0 ~ PFD3。寄存器CCM_ANALOG_PFD_528用于设置4路PFD的时钟。比如 PFD0 = 528 * 18 / PFD0_FRAC。设置 PFD0_FRAC 位即可。比如,PLL2_FRAC 位即可。比如PLL2_PFD0 = 352M = 528 * 18 / PFD_FRAC。
PFD_FRAC = 27. - 2、初始化PLL3_PFD0 ~ PFD3
3、其他外设时钟的配置
AHB_CLK_ROOT,PERCLK_CLK_ROOT,IPG_CLK_ROOT
因为PERCLK_CLK_ROOT,IPG_CLK_ROOT要用到AHB_CLK_ROOT,所以要初始化AHB_CLK_ROOT
- 1、 AHB_CLK_ROOT
AHB_CLK_ROOT = 132MHz
设置CBCMR寄存器的PRE_PERIPH_CLK_SEL位
设置CBCDR寄存器的PERIPH_CLK_SEL位为0
设置CBCDR寄存器的AHB_PODF位为3分频,396 -> 132
用它来生成下面两个时钟源 - 2、IPG_CLK_ROOT = 66 MHz
设置CDCSR寄存器IPG_PODF = 1,也就是二分频
PERCLK_CLK_ROOT = 66 MHz - 3、PERCLK_CLK_ROOT
设置CSCMR1寄存器的PERCLK_CLK_SEL位为0,选择时钟源来自ipg
-----
总结
先配置系统总时钟528MHz,PLL2,PLL3,然后配置它们的8路PFD,然后配置AHB_CLK,因为接下来的IPG_CLK和PERCLK要用到AHB_CLK,而这两个始终被很多外设用到。
其余外设的始终具体用到再具体配置。