首先简单介绍一下ARM1176的时钟(芯片手册搬运工),如下图:
简单翻译一下:ARM1176最高可以产生667MHz的频率,可以通过时钟分频器的值来控制输出时钟,不用修改PLL的工作频率,分配器可以选择1~16的分频数,可以通过修改分频器的值来减少系统电力损耗。6410含有AXI、AHB、APB总线,通过不同的总线控制不同的外设,AXI、AHB总线最高工作在133MHz,APB最高工作在66MHz。
同时手册还给出了时钟分频的推荐参数,如下图:
我们将时钟设官方推荐的稳定的533MHz:
代码主要分为4部分内容:
一.设置锁频时间
二.设置为异步模式
三.设置分频
四.使能锁相环
五、设置对应时钟源寄存器
一、设置锁频时间
ldr r0, =0x7E00F000
ldr r1, =0x0000FFFF
str r1, [r0]
str r1, [r0, #4]
str r1, [r0, #8]
[r0, #4] [r0, #8],分别为MPLL_LOCK,EPLL_LOCK
所谓锁频时间,即系统时钟不输出,等待输出时钟达到设定值的一段时间,如下图红框即为锁频时间:
二、设置为异步模式
#define OTHERS 0x7E00F900
ldr r0, =OTHERS
ldr r1, [r0]
bic r1, r1, #0xc0
str r1, [r0]
loop1:
ldr r0, =OTHERS
ldr r1, [r0]
and r1, r1, #0xf00
cmp r1, #0
bne loop1
这段程序的前半部分用于将OTHERS寄存器的7、8位清零,即设为异步模式:
异步模式,即不工作在同一时钟脉冲,另外可以由时钟框图看到OTHERS寄存器第6位,选择外设时钟来源
三、设置分频
#define ARM_RATIO 0
#define HCLKX2_RATIO 1
#define HCLK_RATIO 1
#define PCLK_RATIO 3
#define MPLL_RATIO 0
#define DIV_0 (ARM_RATIO | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12))
ldr r0, =0x7E00F020
ldr r1, =DIV_0
str r1, [r0]
要设定的分别为ARM_RATIO MPLL_RATIO HCLKX2_ARTIO HCLK_RATIO PCLK_RATIO,他们在时钟框图对应的位置如下:
由APLL倍频以后,DOUTAPLL为533MHz(在后面设定),如果输出533MHz,则不需要分频,ARM_RATIO设为0;
MPLL倍频后DOUTMPLL为533MHz(建议值为266MHz),所以要得到266MHz的HCLKX2需要2分频,由寄存器公式得HCLKX2_RATIO设为1;
HCLK建议频率133,所以要再进行分频,HCLK_RATIO设为1;
按照这个方法,其他的值也可以设定完成了,我们所有的代码都是有理有据(根据芯片手册)!
四、使能分频器
#define APLL_CON_VAL ((1 << 31) | (266 << 16) | (3 << 8) | (1))
ldr r0, =0x7E00F00C
ldr r1, =APLL_CON_VAL
str r1, [r0]
#define MPLL_CON_VAL ((1 << 31) | (266 << 16) | (3 << 8) | (1))
ldr r0, =0x7E00F010
ldr r1, =MPLL_CON_VAL
str r1, [r0]
这俩段代码设定了倍频后的输出频率,以APLL为例分析输出值:
由上面的公式可以算出Fout = 266*12M/(3*2)=533M,当然芯片手册还给出了一个表,直接按表设定,就可以得到想要的频率
五、设置对应时钟源寄存器,为各外设提供时钟
ldr r0, =0x7E00F01C
ldr r1, =0x03
str r1, [r0]
这段代码用来选择时钟源,如下图
OK6410的时钟系统设置好了,感受一下533Mhz的风驰电掣吧(啊哈哈哈),当然你必须自己捋清楚才算是真正掌握了这些内容,如果以上内容有什么不对的地方,不合适的地方多谢指正。