为了将ZYNQ的PS测的两个核运行频率提升到1GHZ,同时正确的配置我的时钟定时器以及时间戳,需要了解ZYNQ的时钟管理系统和配置方法。
1.ZYNQ PS侧的时钟子系统及默认配置
解释上图:
PS_CLK:系统晶振的时钟,这个是PS端的的时钟来源,经过一个叫PLL的锁相环功能部件,输出到ARM PLL和I/O PLL以及DDR PLL,后续的子部件均由这三个时钟源输出。
这里对于cpu的时钟源选择,由寄存器ARM_CLK_CTRL(0XF8000120)控制,该寄存器时钟源选择的描述如下:
这里cpu的时钟源可以选择是IO还是DDR还是ARM的PLL,关于CPU后续时钟的配置,cpu6x4x3x2x1x这些时钟的配置,有一张更清晰的图,如下:
这里经过选择以后,可以控制输出到arm端的分频系数,这个分频系数在13:8位,然后通过24~27位,选择是否使能cpu各个分频的时钟。
这里各个部件的时钟源都是可以选择的,比如QSPI,可以选择是IO还是DDR还是ARM的PLL,然后再去配置自己的时钟,在节能模式下,可以优化时钟的配置,达到降低功耗的目的,这里不去深究,我的目的就是正确的配置时钟。
比如我的PS_CLK是33.3MHZ,经过PLL的倍频,到了1333MHZ,然后经过6bit的可编程分频系数,也就是ARM_CLK_CTRL的13:8位,这里假设是2,这个系数只能是2,4或者更大的数,不能写1或者3.
这之后假如各个cpux的时钟都使能了,得到的结果就是cpu6x4x = 1333MHZ/2 = 667MHZ,这也是默认的CPU主频,其于依照倍数关系自然可以确认。
这里还要注意的就是有一个CLK_621_TRUE,这个是控制cpu测的各个时钟的倍频关系,如果设置为1,则倍频关系为6:2:1,否则为421关系,即4:2:1,这个默认我们都是配置621模式。
2.设置ZYNQ CPU工作在1GHZ
由上面的配置信息可知,要提高CPU的工作频率,有两个方法,第一是降低分频系数,及上图中的6bit programmable divider,这是由ARM_CLK_CTRL控制的寄存器,第二是提高前面三个的PLL输出频率,由于分频系数,一般都设置为最低的2,所以要提高cpu的频率,只有想办法提高前面PLL的输出频率,默认是输出1333MHZ,I/O是1G,DDR是1066MHZ;如下图中的配置:
这里对应的fdiv是40,有没有办法可以设置更高的fdiv,办法肯定是有的,zynq对时钟部分提供了可编程的特性,在手册中有program model的介绍,这里对fdiv有一个配置表:
各个时钟源,无论arm pll还是io pll还是ddr pll,都需要遵照这个表中的数据去配置,加入我要将arm cpu的运行频率提高为1GHZ,由于前面提到的divider是2,那么pll输出过来的频率需要为2GHZ。
由于PS_CLK为33.3,那就需要fdiv的倍频系数为60,这样可以达到,这个数值,芯片是支持的,只需要配置pll cp为2,pll res为4,lock cnt为250,那么配置这些只需要如下两个寄存器:
ARM_PLL_CTRL----0xF8000100
ARM_PLL_CFG ---- 0xF8000110
其中ARM_PLL_CTRL:
其中18:12位,就是设置fdiv的值,这个值理论上最小为1最大为66,设置60已经接近极限了,下面的几个位是用来配置的时候重启以及设置旁路模式,也需要关注一下;
ARM_PLL_CFG :
这个寄存器就是需要按照上面的表,当fdiv为60的时候,pll_cp和pll_res以及lock_cnt的值填写进去。
整体配置思路如下:
设置
ARM_CLK_CTRL----0xF8000120
设置分频为2,选择arm PLL,使能各个倍频输出
ARM_PLL_CTRL----0xF8000100
设置FDIV为60
ARM_PLL_CFG ---- 0xF8000110
设置LOCK PLL_CP PLL_RES分别为250,2,4
具体过程:
step1:确认该寄存器可以解锁锁定
step2:设置以上三个寄存器
step3:将PLL设置为旁路模式
step4:重启PLL,reset置位
step5:重启PLL,reset清零
step6:设置为非旁路模式,使得pll输出工作
经过测试,我校准了udelay,测试了时间戳和sleep等接口,均准确:
CPU Freq Get Test!
cpu freq = 1000.00 Mhz
Sleep[tick] 5S:[5000.000000]ms
Sleep[timestamp] 1S:[994.901318]ms
udelay[100ms]:[100.012590]ms
udelay[100us]:[100.224000]us
CPU频率的计算公式:
cpu frequency = PS_CLK*FDIV/DIVIDER*1.0
3.定时器的时钟来源
在cortex a9的官方手册,以及zynq7000 ug585手册中,时钟定时器的来源为cpu3x2x,所以当主频改变为1GHZ的时候,cpu2x3x的频率也需要修改为499MHZ,这样系统的定时器功能才正常。