第十六章 主频和时钟配置实验(其他的 PLL 和 PFD 时钟)

这一章主要是设置PLL2和PLL3的各自4路PFD。

CCM_ANALOG_PFD_528n

image.png

寄存器CCM_ANALOG_PFD_528n分为四组,分别对应PFD0~PFD3。
以PFD0为例子:
PFD0_FRAC:是分频数,PLL2_PFD0的计算公式52818/PFD0_FRAC,PFD0_FRAC范围12~35。如果PLL2_PFD0的频率要设置为352MHz的话,PFD0_FRAC=52818/352=27

其他PFD1~PFD3设置也和PFD0一样。

寄存器 CCM_ANALOG_PFD_480n 和 CCM_ANALOG_PFD_528n的结构是一模一样的。

AHB_CLK_ROOT 、IPG_CLK_ROOT、PERCLK_CLK_ROOT设置

AHB_CLK_ROOT 最高可以设置 132MHz,
IPG_CLK_ROOT和PERCLK_CLK_ROOT最高可以设置66MHz。那我们就将AHB_CLK_ROOT、
IPG_CLK_ROOT 和 PERCLK_CLK_ROOT 分 别 设 置 为 132MHz 、 66MHz 、 66MHz 。

看着这个图来理解,很容易明白。


image.png

AHB_CLK_ROOT 和IPG_CLK_ROOT是由寄存器CCM_CBCDR、CCM_CBCMR控制。

IPG_CLK_ROOT 是由CCM_CSCMR1控制。
**IPG_CLK_ROOT和PERCLK_CLK_ROOT依赖AHB_CLK_ROOT ,所以要设置AHB_CLK_ROOT **
**IPG_CLK_ROOT和PERCLK_CLK_ROOT大部分的外设的时钟 **

void imx6u_clkinit(void)
{
    
    unsigned int reg=0;
    
    if ( ((CCM->CCSR>>2) &0X1) == 0)//判断哪个时钟源启动
    {
        CCM->CCSR &= ~(1<<8);//配置step_clk时钟源为24MHz OSC
        CCM->CCSR |= (1<<2);//配置pll1_sw_clk时钟源为step_clk
    }
    
    //PLL1  1056MHz   内核时钟
    CCM_ANALOG->PLL_ARM = (1<<13) | ((88<<0)&0x7f);//bit13打开时钟输出   bit0~bit6 PLL1 CLK = Fin *div_seclec/2.0,div_seclec=88
    CCM->CCSR &= ~(1<<2);//切换为pll1_main_clk
    CCM->CACRR =1;//2 分频
    /* PLL2和PLL3是固定倍频的,所以不用设置*/
    //PLL2各个PFD   系统时钟
    //32Bit分成 0~7  8~15  16~23 24~31  bit31对应PFD开关,bit30检查是否稳定输出  bit29~bit24分频
    reg = CCM_ANALOG->PFD_528;
    reg &= ~(0X3F3F3F3F);//清除
    reg |= 32<<24;
    reg |= 24<<16;
    reg |= 16<<8;
    reg |= 27<<0;
    CCM_ANALOG->PFD_528=reg;
    
    //PLL3各个PFD
    //32Bit分成 0~7  8~15  16~23 24~31  bit31对应PFD开关,bit30检查是否稳定输出  bit29~bit24分频
    reg = CCM_ANALOG->PFD_480;
    reg &= ~(0X3F3F3F3F);//清除
    reg |= 19<<24;
    reg |= 17<<16;
    reg |= 16<<8;
    reg |= 12<<0;
    CCM_ANALOG->PFD_480=reg;
    
    //AHB
    CCM->CBCMR &= ~(3<<18);//清除
    CCM->CBCMR |= (1<<18);//00选择PLL2,01选择PLL2_PFD2,10选择PLL2_PFD0,11选择PLL2_PFD2/2
    CCM->CBCDR &= ~(1<<25);//设置分频  如果0选择PLL2,1选择periph2_clk2_clk
    while(CCM->CDHIPR &(1<<5));//等待握手
    
    
    #if 0
    /* 原子哥暂时不知道如何禁止AHB_CLK_ROOT的输出,所以下面这一段不能用。
    **
    */
    CCM->CBCDR &= ~(7<<10);//清除
    CCM->CBCDR |= 2<<10;//分频
    while(CCM->CDHIPR&(1<<1));//等待握手完成
    #endif
    
    //设置IPG_CLK_ROOT 最小3MHz 最大66MHz
    CCM->CBCDR &= ~(3<<8);//清除
    CCM->CBCDR |= 1<<8;//分频
    
    
    //设置PERCLK_CLK_ROOT时钟
    CCM->CSCMR1 &= ~(1<<6)//为0选择ipg_clk,为1选择osc_clk
    CCM->CSCMR1 &= ~(7<<0);//分频
}

看了那么寄存器,终于要写代码。

写代码&&测试

这章看起来云里雾里的。

你可能感兴趣的:(第十六章 主频和时钟配置实验(其他的 PLL 和 PFD 时钟))