OK6410系统时钟初始化详解


首先简单介绍一下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]

0x7E00F00 即  APLL_LOCK 寄存器,用来设置变频锁定时间

[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]

这段代码用于设定CLK_DIV0的值


要设定的分别为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的风驰电掣吧(啊哈哈哈),当然你必须自己捋清楚才算是真正掌握了这些内容,如果以上内容有什么不对的地方,不合适的地方多谢指正。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值