3.0时钟简介

时钟是同步工作系统的工作节拍
例如:

工人按照工作时间上下班
舞者根据音乐节拍做出不同的动作
正步时教官念的121

为什么需要时钟?

SoC内部需要一个同步的时钟系统来协调各个内部外设和CPU的工作

SoC的时钟获得方式:

1.SoC有个引脚用于输入外部时钟源信号,用的很少。
2.外部晶振+内部时钟发生器产生时钟,大部分低频单片机常用。
3.外部晶振+内部时钟发生器+内部PLL产生高频时钟+内部分频器分频得到各种频率的时钟,ARM,stm32使用这些。

为什么外部不直接用高频晶振产生高频信号直接给CPU?

高频晶振易产生传导辐射影响周遭电路,因此SoC外围电路不宜使用高频;
高频率的晶振太贵了。

为什么要内部先高频然后再分频?

主要因为SoC内部各部件所需时钟频率不同,没法统一供应。
因此设计思路是PLL后先得到一个最高的频率(1GHz、1.2GHz)作为主频,然后各外设都有自己的分频器再来分频得到自己想要的频率。

3.1时钟域

210根据 “各设备所需时钟频率的高低和设备的类别” 将整个时钟体系分成三个时钟域,即主系统(MSYS)、显示系统(DSYS)和外围系统(PSYS),如图3-1所示。

•MSYS域包括CortexA8处理器、DRAM内存控制器(DMC0和DMC1)、IRAM和IROM…
•DSYS域都是和视频显示、编解码等有关的模块
•PSYS域和内部各种外设时钟有关,譬如串口、SD接口、I2C等。

3.2时钟声明

210时钟来源:晶振+时钟发生器+PLL+分频电路

S5PV210外部有4个晶振接口,设计板子硬件时可以根据需要来决定在哪里接晶振。接了晶振之后上电相应的模块就能产生振荡,产生原始时钟。原始时钟再经过一系列的筛选开关进入相应的PLL电路生成倍频后的高频时钟。高频时钟再经过分频到达芯片内部各模块上。(有些模块,譬如串口内部还有进一步的分频器进行再次分频使用)

在典型的210应用程序中,

•CortexA8和MSYS时钟域使用APLL(即ARMCLK、HCLK_MSYS和PCLK_MSYS)。
•DSYS和PSYS时钟域(即HCLK_DSYS、HCLK_PSYS、PCLK_DSYS和PCLK_PSYS)和其他外设时钟(即音频IP、SPI等)使用MPLL和EPLL。
•视频时钟使用VPLL。

3.3时钟关系

210时钟域详解
MSYS域:

ARMCLK: 给cpu内核工作的时钟,也就是主频
HCLK_MSYS: MSYS域的高频时钟,给DDR0和DDDR1使用
PCLK_MSYS: MSYS域的低频时钟
HCLK_IMEM:给iROM和iRAM(合称iMEM)使用

DSYS域:

HCLK_DSYS:DSYS域的高频时钟
PCLK_DSYS:DSYS域的低频时钟

PSYS域:

HCLK_PSYS:PSYS域的高频时钟
PCLK_PSYS:PSYS域的低频时钟

总结:

210内部的各个外设都是接在(内部AMBA总线)总线上面的,AMBA总线有1条高频分支叫AHB,有一条低频分支叫APB。上面的各个域都有各自对应的HCLK_XXX和PCLK_XXX,其中HCLK_XXX就是XXX这个域中AHB总线的工作频率;PCLK_XXX就是XXX这个域中APB总线的工作频率。
SoC内部的各个外设其实是挂在总线上工作的,也就是说这个外设的时钟来自于他挂在的总线,譬如串口UART挂在PSYS域下的APB总线上,因此串口的时钟来源是PCLK_PSYS。
我们可以通过记住和分析上面的这些时钟域和总线数值,来确定我们各个外设的具体时钟频率。

高性能的时钟值:

• freq(ARMCLK) = 1000 MHz
• freq(HCLK_MSYS) = 200 MHz
• freq(HCLK_IMEM) = 100 MHz
• freq(PCLK_MSYS) = 100 MHz
• freq(HCLK_DSYS) = 166 MHz
• freq(PCLK_DSYS) = 83 MHz
• freq(HCLK_PSYS) = 133 MHz
• freq(PCLK_PSYS) = 66 MHz
• freq(SCLK_ONENAND) = 133 MHz, 166 MHz

3.4时钟框图分析

(1)时钟框位置:数据手册P361&P362
(2)两张图之间是渐进的关系。第一张图从左到右依次完成了原始时钟生成->PLL倍频得到高频时钟->初次分频得到各总线时钟;第二张图是从各中间时钟(第一张图中某个步骤生成的时钟)到各外设自己使用的时钟(实际就是个别外设自己再额外分频的设置)。
(3)要看懂时钟体系框图,2个符号很重要:一个是MUX开关,另一个是DIV分频器。
(3.1)MUX开关是数据选择器,实际编程时对应某个寄存器的某几位的设置,设置值决定了不同的时钟来源。
(3.2)DIV分频器,是一个硬件设备,可以对频率进行n分频生成低频时钟,实际编程时对应某个寄存器中的某几位的设置,设置值决定了不同的分频系数(譬如左边进来的时钟是80MHz,分频系数设置为8,则分频器右边输出的时钟频率为10MHz)。

3.7寄存器分析

xPLL_LOCK寄存器用于控制PLL的锁定周期
xPLL_CONn寄存器用于打开/关闭PLL电路,设置PLL的倍频参数,查看PLL锁定状态等
CLK_SRCn寄存器用于选择时钟来源,对应时钟框图中的MUX开关。
CLK_DIVn寄存器用于设置时钟分频

210设置高性能时钟值的步骤

目的:(将对应时钟设置成如下数值)

• freq(ARMCLK) = 1000 MHz
• freq(HCLK_MSYS) = 200 MHz
• freq(HCLK_IMEM) = 100 MHz
• freq(PCLK_MSYS) = 100 MHz
• freq(HCLK_DSYS) = 166 MHz
• freq(PCLK_DSYS) = 83 MHz
• freq(HCLK_PSYS) = 133 MHz
• freq(PCLK_PSYS) = 66 MHz
• freq(SCLK_ONENAND) = 133 MHz, 166 MHz

第1步:先将所有MUX开关置0,保证设置完PLL后再设置为1导通倍频过的时钟。
寄存器查看:

这里设置值为0x0

第2步:设置PLL锁定时间。
寄存器查看:
默认值为0x0FFF,保险起见我们设置为0xFFFF。

第3步:设置分频系数,决定由PLL倍频后出来的最高时钟如何分频得到各个分时钟。
寄存器查看:
这里设置值为0x14131440

第4步:设置PLLL的倍频系数(M、P、S)并使能PLL,决定输入端24MHz的原始频率经倍频后能得到多大的时钟频率。
寄存器查看:


数据手册推荐的倍频系数的设置:

第5步:MUX开关置1,经PLL倍频后的时钟开始工作。

这里设置值为0x10001111。

clock.S:

#define  CLOCK_START 0xE0100000
#define CLOCK_START                     0xE0100000#define CLK_SRC0_OFFSET                   0x200
#define APLL_LOCK_OFFSET                0x0
#define MPLL_LOCK_OFFSET                0x8
#define CLK_DIV0_OFFSET                 0x300#define    APLL_CON0_OFFSET                0x100
#define APLL_MDIV                       0x7d
#define APLL_PDIV                       0x3
#define APLL_SDIV                       0x1
#define set_apll(mdiv , pdiv , sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv<<0)
#define SET_APLL_DAT                    set_apll(APLL_MDIV , APLL_PDIV  , APLL_SDIV)#define MPLL_CON0_OFFSET                0x108
#define MPLL_MDIV                       0x29b
#define MPLL_PDIV                       0xc
#define MPLL_SDIV                       0x1
#define set_mpll(mdiv , pdiv , sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv<<0)
#define SET_MPLL_DAT                    set_mpll(MPLL_MDIV , MPLL_PDIV , MPLL_SDIV)
.global _setclock
_setclock:/*所有mux置0*/ldr r0, =CLOCK_STARTldr r1, =0x0str r1, [r0, #CLK_SRC0_OFFSET]/*设置PLL锁定时间*/ldr r1, =0xFFFFstr r1, [r0, #APLL_LOCK_OFFSET]str r1, [r0, #MPLL_LOCK_OFFSET]/*分频*/ldr r1, =0x14131440  str r1, [r0, #CLK_DIV0_OFFSET]/*设置PLL倍频,并使能PLL*/ldr r1, =SET_APLL_DATstr r1, [r0, #APLL_CON0_OFFSET]ldr r1, =SET_MPLL_DATstr r1, [r0, #MPLL_CON0_OFFSET]/*部分mux置1*/ldr r1, [r0, #CLK_SRC0_OFFSET]ldr r2, =0x10001111orr r1, r1, r2str r1, [r0, #CLK_SRC0_OFFSET]mov pc, lr

clock.c:

#define  CLOCK_START                     0xE0100000#define CLK_SRC0_OFFSET                   0x200
#define APLL_LOCK_OFFSET                0x0
#define MPLL_LOCK_OFFSET                0x8
#define CLK_DIV0_OFFSET                 0x300
#define APLL_CON0_OFFSET                0x100
#define MPLL_CON0_OFFSET                0x108#define rClock_Start                   *((volatile unsigned int*)(SET_CLOCK_START))
#define rCLK_SRC0                       *((volatile unsigned int*)(SET_CLOCK_START+CLK_SRC0_OFFSET))
#define rAPLL_LOCK                      *((volatile unsigned int*)(SET_CLOCK_START+APLL_LOCK_OFFSET))
#define rMPLL_LOCK                      *((volatile unsigned int*)(SET_CLOCK_START+MPLL_LOCK_OFFSET))
#define rCLK_DIV0                       *((volatile unsigned int*)(SET_CLOCK_START+CLK_DIV0_OFFSET))
#define rAPLL_CON0                      *((volatile unsigned int*)(SET_CLOCK_START+APLL_CON0_OFFSET))
#define rMPLL_CON0                      *((volatile unsigned int*)(SET_CLOCK_START+MPLL_CON0_OFFSET))#define   APLL_MDIV                       0x7d
#define APLL_PDIV                       0x3
#define APLL_SDIV                       0x1
#define set_apll(mdiv , pdiv , sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv<<0)
#define SET_APLL_DAT                    set_apll(APLL_MDIV , APLL_PDIV  , APLL_SDIV)
#define MPLL_MDIV                       0x29b
#define MPLL_PDIV                       0xc
#define MPLL_SDIV                       0x1
#define set_mpll(mdiv , pdiv , sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv<<0)
#define SET_MPLL_DAT                    set_mpll(MPLL_MDIV , MPLL_PDIV , MPLL_SDIV)void clock_test(void)
{/*关mux*/rCLK_SRC0 = 0;/*设置PLL锁定时间*/rAPLL_LOCK = 0xFFFF;rMPLL_LOCK = 0xFFFF;/*分频*/rCLK_DIV0 = 0x14131440;/*设置PLL倍频,并开PLL*/rAPLL_CON0 = SET_APLL_DAT;rMPLL_CON0 = SET_MPLL_DAT;/*开mux*/rCLK_SRC0 = 0x10001111;
}

S5PV210的时钟系统相关推荐

  1. ARM芯片的时钟系统详解(S5PV210芯片)

    1.时钟介绍 时钟是同步工作系统的同步节拍,时钟的快慢就是我们常说的工作频率,以赫兹(HZ)为单位.时钟系统指导器件的运行,我们分析器件的工作特性时,常常会看器件的时序图,时序图中的时钟周期就是时钟系 ...

  2. 嵌入式Linux裸机开发(六)——S5PV210时钟系统

    嵌入式Linux裸机开发(六)--S5PV210时钟系统 一.时钟系统简介 外设工作需要一定频率的时钟,这些时钟都由系统时钟提供.系统时钟一般由外部低频24MHZ晶体振荡器通过锁相环电路PLL倍频产生 ...

  3. S5PV210体系结构与接口05:时钟系统编程

    目录 1. 时钟概念解析 1.1 什么是时钟? 1.2 为什么需要时钟? 1.3 如何获得时钟? 1.3.1 外部晶振 1.3.2 外部晶振 + SoC内部CMU(Clock Management U ...

  4. s5pv210——时钟系统

    以下内容源于朱友鹏<物联网大讲坛>课程的学习,以及博客http://www.cnblogs.com/biaohc/p/6349195.html,以及用户手册,如有侵权,请告知删除. 一.s ...

  5. TQ210——时钟系统

    TQ210--时钟系统 1.时钟域 一般来讲, MCU 的主时钟来源主要是外部晶振或外部时钟,比较常见的是 外 部晶振.一般情况,系统内所使用的时钟都是高频率的时钟,外部晶振一般达不到那么高的频率,所 ...

  6. STM32的时钟系统RCC详细整理

    一.综述: 1.时钟源 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz: ②HSE是高速外部时钟,可接石英/陶瓷谐 ...

  7. 【STM32】标准外设库,系统架构,时钟系统

    文章目录 标准外设库 系统架构 时钟系统 标准外设库 官方库目录列表如下:STM32 标准外设库 工程结构:STM32 不完全手册中新建出来的工程模板 系统架构 STM32 系统架构的知识可以在< ...

  8. STM32开发 -- 时钟系统详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81558649 上一篇文章讲了RTC,里面其实已经包含了时钟系统的介绍了.这篇 ...

  9. STM32的时钟系统RCC详细整理(转)

    一.综述: 1.时钟源 在 STM32 中,一共有 5 个时钟源,分别是 HSI . HSE . LSI . LSE . PLL . ①HSI 是高速内部时钟, RC 振荡器,频率为 8MHz : ② ...

最新文章

  1. wpf在presenter(VM)中异步更新viewer中数据
  2. python os.environ gpu_Tensorflow下如何实现多GPU数据并行训练?
  3. redis高并发抽奖
  4. [Android] 图像各种处理系列文章合集
  5. php左连接,如何在php中对左联接查询返回的数组数据进...
  6. 如何使用Hibernate批处理DELETE语句
  7. java swing简介
  8. Android 设置闹铃步骤和基础代码
  9. js去掉a链接点击后产生的虚线(兼容火狐)
  10. 使用ToStringBuilder.reflectionToString重写toString方法
  11. 基于51单片机的电子秤设计
  12. 柔性机械臂_机械臂位置控制概述
  13. 【Redis总结-基础入门】
  14. 第九届蓝桥杯B组省赛。
  15. Qt介绍---QPA(Qt Platform Abstraction)
  16. VMX(1) -- 简介
  17. 人民币小写金额转大写
  18. 多数据源动态优雅切换
  19. kanzi安装和使用
  20. ApacheCN 公众号文章汇总 2019.6

热门文章

  1. 机器学习中的数学原理——F值与交叉验证
  2. centos镜像(阿里云centos镜像)
  3. 原来华展云还能这么玩? 玩转华展云之——官网风云
  4. SAS学习1(总体介绍以及一些程序例子)
  5. 分享:Vue.js新手入门指南-0518-v1.0张雅慧
  6. 考研数据结构学习与总结笔记---1.1数据结构的基本概念
  7. mysql socket socat_socat在Windows下的使用
  8. Unity新手必备5款宝藏插件--价值上千元白嫖最新版
  9. 使用TUTK的sdk實現移动端和设备P2P連接
  10. 语音合成(speech synthesis)方向六:歌唱合成(singing voice synthesis)