历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | TQ210——时钟系统

2020-12-06 来源:eefocus

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"

推荐阅读

史海拾趣

ABI Electronics公司的发展小趣事

ABI Electronics公司深知研发实力是企业发展的核心竞争力。因此,公司不断加大对研发的投入,引进了一批高素质的研发人才,建立了完善的研发体系。通过与高校、科研机构等合作,ABI不断吸收新的技术和知识,推动产品的升级换代,保持了在行业内的技术领先地位。

Alpha-Micro Electronics公司的发展小趣事

ABI Electronics公司的起点可以追溯到其对电路板测试技术的深入研究。在创立初期,ABI便以开发出高精度、高效率的电路板故障检测仪为目标。通过对电路板测试技术的不断钻研和创新,ABI成功推出了一系列性能卓越的测试设备,这些设备不仅提高了电路板测试的准确性和效率,也极大地降低了测试成本,赢得了市场的广泛认可。

HEC Inc公司的发展小趣事

为了进一步拓展业务,ABI Electronics公司开始积极寻求全球市场的布局。通过与各地的电子分销商、代理商建立合作关系,ABI的产品逐渐进入了全球各地的市场。同时,ABI还积极参加各类国际电子展会,展示其最新技术和产品,与全球同行建立了广泛的联系和合作。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

Genesys Logic公司的发展小趣事

进入21世纪,“General Microcircuits”开始实施全球化战略,先后在美国、欧洲、亚洲等地建立研发中心和生产基地。通过全球化布局,公司不仅能够更快地响应不同地区的市场需求,还能充分利用各地的资源优势和技术优势,进一步提升产品的竞争力和市场占有率。同时,公司还加强了与国际知名电子制造商的战略合作,共同推动半导体技术的创新与发展。

ES Systems公司的发展小趣事

ES Systems非常重视与产业链上下游企业的合作。通过与供应商、渠道商等合作伙伴的紧密合作,公司能够及时了解市场需求和技术趋势,从而快速调整产品策略。此外,ES Systems还积极与高校和科研机构开展产学研合作,共同研发新技术、新产品。这种合作模式为ES Systems带来了持续的创新动力和市场竞争力。

问答坊 | AI 解惑

开关电源原理与设计-张占松(pdf完整版)共556页

目录 第一篇 PWM开关变换器的基本原理………………………………………………1 第一章 开关变换器概论………………………………………………………………1 第一节 什么是开关变换器和开关电源………………………………………………1 第二节 DC-D ...…

查看全部问答>

wince6用什么开发驱动?

除了写makefile,然后build之外还有吗? 以前5.0可以用evc,pb等工会开发。 vs2005好像没有支持建立驱动的项目选项啊。…

查看全部问答>

有没有谁做嵌入式开发的,大虾给俺指导一下?谁有WIN CE的模拟器?

我现在准备开发WIN CE5.0应用程序,现在按照网上指导的方法VS2005不能与目标机相联(目标机是WIN CE5.0系统),从开发机上拷的那5个文件不能在目标机器上运行,执行后报如下错误提示: \'ConmanClient2\'is not a valid Windows CE application ...…

查看全部问答>

PB5.0升级2008全年升级包后 定制内核 生成的NK.nb0无法运行

第一步:把PB5.0升级2008全年升级包,在优龙2410开发板资料提供的ARMSYS2410.pbxml基础上把.net compact framework 2.0 add to OS,编译通过,生成的NK.nb0(大小为29M),在DNW下可以通过USB下载到开发板,下载地址为0X30200000,下载后选择Y运行, ...…

查看全部问答>

关于在WINCE下模拟MOUSE的动作

现有一个软件需求如题所述,现在的做法是在TOUCH PANEL驱动层加上一些代码,也就是说把传给GWES的值复制一份保留下来.这样的做法缺陷很大,如果一旦在动作序列里有一个动作没有被有效的执行,那本次模拟的所有操作就会被认为无效.大家有没有其它的办法 ...…

查看全部问答>

有关pda下导入dll 文件的问题

用vc生成一个dll文件(Phone.dll),并把它拷贝到pda的根目录下(该目录下有一个用EVC生成的导入dll的EXE文件),希望在pda中导入dll,相关代码如下:           HINSTANCE ghPhoneDLL=NULL;      ...…

查看全部问答>

请推荐一款使用IAR 库函数的stm32开发版。谢谢

之前用 iar习惯了。。发现stm32的iar设置很麻烦。。看了一会还是不大懂。想买款使用IAR库函数的stm32开发板。求推荐。谢谢…

查看全部问答>

TI 电源设计小贴士 30

欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到 ...…

查看全部问答>

两种硬件描述语言VHDL_Verilog的发展及其应用_罗杰

新人贴,希望咱们的论坛越来越火吧,现在感觉缺点人气 呵呵…

查看全部问答>