ARM pll整理
1.确定 cpu频率 Fcclk
2.确定 晶振频率 Fosc ,Fcclk 一定是Fosc的整数倍。
3.计算M值 M = Fcclk/Fosc,M的取值范围为1~32。实际写入MSEL位的值为M-1的整数倍。
4.计算P值 选择P值以配置PSEL位。通过设置P值,使Fcco在定义的频率限制范围内。P必须是1, 2, 4或8其中的一个。
PLL :
Fcco为PLL电流控制振荡器的输出频率 Fcclk = M×Fosc
相位频率检测:把两个输入的时钟相位差值 ==》 电流值
流控震荡器:电流值 ==》 频率
当检测输入的两个一样时,稳定了



PLL的锁定过程: CCO的输出频率受到“相位频率检测”部件的控制,输出所需频率的过程不是一蹴而就的,而是一个拉锯反复的过程。 
举例:
系统要求Fosc=10MHz,Fcclk=60MHz。 根据这些要求:
- 确定Fcclk=60MHz;
- 选择Fosc=10MHz;
- 计算M= Fcclk/Fosc=60MHz/10MHz=6。M-1=5,所以写入 PLLCFG[4:0]=00101;
- 计算P=Fcco/( Fcclk*2),其中Fcco为156~320 MHz。当Fcco=156MHz时,P=156MHz/(2*60MHz)=1.3当Fcco=320MHz时, P=2.67
P取整数2,所以写入PLLCFG[6:5]=01
另附:我们知道在Arm的电路在启动或者掉电的时候,是没有使用PLL,因为在掉电的时候PLL是没法工作的.既然知道这一点,在掉电的时候应该断开PLL,而是用晶振直接给电路提供必要的晶振,例如RTC等.
PLL主要有下面这四个寄存器来控制和读取状态:
0xE01FC080 PLLCON
0xE01FC084 PLLCFG
0xE01FC088 PLLSTAT
0xE01FC08 CPLLFEED
其中:
PLLCON寄存器:包涵使能连接PLL的位,也就是控制PLL是否进行连接.这个连接需要在向PLLFEED发送正确的信息(馈送序列)的时候才生效,否则及时将使能位置位,PLL也不会连接到电路中.PLLCON必须在PLL开始连接之前就设置好,否则会造成系统不可预知的错误.
PLLCFG寄存器:这个寄存器是用来设置倍频系数M和分频系数N的.这两个值决定了倍频和分频的频率.
PLLSTAT寄存器:从里面可以读出PLLCON,PLLCFG的值,但必须是在PLLFEED的馈送序列被发送,PLLCON,PLLCFG生效以后才可以读到正确的值.
PLLFEED寄存器:向此寄存器以连续的VPB总线周期写入0xAA,0x55,即馈送序列.在正确的序列被写入PLLFEED之后,PLLCON,PLLCFG才生效,PLL电路才能正确的连接到电路中.
现在让我们来看一下每个参数的定义:
1.Fin:选择的时钟源的频率(也就是选择的晶振的频率)
2.Fcco:PLL最终输出给系统的频率SYSCLK,也称为CCO.
3.N:分频系数
4.M:倍频系数
5.Fref:内部参考时钟,=Fin/N.
那么他们之间有这样的关系:
Fcco=(2*M*Fin)/N
.Fin的频率范围在32K~50M
.Fcco的频率范围在275M~550M
从上面的公式中,我们就可以得出希望的PLLCFG寄存器中的M,N两个数值.
Fcclk实际上也是经过Fcco的分频得到的,也就是CPU的频率.同理USB的频率也与Fcco存在着分频关系.
大家可以参考前一篇中的图来理解这些关系,知道了这些关系就知道了寄存器应该怎样来设置,这对理解编程很有好处.
时钟源从晶振直接到达CCO或者经过了PLL到达CCO之后,还要经过其他的分频器才能到达CPU或者具体的接口电路,理解了这个道理就理解了编程时应该如何考虑选择分频器和设置分频参数,这对底层开发理解非常有好处.
再附:
/* 系统设置, Fosc、Fcclk、Fcco、Fpclk 必须定义*/
#define Fosc 11059200 //晶振频率,10MHz~25MHz,应当与实际一至
#define Fcclk (Fosc * 4) //系统频率,必须为Fosc 的整数倍(1~32),且<=60MHZ #define Fcco (Fcclk * 4) //CCO 频率,必须为Fcclk 的2、4、8、16 倍,范围156MHz~320MHz
#define Fpclk (Fcclk / 4) * 1 //VPB 时钟频率,只能为(Fcclk / 4)的1 ~ 4 倍 通常只需要设置Fosc 即可。需要更改Fcclk 和Fcco 时,参照注释。
倍频和分频的计算计算顺序:
1) 先根据系统需要的频率选择Fosc,必须10-25MHZ.(假定Fosc=10MHZ)
2) 根据需要的系统频率Fcclk,选择倍频系数M,M = Fcclk/Fosc(假定Fcclk=40MHZ,则M=4).
3) M 的值为PLLCFG bits 4:0.(PLLCFG 的低5 位为二进制00100)
4) 根据Fcclk 的频率选择Fcco. Fcco = cclk * 2 * P,则进行下列计算
Fcco 最小/Fcclk=156/40=3.9,因此2*P 的值必须大于3.9,最接近的值为4. 此时P=4/2=2。由于2 的PLLCFG bits 6:5 次方等于P,因此PLLCFG bits 6:5 为二进制00.
PLL 初始化过程:
1) 写PLLCFG 和PLLCON:启动PLL,但是不连接PLL 到系统内核。 PLLCON = 0x01 //PLLE = 1,PLLC = 0 PLLCFG = 0x04 //假定Fosc=10MHZ,Fcclk=40MHZ 计算
2) 保存中断寄存器,关中断
3) 连续写PLLSEED(必须连续,不能被中断) PLLSEED = 0xAA PLLSEED = 0x55
4) 查询PLLSTAT 一直到PLOCK=1 While((PLLSTART & 0x40) == 0) { Wait; //等待,一直到PLOCK=1 }
5) 写PLLCFG 和PLLCON:启动PLL,连接PLL 到系统内核。 PLLCON = 0x03 //PLLE = 1,PLLC = 1 PLLCFG = 0x04 //假定Fosc=10MHZ,Fcclk=40MHZ 计算
6) 连续写PLLSEED(必须连续,不能被中断) PLLSEED = 0xAA PLLSEED = 0x55
7) 查询PLLSTAT,等待PLOCK=1,PLLE=1,PLLC=1,MSEL4:1 和PSEL1:0(PLLSTAT 的位6-5) 看是否完全符合,如果符合执行下一步,不符合报错。
8) 恢复原来的中断寄存器状态

浙公网安备 33010602011771号