6410的系统时钟设置(中)---相关寄存器介绍

上篇中已经详细分析了6410时钟系统的结构,现在就介绍下几个与时钟设置相关的寄存器。

 

1.APLL_LOCK、MPLL_LOCK、EPLL_LOCK

 

 

 

这三个寄存器的低十六位分别表示APLL、MPLL、EPLL这三个锁相环"锁相"所需的时间(周期数),当锁相环的输入或设置改变后,只有经历这么多个周期数后,才让锁相环有输出,这里一般保留默认值(同时也是允许的最大值)0xffff,这个数大可以保证锁相环始终能有稳定的输出。

 

 

2.APLL_CON、MPLL_CON、EPLL_CON0、EPLL_CON1

这几个寄存器包含了三个PLL的配置信息。这里只介绍APLL_CON和MPLL_CON。

 

 

APLL_CON/MPLL_CON寄存器中重要的几个位域:[31]ENABLE、[25:16]MDIV、[13:8]PDIV、[2:0]SDIV。其中ENABLE位控制相应锁相环的使能,另外三个位域负责产生输出时钟。

锁相环输出时钟=晶振时钟*MDIV/(PDIV*(2^SDIV))。

其他的注意事项和说明在上图中已标出。

 

 

3.CLK_DIV0、CLK_DIV1、CLK_DIV2

这些都是为外设进行分频的寄存器。对于设置内核时钟和AHB、APB的总线时钟来说,我们只需要了解CLK_DIV0的几个位域即可。

 

 

这四个位域的作用在上篇中已经介绍过了,这里不再赘述。

 

 

4.CLK_SRC

这个寄存器是为各个时钟选择源。我们只用它的低两位来为MOUT(MPLL)和MOUT(APLL)来选择源。当对应位为0时,表示选择FIN作为源,相当于没有用到相应的PLL;当对应位为1时,表示选择FOUT作为源,PLL就起到了作用。

(忘了MOUT(MPLL)和MOUT(APLL)分别指什么??参考上篇中的Figure3.5或Figure3.4,这两个都用小红框圈着,找找看)

 

 

 

5.OTHERS

这个寄存器我们只需要用到下面几个位域:

SYNCMUXSEL就是选择同步模式还是异步模式的。其他两个位域在三星提供的User Manaul里并没有过多的说明,我现在还不是特别清楚他们的作用。我是分析了Uboot1.1.6中的代码后才知道几个位的用法。下面是Uboot1.1.6中board\samsung\smdk6410目录下的lowlevel_init.S文件中与OTHERS寄存器的这些位相关的设置部分:

 (下面的注释是笔者自己加进去的,Uboot源码中并没有)

[html]  view plain copy
  1. #ifdef  CONFIG_SYNC_MODE  
  2.     ldr r1, [r0, #OTHERS_OFFSET]  
  3.     mov r2, #0x40  
  4.     orr r1, r1, r2  
  5.     str r1, [r0, #OTHERS_OFFSET]  
  6.                             ;向SYNCMUXSEL位写1  
[html]  view plain copy
  1. nop  
  2. nop  
  3. nop  
  4. nop  
  5. nop  
  6.                         ;等待几个时钟  
  7. ldr r2, =0x80  
  8. orr r1, r1, r2  
  9. str r1, [r0, #OTHERS_OFFSET]            ;向SYNCMODE为写1  
  10.   
  11. heck_syncack:  
  12. ldr r1, [r0, #OTHERS_OFFSET]  
  13. ldr r2, =0xf00  
  14. and r1, r1, r2  
  15. cmp r1, #0xf00  
  16. bne check_syncack               ;然后等待SYNCACK位域变成1111(即0xf)  
  17.                       
[html]  view plain copy
  1. ;------------上面是同步模式下的操作方式,下面是异步模式下的操作方式。----------------------------  
[html]  view plain copy
  1.    
[html]  view plain copy
  1. #else   /* ASYNC Mode */  
  2.     nop  
  3.     nop  
  4.     nop  
  5.     nop  
  6.     nop  
  7.   
  8.     ldr r1, [r0, #OTHERS_OFFSET]  
  9.     bic r1, r1, #0xC0  
  10.     orr r1, r1, #0x40  
  11.     str r1, [r0, #OTHERS_OFFSET]            ;先将SYNCMODE位清零  
[html]  view plain copy
  1. wait_for_async:  
  2.    ldr r1, [r0, #OTHERS_OFFSET]  
  3.    and r1, r1, #0xf00  
  4.    cmp r1, #0x0  
  5.    bne wait_for_async                 ;等待SYNCACK位域变为0  
[html]  view plain copy
  1. <p>    ldr r1, [r0, #OTHERS_OFFSET]  
  2.    bic r1, r1, #0x40  
  3.    str r1, [r0, #OTHERS_OFFSET]           ;将SYNCMUXSEL位清零</p>  
[html]  view plain copy
  1.    

 

我们编程的时候也按着这个顺序来即可。(路过的大神如果哪位知道哪里有关于这几个位的详细说明请一定要留上一言,为以后可能经过这里的新手们提供点帮助)

 

 

时钟这块重要的寄存器就是这几个。下篇中直接贴出C源码供路过的菜鸟们参考。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值