栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux嵌入式开发 -- 设置PLL及各路PFD

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux嵌入式开发 -- 设置PLL及各路PFD

imx6ull系列芯片PLL各路PFD频率设定

PLL参考手册第18章:Chapter 18:Clock Controller Module(CCM)

文章目录

前言一、System PLL中各PFD设定

  1. 代码编写 二、USB1 PLL中各PFD设定

  1.代码编写 三、其他外设时钟源设置

  1. AHB_CLK_ROOT设定  2. PERCLK_CLK_ROOT以及IPG_CLK_ROOT设定 四、注意事项


前言

  1. imx6ull芯片共有7路PLL,用于给外设提供时钟,部分PLL路还分4路PFD,本次设定主要针对System PLL及USB1 PLL以及对应的PFD进行设定,其他路根据实际需求再考虑是否设定。
  2. 但是,System PLL(PLL2)默认时钟频率528MHZ,USB1 PLL(PLL3)默认时钟频率480MHZ,故本次仅需对其分支–4路PFD进行时钟频率设定。各PLL及其PFD所需时钟频率如下图:
    
  


一、System PLL中各PFD设定

  参考上表,System PLL路中:PFD0为352MHZ,PFD1为594MHZ,PFD2为400MHZ,PFD3为200MHZ;
PFD设定方法:
  设定寄存器:CCM_ANALOG_PFD_528n
  
  根据各PFD规格频率及其计算方式所得:PFD0_FRAC = 27,PFD1_FRAC = 16,PFD2_FRAC = 24,PFD3_FRAC = 32。

  1. 代码编写
#define PLL2_PFD0_FRAC               (27)
#define PLL2_PFD1_FRAC               (16)
#define PLL2_PFD2_FRAC               (24)
#define PLL2_PFD3_FRAC               (32)


void imx6ull_arm_init(void)
{
    if(((CCM->CCSR >> 2) & HIGH_BIT) == 0)
    {
        CCM->CCSR &= ~(HIGH_BIT << 8);  
        CCM->CCSR |= (STEP_CLK << 2);   
    }

    
    CCM_ANALOG->PLL_ARM |= (STEP_CLK << CLOCK_OUTPUT_ENABLE) | DIV_SELECT;  
    CCM->CCSR &= ~(STEP_CLK << 2);

    
    CCM_ANALOG->PFD_528 &= ~(0x3F3F3F3F);   
    CCM_ANALOG->PFD_528 |= PLL2_PFD0_FRAC;
    CCM_ANALOG->PFD_528 |= PLL2_PFD1_FRAC << 8*1;
    CCM_ANALOG->PFD_528 |= PLL2_PFD2_FRAC << 8*2;
    CCM_ANALOG->PFD_528 |= PLL2_PFD3_FRAC << 8*3;
}

  这样PLL2路的各PFD频率就设定完毕。

二、USB1 PLL中各PFD设定

  与System PLL设定同理,计算得PFD0_FRAC = 12,PFD1_FRAC = 16,PFD2_FRAC = 17,PFD3_FRAC = 19。

代码如下

  1.代码编写
#define PLL3_PFD0_FRAC               (12)
#define PLL3_PFD1_FRAC               (16)
#define PLL3_PFD2_FRAC               (17)
#define PLL3_PFD3_FRAC               (19)          


CCM_ANALOG->PFD_480 &= ~(0x3F3F3F3F);   
CCM_ANALOG->PFD_480 |= PLL3_PFD0_FRAC;
CCM_ANALOG->PFD_480 |= PLL3_PFD1_FRAC << 8*1;
CCM_ANALOG->PFD_480 |= PLL3_PFD2_FRAC << 8*2;
CCM_ANALOG->PFD_480 |= PLL3_PFD3_FRAC << 8*3;
三、其他外设时钟源设置

  本文还需对AHB_CLK_ROOT ,PERCLK_CLK_ROOT ,IPG_CLK_ROOT,因为涉及到后面所学的一些外设,如I2C,ADC等。如下图:

  既然需对该三项设定,那么需确认其频率范围,如下图。出于性能考虑,我们将其设为最大,即AHB_CLK_ROOT = 132MHZ,PERCLK_CLK_ROOT = 66MHZ,IPG_CLK_ROOT = 66MHZ。

  1. AHB_CLK_ROOT设定

  下图为AHB_CLK_ROOT时钟源选择,此处选择PLL2路的PFD2作为时钟源,再经过2个多路选择器最终通过3分频实现132MHZ。


  故:第一个多路选择器CBCMR的PRE_PERIPH_CLK_SEL选择PLL2的PFD2,第二个多路选择器CBCDR的PERIPH_CLK_SEL选择PLL2 CLK,最后CBCDR的AHB_PODF选择3分频,代码如下:

    
    CCM->CBCMR &= ~(3 << 18);
    CCM->CBCMR |= (1 << 18);    
    
    CCM->CBCDR &= ~(1 << 25);   

    CCM->CBCDR &= ~(7 << 10);
    CCM->CBCDR |= (2 << 10);    

  但参考手册显示,对CCM_CBCDR中的多路选择器及分频进行设定后,需考虑握手信号是否在忙,若不忙,则设定OK,故代码还需调整,对CDHIPR寄存器中的握手信号状态进行确认:

    
    CCM->CBCMR &= ~(3 << 18);
    CCM->CBCMR |= (1 << 18);    
    
    CCM->CBCDR &= ~(1 << 25);   
    while(CCM->CDHIPR & (1 << 5));  

    CCM->CBCDR &= ~(7 << 10);
    CCM->CBCDR |= (2 << 10);    
    while(CCM->CDHIPR & (1 << 5));
  2. PERCLK_CLK_ROOT以及IPG_CLK_ROOT设定

  AHB_CLK_ROOT设定好后,对PERCLK_CLK_ROOT进行设定,同步下方IPG_CLK_ROOT,同时共用一个分频器,且最大频率都是66MHZ,故仅需将分频器设置为2分频,PERCLK_CLK_ROOT单独的分频器设置为1即可。
  初次之外,PERCLK_CLK_ROOT还经过多路选择器,故还需选择路,故代码如下:

    CCM->CBCDR &= ~(3 << 8);
    CCM->CBCDR |= (1 << 8);     

    CCM->CSCMR1 &= ~(1 << 6);
    CCM->CSCMR2 &= ~(63);   
四、注意事项

PFDn_FRAC的各值都是有取值范围的,需参考对应寄存器的资料,如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/728915.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号