6、I.MX6ULL学习笔记—主频和时钟配置

一、硬件原理图分析

1、32.768KHz的晶振,供给RTC使用
2、在6U的T16和T17这两个IO上接24Mhz晶振。
6、I.MX6ULL学习笔记—主频和时钟配置_第1张图片6、I.MX6ULL学习笔记—主频和时钟配置_第2张图片

二、I.MX6ULL系统时钟分析

6、I.MX6ULL学习笔记—主频和时钟配置_第3张图片

1、7路PLL

  • ARM_PLL(PLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。(配置方式参考:I.MX6ULL参考手册p644)
  • 28_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编程修改(配置方式参考:I.MX6ULL参考手册p645)。因此,此路 PLL 时钟=24MHz * 22 = 528MHz,这也是为什么此 PLL 叫做 528_PLL 的原因。
  • USB1_PLL(PLL3),此路 PLL 主要用于 USBPHY,此 PLL 也有四路 PFD,为:PLL3_PFD0~PLL3_PFD3,USB1_PLL 是固定的 20 倍频,因此 USB1_PLL=24MHz *20=480MHz。
  • AUDIO_PLL(PLL4),此路 PLL 用于音频相关的外设,此路 PLL 的倍频可以调整,PLL的输出范围同样也是 650MHz~1300MHz,此路 PLL 在最终输出的时候也可以进行分频,可选1/2/4 分频。
  • VIDEO_PLL(PLL5),此路 PLL 用于显示相关的外设,比如 LCD,此路 PLL 的倍频可以调整,PLL 的输出范围在 650MHz~1300MHz。此路 PLL 在最终输出的时候还可以进行分频,可选 1/2/4/8/16 分频。
  • ENET_PLL(PLL6),此路 PLL 固定为 20+5/6 倍频,因此 ENET_PLL=24MHz * (20+5/6)= 500MHz。此路 PLL 用于生成网络所需的时钟,可以在此 PLL 的基础上生成 25/50/100/125MHz的网络时钟。
  • USB2_PLL(PLL7,没有写错!就是 PLL7,虽然序号标为 4,但是实际是 PLL7),看名字就知道此路 PLL 是给 USB2PHY 使用的。同样的,此路 PLL 固定为 20 倍频,因此也是 480MHz。

三、I.MX6U系统配置

1、系统主频配置

  • 要设置ARM内核主频为 528MHz,设置 CACRR 寄存器的 ARM_PODF 位为 2 分频,然后设置 PLL1=1056MHz即可。CACRR 的 bit3-0 为 ARM_PODF 位,可设置 0-7,分别对应 1-8 分频。应该设置 CACRR 寄存器的 ARM_PODF=1 (参考:I.MX6ULL参考手册 p665)。
  • 设置 PLL1=1056MHz。PLL1=pll1_sw_clk。pll1_sw_clk有两路可以选择分别为:pll1_main_clk和 step_clk。通过 CCSR 寄存器的 pll1_sw_clk_sel 位( bit2 参考:I.MX6ULL参考手册 p666)来选择。为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为 osc=24MHz,为1时不用(仅针对本讲来说不使用)。
  • 时钟切换成功以后则可以修改 PLL1 的值。
  • 通过 CCM_ANALOG_PLL_ARM 寄存器的 DIV_SELECT 位(bit6-0) 来设置 PLL1 的频率(参考:I.MX6ULL参考手册 p714),公式为:
Output = Fref\*DIV_SEL/2
1056=24\*DIV_SEL/2 =>DIV_SEL=88
  • 设置CCM_ANALOG_PLL_ARM 寄存器的 DIV_SELECT 位 =88 (0x58)即可。此时 PLL1=1056MHz。
  • 设置CCM_ANALOG_PLL_ARM 寄存器的 ENABLE 位 (bit13)为 1,也就是使能输出。
  • 在切换回 PLL1 之前,设置 CACRR 寄存器的 ARM_PODF=1 (进行2分频)!!! 切记
    6、I.MX6ULL学习笔记—主频和时钟配置_第4张图片
    配置过程:
/*初始化时钟
 *   配置的流程:首先判断当前时钟是不是使用的pll1_main_clk时钟,如果是,则先将step_clk切换为使用osc_clk时钟,
 再将当前时钟切换到使用step_clk时钟(这是配用时钟,在设置主频时启用,让程序正常运行);然后开始设置主频时钟,
 要求设置主频时钟为528Mhz,根据公式 Output=Fref*DIV_SEL/2,即1056=24*DIV_SEL/2,则DIV_SEL=88。
 设置DIV_SEL=88,然后设置2分频。此时主频pll1_main_clk设置位528MHz,再将pll1_sw_clk设置回使用pll1_main_clk,
 即令CCSR bit2 =0。
*/
void imx6u_clkinit(void)
{
    /*初始化6U的主频为528MHz*/
    if(((CCM->CCSR >> 2) & 0x1 ) == 0)  //当前时钟使用pll1_main_clk也就是PLL1
    {
        CCM->CCSR &= ~(1<<8);  //设置step_clk = osc_clk = 24M  
        CCM->CCSR |= (1<<2);   //pll1_sw_clk = step_clk = 24M
    }
    /*设置PLL1=1056MHz*/
    CCM_ANALOG->PLL_ARM = (1<<13) | ((88<<0) & 0x7f);   //(1<<13)是使能时钟输出
    CCM->CACRR = 1;  //设置2分频
    CCM->CCSR &= ~(1<<2);  //设置pll1_sw_clk=pll_main_clk=1056MHz
}

超频:

/*
*板子可以超频到696MHZ
696=24*58/2  即DIV_SEL=58
只需要更改两处:  CCM_ANALOG->PLL_ARM = (1<<13) | ((58<<0) & 0x7f);    将 88改为 58
CCM->CACRR = 0;  //设置1分频   ,即不分频。
*/
void imx6u_clkinit(void)
{
    /*初始化6U的主频为696MHz*/
    if(((CCM->CCSR >> 2) & 0x1 ) == 0)  //当前时钟使用pll1_main_clk也就是PLL1
    {
        CCM->CCSR &= ~(1<<8);  //设置step_clk = osc_clk = 24M  
        CCM->CCSR |= (1<<2);   //pll1_sw_clk = step_clk = 24M
    }
    /*设置PLL1=1056MHz*/
    CCM_ANALOG->PLL_ARM = (1<<13) | ((58<<0) & 0x7f);   //(1<<13)是使能时钟输出
    CCM->CACRR = 0;  //设置1分频
    CCM->CCSR &= ~(1<<2);  //设置pll1_sw_clk=pll_main_clk=1056MHz
}

2、各个PLL时钟的配置
  PLL2和PLL3。PLL2固定为528Mhz,PLL3固定为480Mhz。

  • 初始化PLL2_PFD0~PFD3。寄存器CCM_ANALOG_PFD_528用于设置4路PFD的时钟。比如设置PFD0 = 52818/PFD0_FRAC。设置PFD0_FRAC位即可。比如PLL2_PFD0 = 352M =52818/PFD0_FRAC,因此 PFD0_FRAC = 27。依次类推 PFD1_FRAC = 52818/594=16;PFD2_FRAC = 52818/396=24;PFD3_FRAC = 528*18/297=32。
  • 初始化PLL3_PFD0~PFD3。寄存器CCM_ANALOG_PFD_480 用于设置4路PFD的时钟。比如设置PFD0 = 48018/PFD0_FRAC。设置PFD0_FRAC位即可。比如PLL2_PFD0 = 720M =48018/PFD0_FRAC,因此 PFD0_FRAC = 12。依次类推 PFD1_FRAC = 48018/540=16;PFD2_FRAC = 48018/508.2=17;PFD3_FRAC = 480*18/454.7=19。
  • 上面计算的PFDn_FRAC 取值范围应该在 12~35 之间
    参考:I.MX6ULL参考手册 p735~738.
  • NXP 推荐的这 8 路 PFD 频率如表:
PDF NXP 推荐频率值
PLL2_PFD0 352MHz
PLL2_PFD1 594MHz
PLL2_PFD2 396MHz
PLL2_PFD3 297MHz
PLL3_PFD0 720MHz
PLL3_PFD1 540MHz
PLL3_PFD2 508.2MHz
PLL3_PFD3 454.7MHz

3、其他外设的时钟源配置
  初始化:AHB_CLK_ROOT、PERCLK_CLK_ROOT、IPG_CLK_ROOT。
  因为 PERCLK_CLK_ROOT 和 IPG_CLK_ROOT 需要用到 AHB_CLK_ROOT 所以我们需要初始化 AHB_CLK_ROOT。

  • AHB_CLK_ROOT 的初始化(参考:I.MX6ULL参考手册 p643 表18-4):
    AHB_CLK_ROOT = 132MHz。
    从图中我们可以看出 AHB_CLK_ROOT 的时钟一般我们来源于PLL2_PFD2,且采用不分频的那一路。图中 “2” 处设置CBCMR寄存器PRE_PERIPH_CLK_SEL(bit:19~18)参考:p670 来选择使用哪个时钟。此时时钟源为 396MHz。再设置图中 “1” 处的CBCDR寄存器的PERIPH_CLK_SEL(bit:25)参考:p667。再使用CBCDR 寄存器的 AHB_PODF (bit:12~10)设置为 0x10 也就是 3分频,则 AHB_CLK_ROOT 初始化为 132MHz。
    设置时要注意,等待握手信号完成。
    在这里插入图片描述

6、I.MX6ULL学习笔记—主频和时钟配置_第5张图片
注意:设置完成以后有一个问题,“在不关闭输出时钟的情况下更新PODF值会导致不可预测的结果,比如没有时钟输出”。详见开发指南。 内部 boot rom 将 AHB_PODF 设置为了 3 分频,即使我们不设置 AHB_PODF,AHB_ROOT_CLK 也依旧等于 396/3=132Mhz。因此这里不再设置3分频
在这里插入图片描述

  • PERCLK_CLK_ROOT 的初始化:
    PERCLK_CLK_ROOT = 66MHz。设置CBCDR寄存器的IPG_PODF(bit:9~8)为1即进行2分频。则PERCLK_CLK_ROOT = 132MHz/2=66MHz。
    6、I.MX6ULL学习笔记—主频和时钟配置_第6张图片

-IPG_CLK_ROOT 的初始化:
IPG_CLK_ROOT = 66MHz。 设置 CSCMR1 寄存器的 PERCLK_CLK_SEL(bit:6) 设置为0 即选择 IPG_CLK_ROOT 时钟源,再设置 CSCMR1 寄存器的 PERCLK_PODF(bit:5~0)为0 即不分频。

你可能感兴趣的:(Linux学习)