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。
#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。
下图为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的各值都是有取值范围的,需参考对应寄存器的资料,如下:



