目录
一.基本概念
1.变频编辑
2.时钟树
3.基本流程
二.具体实现
1.配置ARM时钟
1.CCSR寄存器
2.CCM_ANALOG->PLL_ARM寄存器
3.CACRR
2.配置PLL2和PLL3
3.配置三大根时钟
1.CBCMR寄存器
2.CBCDR寄存器
3.CSCMR1寄存器
一.基本概念
1.变频![]()
使用的芯片imx6ull是无源晶振,表示在工作时不需要额外电压,
下图为该芯片的时钟配置
PLL1为内核配置时钟,PLL2为外设配置时钟,PLL3为USB设备配置时钟,一共7个PLL,8个PFD。
2.时钟树
时钟根产生器:负责对不同频率设备牵线
分频器,2位分频器表示从1到4的分频,3位则表示1到8
OSC晶振,24Mhz
3.基本流程
配置步骤如下:
1.配置ARM时钟为528MHZ
2.配置PLL2下的4个PFD和PLL3下的4个PFD
3.配置三大根时钟(132MHZ,66MHZ,66MHZ)
二.具体实现
1.配置ARM时钟
在配置频率时,先将cg门关闭,配置频率稳定后再打开cg门传给外设,否则若当外设频率较低时,打开cg门,将高频传给外设,由于频率急剧升高,可能导致外设死机,而由于ARM没有配置cg门,所以要更改ARM的时钟频率应特殊处理,如下:
先采用step_clk路,通过选通门选择osc_clk或者下面的时钟频率,先将ARM的工作频率切换为24MHZ,再配置PLL,设置二分频率,待稳定后切换为pll1_main_clk传给ARM.
1.CCSR寄存器
选通线路
2.CCM_ANALOG->PLL_ARM寄存器
设置PLL频率为1056
3.CACRR
设置PLL1为二分频
unsigned int t = 0; // 1. 配置ARM时钟 CCM->CCSR &= ~(1 << 8);//1,选择24MHZ CCM->CCSR |= (1 << 2);//2,切换step_clk t = CCM_ANALOG->PLL_ARM;//3,设置频率1056 t &= ~(3 << 14); t |= (1 << 13); t |= (88 << 0); CCM_ANALOG->PLL_ARM = t; CCM->CACRR |= (1 << 0); //设置二分频 CCM->CCSR &= ~(1 << 2);//4.切换回pll1_main2.配置PLL2和PLL3
按照下图配置
PLL2锁倍频,所以参考手册没有,只需修改PLL2下的4个PFD
可见,只需修改FRAC域配置PFD倍频因子,CLKGATE打开cg门
// 2. 配置PLL2 PFD t = CCM_ANALOG->PFD_528; t &= ~((0x3F << 0) | (0x3F << 8) | (0x3F << 16) | (0x3F << 24));//先将倍频因子位清零 t &= ~((1 << 7) | (1 << 15) | (1 << 23) | (1 << 31));//打开4个PFD的cg门 t |= (27 << 0) | (16 << 8) | (24 << 16) | (32 << 24);//配置倍频因子,由图中公式528*18/对应频率得到 CCM_ANALOG->PFD_528 = t; // 3. 配置PLL3 PFD,同上 t = CCM_ANALOG->PFD_480; t &= ~((0x3F << 0) | (0x3F << 8) | (0x3F << 16) | (0x3F << 24)); t &= ~((1 << 7) | (1 << 15) | (1 << 23) | (1 << 31)); t |= (12 << 0) | (16 << 8) | (17 << 16) | (19 << 24);3.配置三大根时钟
按照下图时钟树红线走向配置相应的寄存器
设置为最大频率,运行速度快
1.CBCMR寄存器
选中PLL2具体所对应的哪个PFD
2.CBCDR寄存器
选中PLL2,设置AHB倍频因子,IPG倍频因子
3.CSCMR1寄存器
选中PERCLK根时钟,配置一分频因子
// 4. 配置三个根时钟 t = CCM->CBCMR; t &= ~(3 << 18); t |= (1 << 18); //选中PFD2 CCM->CBCMR = t; t = CCM->CBCDR; t &= ~(1 << 25); //选通PLL2 t &= ~((7 << 10) | (3 << 8)); //清空分频因子位 t |= (1 << 11) | (1 << 8); //设置分频因子,bit11为设置AHB_CLK3分频,bit8位为设置二分频给IPG_CLK CCM->CBCDR = t; CCM->CSCMR1 &= ~(1 << 6);//设置PERCLK继承来自IPG_CLK CCM->CSCMR1 &= ~(0x3F << 0);//设置一分频