TQ210——时钟系统

TQ210——时钟系统

 

1、时钟域

      一般来讲, MCU 的主时钟来源主要是外部晶振或外部时钟,比较常见的是 外 部晶振。一般情况,系统内所使用的时钟都是高频率的时钟,外部晶振一般达不到那么高的频率,所以一般使用锁相环电路(PLL)进行倍频,而TQ210 正是通过外接24MHz 的外部晶振,通过一定的倍频达到更高的频率。

S5PV210内部包含三个时钟域:

MSYS(mainsystem):主时钟域【Cortex-A8处理器、DRAM控制器(DMC0& DMC1)、3D、IROM& IRAM、INTC、SEPRI等。最高工作频率200MHz】

DSYS(displaysystem):显示时钟域【显示相关的模块,如FIMC、FIMD、JPEG、多媒体Ips。最高工作频率166MHz】

PSYS(peripheralsystem):外设时钟域【安全模块、IO外设和低功耗音频播放模块等。最高工作频率133MHz】

  


2、时钟域与PLL

S5PV210内部包含4个PLL。

Cortex-A8内核(ARMCLK)和MSYS时钟域(HCLK_MSYS、PCLK_MSYS)使用APLL;

DSYS和PSYS时钟域(HCLK_DSYS、HCLK_PSYS、PCLK_DSYS、PCLK_PSYS)、外设时钟(SPI、UART、Timer等)使用MPLL和EPLL;

VideoClock使用VPLL

  上面是各时钟关系图和三星公司给出了一些经典的频率参数。

 

上图是S5PV210时钟发生器,三星公司给出了一些经典参数。

分析一:

目标时钟的值取决于三个因素:MUX、时钟源频率、Divider(分频器)

MUX为多路时钟分选器,使用MUX可以为一个时钟选择不同的时钟源

时钟源一般来自于上级时钟系统或PLL输出或直接来自于外部晶振时钟

源时钟可以经过MUX直接连接到目标时钟系统,也可以途经Divider分做分频后再输出到下一级时钟系统

分析二:

一般在bootloader的前部会有时钟初始化代码,该阶段会对系统主要时钟进行设置,包括ARMCLK、HCLK_PSYS、PCLK_PSYS等。

外设时钟配置的常规思路:

1、分析目标外设模块要使用的时钟

2、分析该时钟如何由源时钟经MUX、Divider而得到。

3、根据需要设置寄存器位完成时钟配置。

【时钟分频配置】:

ARMCLK = 1000MHz= MOUT_MSYS / (APLL_RATIO + 1),经过在第四和第五步的设置后,MOUT_MSYS会被设置为1000MHz,所以APLL_RATIO=0即可

SCLKA2M=200MHz=SCLKAPLL/ (A2M_RATIO + 1),由于SCLKAPLL=1000MHz,所以A2M_RATIO=4。

HCLK_MSYS=200MHz=ARMCLK/ (HCLK_MSYS_RATIO + 1),所以HCLK_MSYS_RATIO=4

PCLK_MSYS=100MHz=HCLK_MSYS/ (PCLK_MSYS_RATIO + 1),所以PCLK_MSYS_RATIO=1

HCLK_DSYS=166MHz=MOUT_DSYS/ (HCLK_DSYS_RATIO + 1), 经过在第四和第五步的设置后,MOUT_DSYS=667MHz,所以HCLK_DSYS_RATIO=3

PCLK_DSYS=83MHz=HCLK_DSYS/ (PCLK_DSYS_RATIO + 1),所以PCLK_DSYS_RATIO=1

HCLK_PSYS=133Mhz=MOUT_PSYS/ (HCLK_PSYS_RATIO + 1),经过在第四和第五步的设置后,MOUT_PSYS=667MHz所以HCLK_PSYS_RATIO=4

PCLK_PSYS=66Mhz=HCLK_PSYS/ (PCLK_PSYS_RATIO + 1),所以HCLK_PSYS_RATIO=1

 

3、时钟配置

(1)设置系统锁相环(PLL)的锁定值  // 参考 PLL_LOCK 寄存器

(2)设置PLL的PMS值,并使能PLL      //参考 PLL_CON寄存器

(3)等待PLL锁定(即等待 PLL 输出稳定的频率) // 读取 PLL_CON 寄存器的 LOCKED 位来判断【设置PLL后,时钟从Fin提升到目标频率时,需要一定的时间,即锁定时间】

(4)设置系统时钟源:选择PLL,而不是外部晶振   // 参考 CLK_SRC0 寄存器

(5)设置其他模块的时钟源    // 参考 CLK_SRC1~CLK_SRC6寄存器

(6)设置系统时钟分频值       // 参考 CLK_DIV0寄存器

(7)设置其他模块的时钟分频值  // 参考 CLK_DIV1~CLK_DIC7

 

4、寄存器

(1)主要的MUX

    最终的时钟源一般均来自于外部晶振直接输出(低频、低功耗),或PLL输出(高频、高性能)由相应的MUX开关来决定使用哪个。

PLL输出频率的计算公式如下:

对于APLL:

FOUT = MDIV X FIN / (PDIV ×  2exp(SDIV-1))

对于MPLL、EPLL、VPLL:

       FOUT = MDIV X FIN / (PDIV X2exp(SDIV))

 

(2)APLL配置

      ALPP_CON0负责设置APLL,FINPLL=24MHz,经过APLL后,我们将输出FOUT=1000Mhz的时钟频率,FOUT的计算公式如下:FOUT=MDIV*FIN/(PDIV*2^(SDIV-1)) = 1000 MHz 由于FIN=24MHz,FOUT=1000MHz,我们可以这样取值:MDIV= 0x7d,PDIV=0x3,SDIV=1。这3个值并不是固定死的,只要能使FOUT=1000Mhz,任意搭配都是可以的。

 

(3)MPLL

MPLL_CON寄存器负责设置MPLL,经过MPLL后,我们将输出FOUT=667Mhz的时钟频率,FOUT的计算公式如下:FOUT=MDIV*FIN/(PDIV*2^SDIV) = 667 MHz 由于FIN=24MHz,FOUT=667MHz,我们可以这样取值:MDIV=0x29B,PDIV= 0xC,SDIV=1。这3个值并不是固定死的,只要能使FOUT=667Mhz,任意搭配都是可以的。

 

(4)分频器

从低位开始分析:
MOUT_MSYS = FOUTapll = 1000MHz 而 ARMCLK 根据经典值为 1000,所以 APLL_RATIO = 0;
SLKA2M = HCLK_MSYS = 200MHz , 而 SCLKAPLL = 1000 ,所 以A2M_RATIO = 4;
HCLK_MSYS = 200MHz,而 ARMCLK = 1000,所以 HCLK_MSYS_RATIO= 4;
MOUT_DSY 来自 SCLKmpll 即 FOUTmpll = 667MHz,而 HCLK_DSYS按照经典设置应为 166MHz 所以, HCLK_DSY_RATIO 约为 3;
经 典 值 设 置 可 知 PCLK_DSYS =166MHz,HCLK_DSYS=83MHz,故 PCLK_DSYS_RATIO = 1;
MOUT_PSYS 与 MOUT_DSYS 的来源是一样的,故也是FOUTmpll = 667MHz,而 HCLK_PSYS = 133,故 HCLK_PSYS_RATIO = 4;
由经 典 值 设 置 可 知 PCLK_PSYS =66MHz,HCLK_PSYS=133MHz,故 PCLK_PSYS_RATIO = 1;
 

(5)模块时钟门控

为了支持移动设备的低功耗需求,S5PV210的时钟模块提供了极精细的时钟开关控制,即ClockGating Control。

有两类ClockGating寄存器,CLK_GATE_IPx和CLK_GATE_BOLCK,这两者之间是逻辑与的关系,即对于一个具体模块,只有在两类门控寄存器内其时钟都被允许的情况下,该模块的时钟才能被最终开启。两类寄存器中只要有一处被禁止则最终的模块时钟是禁止的。

 

(6)设置各种时钟开关

 

5、时钟初始化

.global _start                           
_start:bl main                       /* 跳转到C函数去执行*/
halt:b halt

#ifndef CLOCK_H_
#define CLOCK_H_void clock_init();#endif

#include"clock.h"#defineAPLL_LOCK              *((volatile u32*)0xE0100000)
#defineMPLL_LOCK              *((volatile u32*)0xE0100008)
#defineEPLL_LOCK              *((volatile u32*)0xE0100010)
#defineVPLL_LOCK              *((volatile u32*)0xE0100020)#defineAPLL_CON0              *((volatile u32*)0xE0100100)
#define MPLL_CON              *((volatile u32 *)0xE0100108)
#defineEPLL_CON0              *((volatile u32*)0xE0100110)
#defineEPLL_CON1              *((volatile u32*)0xE0100114)
#define VPLL_CON              *((volatile u32 *)0xE0100120)#define CLK_SRC0              *((volatile u32*)0xE0100200)
#define CLK_SRC1              *((volatile u32*)0xE0100204)
#define CLK_SRC2              *((volatile u32*)0xE0100208)
#define CLK_SRC3              *((volatile u32*)0xE010020C)
#define CLK_SRC4              *((volatile u32*)0xE0100210)
#define CLK_SRC5              *((volatile u32*)0xE0100214)
#define CLK_SRC6              *((volatile u32*)0xE0100218)#define CLK_DIV0         *((volatile u32 *)0xE0100300)
#define CLK_DIV1         *((volatile u32 *)0xE0100304)
#define CLK_DIV2         *((volatile u32 *)0xE0100308)
#define CLK_DIV3         *((volatile u32 *)0xE010030C)
#define CLK_DIV4         *((volatile u32 *)0xE0100310)
#define CLK_DIV5         *((volatile u32 *)0xE0100314)
#define CLK_DIV6         *((volatile u32 *)0xE0100318)
#define CLK_DIV7         *((volatile u32 *)0xE010031C)/* 时钟初始化*/
void clock_init()
{/* 1.设置PLL锁定值*/APLL_LOCK = 0xFFFF;MPLL_LOCK = 0xFFFF;EPLL_LOCK = 0xFFFF;VPLL_LOCK = 0xFFFF;/* 2.设置PLL的PMS值(使用芯片手册推荐的值),并使能PLL*//*                     P              M                     S              EN */APLL_CON0     = (3  << 8) | (125 << 16) | (1 << 0) | (1 << 31);  /*FOUT_APLL = 1000MHz */MPLL_CON      = (12 << 8) | (667 << 16) | (1 << 0) | (1 << 31);   /* FOUT_MPLL = 667MHz */EPLL_CON0     = (3  << 8) | (48  << 16) | (2 << 0) | (1 << 31); /* FOUT_EPLL = 96MHz */VPLL_CON      = (6  << 8) | (108 << 16) | (3 << 0) | (1 << 31);  /*FOUT_VPLL = 54MHz *//* 3.等待PLL锁定*/while (!(APLL_CON0 & (1 <<29)));while (!(MPLL_CON  & (1 << 29)));while (!(EPLL_CON0 & (1 <<29)));while (!(VPLL_CON  & (1 << 29)));/*** 4.设置系统时钟源,选择PLL为时钟输出*//* MOUT_MSYS = SCLKAPLL = FOUT_APLL =1000MHz** MOUT_DSYS = SCLKMPLL = FOUT_MPLL =667MHz** MOUT_PSYS = SCLKMPLL = FOUT_MPLL =667MHz** ONENAND = HCLK_PSYS*/CLK_SRC0 = (1 << 0) | (1 <<4) | (1 << 8) | (1 << 12);/* 4.设置其他模块的时钟源*//* 6.设置系统时钟分频值*/CLK_DIV0 =    (0 << 0)  |   /* APLL_RATIO = 0, freq(ARMCLK) = MOUT_MSYS /(APLL_RATIO + 1) = 1000MHz */(4 << 4)  |   /*A2M_RATIO = 4, freq(A2M) = SCLKAPLL / (A2M_RATIO + 1) = 200MHz */(4 << 8)  |   /*HCLK_MSYS_RATIO = 4, freq(HCLK_MSYS) = ARMCLK / (HCLK_MSYS_RATIO + 1) = 200MHz*/(1 << 12) |   /* PCLK_MSYS_RATIO = 1, freq(PCLK_MSYS) =HCLK_MSYS / (PCLK_MSYS_RATIO + 1) = 100MHz */(3 << 16) |   /*HCLK_DSYS_RATIO = 3, freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) =166MHz */(1 << 20) |   /*PCLK_DSYS_RATIO = 1, freq(PCLK_DSYS) = HCLK_DSYS / (PCLK_DSYS_RATIO + 1) =83MHz */(4 << 24) |   /* HCLK_PSYS_RATIO = 4, freq(HCLK_PSYS) =MOUT_PSYS / (HCLK_PSYS_RATIO + 1) = 133MHz */(1 << 28);    /* PCLK_PSYS_RATIO = 1, freq(PCLK_PSYS) =HCLK_PSYS / (PCLK_PSYS_RATIO + 1) = 66MHz *//* 7.设置其他模块的时钟分频值*/
}

#include"clock.h"#define GPC0CON          *((volatile unsigned int *)0xE0200060)
#define GPC0DAT          *((volatile unsigned int *)0xE0200064)void delay(volatile unsigned int t)
{volatile unsigned int t2 = 0xFFFF;while (t--)for (; t2; t2--);
}int main()
{int toggle = 0;GPC0CON &= ~(0xFF << 12);GPC0CON |= 0x11 << 12;                    // 配置GPC0_3和GPC0_4为输出clock_init();         // 时钟初始化while (1){GPC0DAT &= ~(0x3 << 3);           // 熄灭LED1和LED2if (toggle)GPC0DAT |= 1 << 3;        // 点亮LED1elseGPC0DAT |= 1 << 4;        // 点亮LED2toggle = !toggle;delay(0x50000);}return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的文章汇总

2018年文章汇总2019年文章汇总2020年文章汇总专辑|Linux文章汇总专辑|程序人生专辑|C语言专辑|Git专辑|安卓系统专辑|嵌入式我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c…

webpack-安装

以前配置的gulpfile.js&#xff0c;随着版本的迭代更新&#xff0c;现在已经... 1.安装webpack npm i -g webpack-cli && npm i -g babel-preset-env 2.弹射出窗口&#xff08;我们未安装Git&#xff0c;或者未找到Git path&#xff0c;请配置path&#xff09; 3.再次执…

TQ210——S5PV210中断体系

TQ210——S5PV210中断体系 中断是指 CPU 在执行程序的过程中&#xff0c;遇到异常情况需要处理&#xff0c; CPU停 止当前程序的运行&#xff0c;保存当前程序运行处的必要参数&#xff0c;转去处理这些异常情况&#xff0c; 处理结束后再返回当前程序的间断处&#xff0c;继续…

高通骁龙888开始被Linux内核5.12版正式支持

在Linux 5.12内核合并窗口中&#xff0c;有很多新的硬件开始被支持&#xff0c;其中不乏一些知名产品例如高通骁龙888&#xff0c;除此之外还有一些与ARM平台和设备树有关的代码添加。来自Arnd Bergmann的各种内核拉取请求在周六晚上被合并&#xff0c;此前由于恶劣的冬季风暴阻…

Python实现比较两个列表(list)范围

Python实现比较两个列表(list)范围 有一道题&#xff1a; 比较两个列表范围&#xff0c;如果包含的话&#xff0c;返回TRUE&#xff0c;否则FALSE。 详细题目如下&#xff1a; Create a function, this function receives two lists as parameters, each list indicates a scop…

单片机里面的CPU使用率是什么鬼?

打开电脑的任务管理器&#xff0c;看着跳动的CPU使用率&#xff0c;发现很舒服。每一个线程占用了多少CPU清清楚楚&#xff0c;也就能针对性的确认为啥你的电脑跑的慢了。今天这篇笔记不讲每个任务&#xff08;或线程&#xff09;CPU的使用情况&#xff0c;而是单片机整体的CPU…

图解,C语言希尔排序

希尔排序和插入排序很相似&#xff0c;有点像插入排序的升级版本。希尔排序是希尔&#xff08;Donald Shell&#xff09;于1959年提出的一种排序算法。希尔排序也是一种插入排序&#xff0c;它是简单插入排序经过改进之后的一个更高效的版本&#xff0c;也称为缩小增量排序&…

TQ210——S5PV210串口通信

TQ210——S5PV210串口通信 1、 串行与并行通信 串行通道中&#xff0c;有效信息被编码后串行的从单根传输线上传送出去。譬如发送ASCII字符’a’&#xff0c;我们可以将’a’对应的ASCII码97&#xff08;0x61&#xff09;分作8个bit在传输线上顺序依次传输。 与串行传输相对应…

暴力字符匹配算法的C语言实现

1、聊一聊今天跟大家分享的这个曲子一般是在天气预报和英语试听中出现&#xff0c;不信你听一听绝对有种似曾相识感觉。本篇文章主要是为讲解高效字符匹配算法的一则预告文&#xff0c;跟大家讲讲暴力字符匹配算法以及匹配算法在通信中如何使用。2、暴力匹配算法介绍1聊聊字符匹…

TQ210 —— LCD

TQ210 —— LCD一、LCD控制器1、S5PV210 LCD控制器要使一块LCD正常的显示文字或图像&#xff0c;不仅需要LCD驱动器&#xff0c;而且还需要相应的LCD控制器。在通常情况下&#xff0c;生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起&#xff0c;而LCD控制器则是…

微信表情都戒烟了

昨天看到最新的微信表情是这样的原来的抽烟表情被替换成了这释放出一个信号&#xff0c;就是「抽烟不酷了」不过我想说&#xff0c;只戴着一个绿帽子&#xff0c;嘴巴里面什么都没有&#xff0c;好像也不酷啊。难道重点就是那个墨镜????&#xff1f;不过&#xff0c;在PC版…

Python 类的属性和实例属性 Python 的动态语言

#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa 10... #对类 Aa实例化出一个实例 a1>>> a1 Aa() >>> print(a1.__dict__)#查看实例并没有自己的方法和属性{}>>> a1.aaa #但是这个实例在调用属性的时候, 发现自己没有这个属性, 于…

高效KMP字符匹配算法就这么简单

1、聊一聊上一篇文章"暴力"字符匹配算法的C语言实现2、KMP算法介绍1KMP介绍KMP是一种字符匹配算法&#xff0c;为啥叫KMP呢&#xff1f;因为是由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt大佬提出来的。那一些小伙伴会问了怎么不叫"DJV算法"呢?因为老外…

TQ210 —— NandFlash

TQ210 —— nandflashTQ210 开发板板载一片 1Gbyte 的 NAND FLASH——K9K8G08U0B&#xff0c;通过查询K9K8G08U0B 芯片手册可以得到如下信息&#xff1a;&#xff08;理论知识不再介绍&#xff09;K9K8G08U0B : (1G 32M) x 8bit 总大小Data Register : (2K 64) x 8bit 数据寄…

涂鸦赞助的500个开发套件,先到先得

来源 | 涂鸦跟涂鸦申请的福利&#xff0c;给喜欢开发的同学发放开发套件&#xff0c;只要是不是专门白嫖党&#xff0c;数量可以不做限制。去年疫情突发&#xff0c;封城、封小区以及人员隔离&#xff0c;让原本享受千般宠爱的主子们变成了靠吃猫砂、塑料袋度日的小可怜&#x…

Linux-C 编程 / 网络 / 超迷你的 web server

一、为生活寻找固定的支撑点1. 什么是生活的支撑点&#xff1f;让自己感到些许痛苦&#xff0c;但却会带来实实在在的充实感和成就感的事情。举个栗子&#xff0c;我的支点是运动、看书、研究技术。2. 固定的支撑点很重要&#xff1a;三个固定的要素&#xff1a;时间 / 空间 / …

20165326 java第四周学习笔记

第四周学习笔记 ch5 子类和父类子类只能有一个父类使用关键字extendsyclass 子类 extends 父类系统默认的祖先类Object&#xff08;java.lang包中&#xff09;继承&#xff1a;子类继承父类的方法可以直接作为实例方法调用&#xff0c;继承的成员变量和方法的访问权限不变&…

用VSTS进行网站压力测试

VSTS提供了一个丰富、强大的工具平台&#xff0c;融合了软件开发领域的各个角色&#xff0c;涵盖软件开发生命周期的各个阶段&#xff0c;包括设计&#xff0c;开发&#xff0c;测试&#xff0c;管理&#xff0c;而这一整套构件的融会贯通&#xff0c;让它可以有效地改善软件开…

第四周选做作业

相关知识点的总结 通过命令行引入参数递归循环课上内容的补做&#xff0c;结果截图 未完成内容:递归与循环 补做教材第二章&#xff0c;第三章编程题目 参考资料 2016-2017-2 《Java 程序设计》课堂实践项目编写一个Java应用程序,输出全部的希腊字母。_百度知道[]转载于:https:…

数据结构和算法,也就那么回事儿

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…