S5PV210体系结构与接口05:时钟系统编程
目录
1. 时钟概念解析
1.1 什么是时钟?
1.2 为什么需要时钟?
1.3 如何获得时钟?
1.3.1 外部晶振
1.3.2 外部晶振 + SoC内部CMU(Clock Management Unit)
1.4 时钟频率的影响
2. S5PV210时钟系统解析
2.1 S5PV210时钟域简介
2.2 S5PV210 CMU框架
2.2.1 CMU的位置
2.2.2 CMU的输入
2.2.3 CMU的输出
2.3 S5PV210时钟关系
2.3.1 MUX开关
2.3.2 DIV分频器
3. S5PV210时钟初始化代码解析
3.1 关键寄存器解析
3.1.1 xPLL_LCOK
3.1.2 xPLL_CONn
3.1.3 CLK_SRCn
3.1.4 CLK_SRC_MASKn
3.1.5 CLK_DIVn
3.1.6 CLK_GATE_x
3.1.7 CLK_DIV_STASn & CLK_MUX_STATn
3.2 时钟系统初始化代码解析
3.2.1 关闭PLL输出
3.2.2 设置各PLL的lock time
3.2.3 设置分频系数
3.2.4 设置PLL倍频参数
3.2.5 使能各PLL
3.3 模块时钟设置示例
3.3.1 在UART端确定采用的时钟源
3.3.2 配置SCLK_UART时钟
3.4 BL0对时钟系统的设置
1. 时钟概念解析
1.1 什么是时钟?
① 按一定电压幅度,一定时间间隔连续发出的脉冲信号
② 时钟频率是每秒产生时钟脉冲的个数
③ 注意时钟信号的占空比特性
1.2 为什么需要时钟?
① 时钟信号是时序逻辑的基础,决定逻辑单元中的状态何时更新
② 时钟是同步工作系统的同步节拍
SoC内部器件(e.g. CPU/DRAM/UART)需要彼此协同工作,因此需要一个同步时钟系统来指挥
1.3 如何获得时钟?
1.3.1 外部晶振
通过SoC的引脚直接引入外部晶振的时钟信号
1.3.2 外部晶振 + SoC内部CMU(Clock Management Unit)
通过外部晶振 + PLL生成高频时钟,再对高频时钟进行分频,供SoC各模块使用。S5PV210就采用这种方式(一般的SoC也均采用这种模式)。
说明1:为什么不采用外部高频晶振直接供SoC使用?
① 高频晶振价格昂贵
② 芯片外部电路不适宜使用过高频率,传导辐射难以控制
说明2:为什么CMU要先倍频再分频?
因为SoC内部各模块使用的频率不同,无法统一供应。因此先通过PLL产生高频时钟,再由各模块根据需要对时钟进行分频使用(有的模块还要分频多次)
1.4 时钟频率的影响
① 一般SoC的时钟频率均可以通过编程设置
② 采用高频时钟可以获得更好的性能,但是能耗也更大
③ 为降低能耗可以关闭SoC内部不使用的外设,关闭方法就是禁用该模块的时钟
2. S5PV210时钟系统解析
2.1 S5PV210时钟域简介
S5PV210将所有时钟划分为3个域进行管理,
① MSYS(main system)
包含时钟:Cortex-A8/DMC/3D/iRAM & iROM/INTC
总线最高频率:200MHz
② DSYS(display system)
包含时钟:与显示相关的时钟(e.g. FIMC/JPEG)
总线最高频率:166MHz
③ PSYS(peripheral system)
包含时钟:与外设相关的时钟(e.g. UART/SPI)
总线最高频率:133MHz
说明1:关于总线频率
S5PV210内部的各个模块通过AMBA总线连接,AMBA总线的高频分支为AHB(AXI)总线,低频分支为APB总线。各时钟域中的HCLK_xxx即为该域中AHB总线的频率;PCLK_xxx即为该域中APB总线的频率。
SoC内部的各个外设挂在总线上工作,所以该外设的时钟来自他挂载的总线。例如串口UART挂在PSYS域下的APB总线,因此串口时钟来源为PCLK_PSYS(当然,UART还可以选择其他时钟源)
说明2:为了获得更好的性能,可以将总线频率配置为最高值(e.g. 三星推荐值)
说明3:三个时钟域通过异步桥连接
2.2 S5PV210 CMU框架
2.2.1 CMU的位置
① CMU属于system controller(SYSCON)的一部分
② SYSCON管理CMU和PMU两个模块
2.2.2 CMU的输入
2.2.2.1 外部晶振
① XXTI
a. 通常情况下CMU和PLL以XXTI为输入产生其他各种时钟
b. XXTI的可使用频率为12 ~ 50MHz,三星推荐使用24MHz的时钟,因为S5PV210中iROM的设计基于24MHz
XXTI推荐匹配iROM是因为系统刚启动时,各PLL尚未工作,此时使用的时钟就是XXTI;而启动流程代码是从iROM开始运行的。
c. X210开发板就使用了24MHz的XXTI晶振
② XUSBXTI
a. 根据CMU框图,只有XXTI和XUSBXTI可以作为PLL的输入(当然,通常使用XXTI)。
b. XUSBXTI还可以作为USB PHY模块的输入,供USB PHY产生SCLK48时钟,该时钟可供USB使用。
c. X210开发板使用了24MHz的XUSBXIT晶振
③ XHDMIXTI
a. XHDMIXTI可以供给VPLL使用,也可以供给HDMI PHY用于生成SCLK54
b. X210开发板使用了27MHz的XHDMIXTI晶振
补充:XRTCXTI晶振专供RTC使用,该晶振指定为32.768KHz
2.2.2.2 USB PHY
以XUSBXTI为输入,产生30MHz和48MHz时钟供USB模块使用
2.2.2.3 HDMI PHY
以XHDMIXTI为输入,产生54MHz时钟供HDMI模块使用
2.2.2.4 PLL
总体来说,各PLL以外部晶振为输入,将其倍频产生高频时钟再作为CMU的输入
具体来说,各PLL的输入和输出如下,
APLL:以FINPLL为输入,产生30MHz ~ 1GHz时钟
MPLL:以FINPLL为输入,产生50MHz ~ 2GHz时钟
EPLL:以FINPLL为输入,产生10MHz ~ 600MHz时钟
VPLL:以FINPLL或SCLK_HDMI27M为输入,产生10MHz ~ 600MHz时钟(但VPLL一般专用于生成54MHz的video clock)
说明:PLL与时钟域的对应关系
a. Cortex-A8和MSYS域时钟使用APLL(e.g. ARMCLK/HCLK_MSYS/PCLK_MSYS)
b. DSYS和PSYS域时钟使用MPLL和EPLL(e.g. / HCLK_DSYS / PCLK_DSYS / HCLK_PSYS /PCLK_PSYS以及其他外设时钟)
但通常使用MPLL
c. video clock使用VPLL
2.2.3 CMU的输出
各时钟域的总线时钟以及在此基础上分频产生的各模块时钟(应为special clock)
2.3 S5PV210时钟关系
2.3.1 MUX开关
用于选择时钟源,对应时钟源寄存器的某几个bit位
说明:glitch-free & non-glitch-free clock mux
glitch-free mux:上图中的灰色mux。glitch-free mux在切换时钟时不会导致故障,前提是保证切换涉及的时钟源均在运行。
non-glitch-free mux:上图中的白色mux。non-glitch-free mux在切换时钟时可能出现故障,因此在切换时钟前建议关闭该mux的输出(通过设置CLK_SRC_MASK寄存器实现)。当时钟切换完成后,再使能该mux的输出。
2.3.2 DIV分频器
分频器是一个硬件设备,可以对时钟源进行n分频(可用分频系数见上图),分频器在编程时也是对应寄存器的某几个bit位
3. S5PV210时钟初始化代码解析
3.1 关键寄存器解析
3.1.1 xPLL_LCOK
① 锁相环产生稳定时钟需要一段时间,xPLL_LOCK寄存器控制PLL所需的锁定时间
② 一般编程时采用默认值即可
③ 通过xPLL_CON寄存器的bit[29]可以查询该PLL是否锁定成功
3.1.2 xPLL_CONn
① xPLL_CONn寄存器的功能,
a. 打开/关闭PLL电路
b. 查看PLL锁定状态
b. 设置PLL倍频参数
② 为确保PLL工作状态稳定,建议采用三星推荐的M/P/S值
3.1.3 CLK_SRCn
① CLK_SRCn寄存器用来设置时钟源,对应时钟关系图中的MUX开关
② APLL_SEL位的初始值位0,所以系统在上电阶段直接使用外部晶振产生的时钟,所以推荐XXTI晶振时钟频率与iROM频率一致(即24MHz)
3.1.4 CLK_SRC_MASKn
① 决定MUX开关的输出是否打开,默认各模块时钟都打开。
② 为降低能耗,可以将不使用的时钟关闭
3.1.5 CLK_DIVn
① CLK_DIVn寄存器决定各模块的分频系数
② CLK_DIVn寄存器的默认值均为0,即系统上电阶段对所有时钟不予分频。因此在系统上电之后时钟初始化之前,SoC各模块均按外部晶振时钟频率工作(推荐24MHz)
3.1.6 CLK_GATE_x
① 类似CLK_SRC_MASK寄存器,根据手册可以根据IP控制模块时钟。
② 具体含义个人并不明确
3.1.7 CLK_DIV_STASn & CLK_MUX_STATn
这两类状态寄存器,分别用来查看DIV和MUX的状态。是变化已经完成,还是正在进行中
3.2 时钟系统初始化代码解析
3.2.1 关闭PLL输出
由于S5PV210时钟体系中存在glitch-free & non-glitch-free mux,为避免故障,在完成时钟系统设置之前,先关闭各PLL输出
3.2.2 设置各PLL的lock time
目前代码中没有采用xPLL_CON寄存器的默认值,而是将其设置为最大值,以此确保PLL锁定成功
3.2.3 设置分频系数
代码中将CLK_DIV0寄存器设置为0x14131440,即按如下方式配置时钟关系,
ARMCLK = MOUT_MSYS / 1
SCLKA2M = SCKLAPLL / 5
HCLK_MSYS = ARMCLK / 5
PCKL_MSYS = HCLK_MSYS / 2
HCLK_DSYS = MOUT_DSYS / 4
PCLK_DSYS = HCLK_DSYS / 2
HCLK_PSYS = MOUT_PSYS / 5
PCLK_PSYS = HCLK_PSYS / 2
3.2.4 设置PLL倍频参数
代码中采用三星推荐值,将APLL设置为1GHz,将MPLL设置为667MHz。由此可得各主要时钟如下,
ARMCLK = MOUT_MSYS / 1 = 1GHz
SCLKA2M = SCKLAPLL / 5 = 200MHz
HCLK_MSYS = ARMCLK / 5 = 200MHz
PCKL_MSYS = HCLK_MSYS / 2 = 100MHz
HCLK_DSYS = MOUT_DSYS / 4 = 166MHz
PCLK_DSYS = HCLK_DSYS / 2 = 83MHz
HCLK_PSYS = MOUT_PSYS / 5 = 133MHz
PCLK_PSYS = HCLK_PSYS / 2 = 66MHz
可见代码中就是按照三星推荐的high-performance方案设置各主要时钟参数
3.2.5 使能各PLL
时钟系统参数设置完成后,打开各PLL,在lock time之后SoC各模块将按照我们设置的值工作
3.3 模块时钟设置示例
在上述时钟系统初始化完成的基础上,以UART0的时钟设置为例,说明SoC模块的时钟设置方法
3.3.1 在UART端确定采用的时钟源
① 根据UCONn寄存器,UART模块可以使用PCLK或SCLK_UART作为时钟源。
② 如果采用PCLK(此处指PCLK_PSYS),则有之前的时钟初始化即可
③ 如果采用SCLK_UART,还需要配置该时钟
3.3.2 配置SCLK_UART时钟
根据时钟关系图,需要配置MUXuart0 & DIVuart0
说明:总体而言,配置一个时钟的基本步骤就是选择时钟源 + 选择分频系数
3.4 BL0对时钟系统的设置
iROM中的BL0按以下参数对时钟系统进行设置,
可见BL0中设置的时钟系统频率比我们代码中的频率低,因此在时钟系统初始化之后,LED的闪烁频率应该加快。
实际测试现象与分析一致。
S5PV210体系结构与接口05:时钟系统编程相关推荐
- S5PV210体系结构与接口12:I2C编程
目录 1. I2C总线工作原理 1.1 概述 1.2 总线寻址 1.2.1 7位地址模式 1.2.2 从设备地址的确定 1.2.3 10位地址模式 1.3 总线时序 1.3.1 空闲态 & s ...
- S5PV210体系结构与接口06:串口编程
目录 1. 串口通信基本概念 1.1 通信基础概念 1.1.1 电平信号 & 差分信号 1.1.2 串行通信 & 并行通信 1.1.3 异步串行通信 & 同步串行通信 1.2 ...
- S5PV210体系结构与接口03:GPIO编程
目录 1. GPIO功能简介 1.1 什么是GPIO? 1.2 GPIO作用 1.3 GPIO的构成(data sheet层面) 2. S5PV210芯片GPIO控制器简介 2.1 总额及分类 2.2 ...
- S5PV210体系结构与接口02:ARM编程模型 汇编指令
目录 1. ARM的基本设定 1.1 ARM数据类型 1.1.1 基本数据类型 1.1.2 浮点数据类型 1.1.3 存储器大小端 1.2 支持的指令集 2. Cortex-A8编程模型 2.1 处理 ...
- S5PV210体系结构与接口10:MMU编程
目录 1. MMU概述 1.1 VMSA概述 1.2 MMU作用 2. MMU地址转换详解 2.1 总体流程图示 2.1.1 概述 2.1.2 设置TTB相关寄存器 2.2 一级页表解析 2.2.1 ...
- S5PV210体系结构与接口07:中断系统编程
目录 1. 什么是按键 1.1 按键原理与连接 1.2 按键的2种响应方式 1.2.1 轮询方式 1.2.2 中断方式 1.3 轮询方式处理按键解析 1.4 按键消抖 1.4.1 按键抖动 1.4.2 ...
- S5PV210体系结构与接口11:NandFlash SD卡编程
目录 1. Flash ROM简介 1.1 概述 1.2 Nor & Nand Flash比较 1.2.1 接口对比 1.2.2 容量和成本对比 1.2.3 可靠性对比 1.2.4 使用寿命对 ...
- S5PV210体系结构与接口08:定时器 计数器编程
目录 1. S5PV210 PWM模块解析 1.1 结构概述 1.1.1 时钟选择 1.1.2 两级分频 1.1.3 输出特征 1.2 工作模式 1.2.1 工作流程 1.2.2 TCNT & ...
- S5PV210体系结构与接口09:SD卡启动详解
目录 1. MMC技术演进 1.1 NandFlash & NorFlash芯片 1.2 MMC卡 & SD卡 & MicroSD卡(TF卡) 1.2.1 代际关系 1.2.2 ...
最新文章
- asp.net序列化
- pytorch 多进程队列
- NOIP2006提高组 能量项链
- 关于调试windows services的方法
- linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆
- 自定义SharePoint 2013 元数据选择控件
- Airflow 中文文档:快速开始
- 基于JAVA+SpringMVC+Mybatis+MYSQL的企业通用门户网站官网
- 寻找最优秀AI公司 | 量子位2018年度评选启幕
- LINUX终端可以使用reset清除所有输出
- a as as big rat_12句英语绕口令,你能一口气读完几句?
- 经验分享:半小时建立自己的在线管理系统!
- ApplicatioinRunner vs CommandLineRunner
- 推荐25种自媒体运营必备工具 (建议收藏)
- AGV资料学习参考 AGV调度系统地图建模参考文件 AGV调度系统源码(OpenTCS) AGV调度系统地 多AGV调度系统实现图建模参考文件c++
- PCB设计之EMC 47原则
- Zabbix 通过shell脚本监控PostgreSQL
- 德尔福ESR雷达测试
- (附源码)计算机毕业设计ssm高校勤工助学管理系统
- 应用大数据助力车险反欺诈
热门文章
- 怎么把video文件改成mp4_GiliSoft Video Converter将MP4视频转换成M4V格式教程
- 本地提交到yarn_Yarn运行Flink作业 0449
- 模拟角频率和数字角频率的关系
- 线程池框架-Executor
- matlab做信号实验需要安装那些模块_无人机基于Matlab/Simulink的模型开发(连载一)...
- 【编程语言】Python-Pandas库中的交叉表
- mysql ---- 多表查询
- 怎么卡我的世界服务器物品,我的世界手机版卡BUG刷物品方法攻略
- unity 导入gltf_Unity3D使用glTF格式三维文件,glTF在unity中如何呈现,glTF导入unity
- spring 事务的实现方式和原理_spring整合atomikos实现分布式事务