参考:

1)《USER'S MANUAL-S3C6410X》第三章 SYSTEM CONTROLLER

2)u-boot/board/samsumg/smdk6410/lowlevel_init.S

1. PLL与CLK的关系:

详细关系图见用户手册122页Figure 3-2 The block diagram of clock generator。

三种PLL:APLL,MPLL,EPLL

四种CLK:ACLK,HCLK,PCLK

1)APLL产生ACLK,,ACLK为CPU提供时钟;

2)同步模式下APLL产生HCLK/PCLK,异步模式下MPLL产生HCLK/PCLK,HCLK为AXI/AHB总线上的外设提供时钟,PCLK为APB总线上的外设提供时钟;

3)EPLL主要为音频相关的外设提供时钟;

2. 时钟初始化的步骤

假设我们的目标时钟大小为:

ACLK: 532M

HCLK: 133M

PCLK: 66.5M

1)设置同步/异步模式

寄存器:OTHERS

地址:0x7E00F900

方法:

同步模式:设置[7][6]位为11,等待[11:8]位变成1111;

异步模式:设置[7][6]位为00,等待[11:8]位变成0000;

2)设置各PLL的锁定时间

寄存器:

APLL_LOCK

MPLL_LOCK

EPLL_LOCK

地址:

0x7E00F000

0x7E00F004

0x7E00F008

方法:

将三种PLL的锁定时间均设成最大值0xffff。

3)设置各CLK的分频系数

寄存器:

CLK_DIV0

地址:

0x7E00F020

方法:

各个CLK的输出频率,输入频率,分频系数的关系如下图:

为了得到预期的频率(532_133_66),各个RATIO取如下值:

  1. #define PCLK_RATIO 3 //PCLK=266M/(3+1)=66.5M
  2. #define HCLKX2_RATIO 1 //HCLKX2=532/(1+1)=266M
  3. #define HCLK_RATIO 1 //HCLK=266/(1+1)=133M
  4. #define MPLL_RATIO 1
  5. #define ARM_RATIO 0 //ACLK=532M/(0+1)=532M
  6. #define CLK_DIV0_VAL
  7. ((PCLK_RATIO<<)|(HCLKX2_RATIO<<)|(HCLK_RATIO<<)|(MPLL_RATIO<<)|(ARM_RATIO))

4)设置各PLL的输出频率

寄存器:

APLL_CON

MPLL_CON

EPLL_CON0

EPLL_CON1

地址:

0x7E00F00C

0x7E00F010

0x7E00F014

0x7E00F018

方法:

(1)APLL/MPLL

APLL_CON/MPLL_CON中有三个参数:MDIV,PDIV,SDIV共同决定APLL/MPLL的输出频率:

FOUT = MDIV * FIN / (PDIV * 2^SDIV)

FIN,FOUT,MDIV,PDIV,SDIV的常见组合如下:

这里我们要产生533M的APLL/MPLL,故MDIV,PDIV,SDIV的取值如下:

  1. #define APLL_MDIV 266
  2. #define APLL_PDIV 3
  3. #define APLL_SDIV 1
  4. #define APLL_CON_VAL ((1<<31)|(APLL_MDIV<<16)|(APLL_PDIV<<8)|(APLL_SDIV))
  5.  
  6. #define MPLL_MDIV 266
  7. #define MPLL_PDIV 3
  8. #define MPLL_SDIV 1
  9. #define MPLL_CON_VAL ((1<<31)|(MPLL_MDIV<<16)|(MPLL_PDIV<<8)|(MPLL_SDIV))

(2)EPLL

EPLL_CON0和EPLL_CON1中四个参数:MDIV,PDIV,SDIV,KDIV共同决定EPLL的输出频率:

FOUT = (MDIV + KDIV / 2^16 ) * FIN / (PDIV * 2 ^SDIV)

FIN,FOUT,MDIV,PDIV,SDIV,KDIV的常见组合如下:

这里我们要产生96M的EPLL,故MDIV,PDIV,SDIV,KDIV的取值如下:

  1. #define EPLL_MDIV 32
  2. #define EPLL_PDIV 1
  3. #define EPLL_SDIV 2
  4. #define EPLL_KDIV 0
  5. #define EPLL_CON0_VAL ((1<<31)|(EPLL_MDIV<<16)|(EPLL_PDIV<<8)|(EPLL_SDIV))
  6. #define EPLL_CON1_VAL (EPLL_KDIV)

5)选择时钟源

寄存器:

CLK_SRC

地址:

0x7E00F01C

方法:

我们选择PLL的输出作为时钟源,设置CLK_SRC的低三位为111。

3. 时钟初始化的汇编代码实现

  1. clock.S
  1. /*
  2. ACLK: 532M
  3. HCLK: 133M
  4. PCLK: 66M
  5. */
  6. #include "clock.h"
  7.  
  8. .global clock_init
  9.  
  10. clock_init:
  11. ldr r0, =ELFIN_CLOCK_POWER_BASE
  12.  
  13. /*step1: set synchronous mode*/
  14. ldr r1, [r0, #OTHERS_OFFSET]
  15. mov r2, #0x40
  16. orr r1, r1, r2
  17. str r1, [r0, #OTHERS_OFFSET]
  18.  
  19. nop
  20. nop
  21. nop
  22. nop
  23. nop
  24.  
  25. mov r2, #0x80
  26. orr r1, r1, r2
  27. str r1, [r0, #OTHERS_OFFSET]
  28.  
  29. check_syncack:
  30. ldr r1, [r0, #OTHERS_OFFSET]
  31. mov r2, #0xf00
  32. and r1, r1, r2
  33. cmp r1, #0xf00
  34. bne check_syncack
  35.  
  36. /*step2: set pll lock time*/
  37. mov r1, #0xff00
  38. orr r1, r1, #0xff
  39. str r1, [r0, #APLL_LOCK_OFFSET]
  40. str r1, [r0, #MPLL_LOCK_OFFSET]
  41. str r1, [r0, #EPLL_LOCK_OFFSET]
  42.  
  43. /*step3: set clk divider ratio*/
  44. ldr r1, [r0, #CLK_DIV0_OFFSET]
  45. bic r1, r1, #0xff00
  46. bic r1, r1, #0x00ff
  47. ldr r2, =CLK_DIV0_VAL
  48. orr r1, r1, r2
  49. str r1, [r0, #CLK_DIV0_OFFSET]
  50.  
  51. /*step4: set pll output frequency*/
  52. ldr r1, =APLL_CON_VAL
  53. str r1, [r0, #APLL_CON_OFFSET]
  54. ldr r1, =MPLL_CON_VAL
  55. str r1, [r0, #MPLL_CON_OFFSET]
  56. ldr r1, =EPLL_CON0_VAL
  57. str r1, [r0, #EPLL_CON0_OFFSET]
  58. ldr r1, =EPLL_CON1_VAL
  59. str r1, [r0, #EPLL_CON1_OFFSET]
  60.  
  61. /*step5: set clk src*/
  62. ldr r1, [r0, #CLK_SRC_OFFSET]
  63. mov r2, #0x7
  64. orr r1, r1, r2
  65. str r1, [r0, #CLK_SRC_OFFSET]
  66.  
  67. /*wait at least 200us to stablize all clock*/
  68. mov r1, #0x10000
  69. : subs r1, r1, #
  70. bne 1b
  71.  
  72. mov pc, lr
  1. 4. 实验验证
  1. 编写一个流水灯的裸机程序,对比进行时钟初始化和不进行时钟初始化两种情况下流水灯闪烁的快慢。
  1. 频率对比如下:
  APLL MPLL EPLL ACLK HCLKX2 HCLK PCLK
默认值(M) 400 133 97.7 400 133 133 66.5
当前值(M) 532 266 96 532 266 133 66.5
  1. 不进行时钟初始化时,CPU的默认频率是400M
  1. 进行时钟初始化后,CPU的频率是532M
  1. 故在时钟初始化的情况下,流水灯的闪烁速度要快一些。
  1. 实验代码这里不贴出,点击可下载。

s3c6410_时钟初始化的更多相关文章

  1. LPC1788系统时钟初始化

    #ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock  120000000  ...

  2. dsPIC33EP 时钟初始化程序

    //文件名p33clk.h #ifndef _P33CLK_H_ #define _P33CLK_H_ //#include "p33clk.h" #define WDT_ENB ...

  3. STM32_3 时钟初始化分析

    在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ...

  4. ARM系统时钟初始化

    2440时钟体系,12MHz的晶振 6410时钟体系,12MHz的晶振 210时钟体系,24MHz晶振 时钟初始化:1.设置locktime 2.设置分频系数 4.设置CPU到异步工作模式 3.设置f ...

  5. s3c6410时钟初始化

        今天自己写bootloader做时钟初始化时遇到的问题,特记录下来.为了方便理解,我大部分都有截图, 在此我先说明下,图均来自数据手冊.也希望看了本篇文章的同志多多參看数据手冊才干理解的更加透 ...

  6. X-005 FriendlyARM tiny4412 uboot移植之时钟初始化

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  7. u-boot分析(六)----时钟初始化

    u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1.       ...

  8. STM32时钟初始化函数SystemInit()详解【转】

    花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVM ...

  9. ARM时钟初始化

    2440: S3C2440可以使用外部晶振(XTIpll)(默认为12MHZ)和外部时钟(EXTCLK)两种方式输入时钟信号.它由跳线OM[3:2]决定.S3C2440 默认的工作主频为12MHz(晶 ...

随机推荐

  1. xcode 插件管理工具

    每次xcode 更新后之前安装的插件 都失效了!解决办法: 一.可以通过在原插件项目infoplist新增 新xcode的 DVTPlugInCompatibilityUUID 来使之支持新版xcod ...

  2. JAVA如何将PDF转换SWF格式的FLASH

    1. 需要用到的工具 SWFTools 下载地址 http://www.swftools.org/download.html,下载完成以后,直接安装就行  2.下面就是重点喽,详见Java代码解析 附 ...

  3. ruby迭代器枚举器

    迭代器一个迭代器是一个方法,这个方法里面有yield语句,使用了yield的方法叫做迭代器,迭代器并非一定要迭代,与传递给这个方法的块进行数据传输 yield将数据传给代码快,代码块再把数据传输给yi ...

  4. 第4章 管道和FIFO

    4.1 管道 管道是由pipe函数创建的,提供一个单向数据流. 头文件 #include <unistd.h> 函数原型 int pipe(int fd[2]); 返回值 成功则为0,出错 ...

  5. 最大公约数Greatest Common Divisor(GCD)

    一 暴力枚举法 原理:试图寻找一个合适的整数i,看看这个整数能否被两个整形参数numberA和numberB同时整除.这个整数i从2开始循环累加,一直累加到numberA和numberB中较小参数的一 ...

  6. tony_linux下网站压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:wget http:// ...

  7. 九度OJ1081

    这道题又一次更新了我的世界观与人生观Orz……最开始我是设计了一个O(n)的递推算法,本以为可以轻松AC没想到居然TLE了……然后搜了一下题解,才发现这道题要用矩阵的思想去做. 通过对题目的分析,我们 ...

  8. Fedora 14配置vsftp服务步骤

    Fedora 14配置vsftp服务步骤:1:检查Fedora14是否安装了vsftp服务    用rpm -qa|grep vsftp命令检查是否安装了vsftp服务,如果安装了,会显示安装好的版本 ...

  9. springMVC3 ckeditor3.6 图片上传 JS回调

    一.引入js文件 <script type="text/javascript" src="<%=base %>/resources/ckeditor/c ...

  10. 菜鸟-手把手教你把Acegi应用到实际项目中(2)

    上一篇是基于BasicProcessingFilter的基本认证,这篇我们改用AuthenticationProcessingFilter基于表单的认证方式. 1.authenticationProc ...