S5PV210_时钟系统

发布者:Yinyue1314最新更新时间:2024-12-12 来源: cnblogs关键字:S5PV210  时钟系统  外部晶振 手机看文章 扫描二维码
随时随地手机看文章

1、S5PV210的时钟获得:外部晶振+内部时钟发生器+内部PLL产生高频时钟+内部分频器分频


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


2、时钟域:MSYS、DSYS、PSYS

MSYS(main system):CPU(Cortex-A8内核)、DRAM控制器(DMC0和DMC1)、SRAM(IRAM&IROM)、INTC、SPERI(configuration inerface)······


 ARMCLK: 给cpu内核工作的时钟,也就是所谓的主频。

 HCLK_MSYS: MSYS域的高频时钟,给DMC0和DMC1使用

 PCLK_MSYS: MSYS域的低频时钟

 HCLK_IMEM:给iROM和iRAM(合称iMEM)使用


DSYS(display system): 都是和视频显示、编解码等有关的模块(FIMC、FIMD、JPEG)


 HCLK_DSYS:DSYS域的高频时钟

 PCLK_DSYS:DSYS域的低频时钟


PSYS(peripheral system): 和内部的各种外设时钟有关,譬如串口、SD接口、I2C、AC97、USB等


 HCLK_PSYS:PSYS域的高频时钟

 PCLK_PSYS:PSYS域的低频时钟


3、关于PLL(包括APLL  MPLL  EPLL  VPLL)


APLL:Cortex-A8内核 MSYS域

MPLL&EPLL:DSYS PSYS

VPLL:Video视频相关模块

4、时钟设置的关键寄存器


xPLL_LOCK  控制PLL锁定周期


xPLL_CON  打开/关闭PLL电路,设置PLL的倍频参数,查看PLL锁定状态


CLK_SRCn(n:0~6)  设置时钟来源,对应时钟框图中的MUX开关


CLK_SRC_MASK  决定MUX开关n选1后是否能继续通过


CLK_DIV  各模块的分频器参数配置


CLK_GATE_x  类似于CLK_SRC_MASK,对时钟进行开关控制


CLK_DIV_STATn、CLK_MUX_STATn  查看DIV和MUX的状态(已经完成还是在进行中)


5、代码设置时钟逻辑步骤:


(1)先选择不使用PLL。让外部24MHz原始时钟直接过去,绕过APLL那条路


1 ldr    r0, =ELFIN_CLOCK_POWER_BASE

2 //设置各种时钟开关,暂时不使用PLL

3 ldr    r1, =0x0

4 //CLK_SRC bit[0]就是APLL_SEL,(APLL_SEL:control MUXAPLL(0:FINPLL,1:FOUTAPLL))

5 str    r1, [r0, #CLK_SRC0_OFFSET]    

(2)设置锁定时间。默认值为0x0FFF,保险起见我们设置为0xFFFF


//设置锁定时间,使用默认值即可

// 设置PLL后,时钟从Fin提升到目标频率时,需要一定的时间,即锁定时间

ldr    r1,    =0x0000FFFF                    

str    r1,    [r0, #APLL_LOCK_OFFSET]                

str r1, [r0, #MPLL_LOCK_OFFSET]    

(3)设置分频系统,由PLL出来的最高时钟如何分频得到各个分时钟


1 //设置分频

2 // 清bit[0~31]

3 ldr r1, [r0, #CLK_DIV0_OFFSET]                    

4 ldr    r2, =CLK_DIV0_MASK                    

5 bic    r1, r1, r2

6 ldr    r2, =0x14131440                        

7 orr    r1, r1, r2

8 str    r1, [r0, #CLK_DIV0_OFFSET]


0x14131440的含义:

 PCLK_PSYS = HCLK_PSYS / 2

 HCLK_PSYS = MOUT_PSYS / 5

 PCLK_DSYS = HCLK_DSYS / 2

 HCLK_DSYS = MOUT_DSYS / 4

 ·······

 HCLK_MSYS = ARMCLK / 5

 ARMCLK = MOUT_MSYS / 1

 

(4)设置PLL,主要是设置PLL的倍频系统,决定由输入端24MHz的原始频率可以得到多大的输出频率。我们按照默认设置值设置输出为ARMCLK为1GHz


 1 #define set_pll(mdiv, pdiv, sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)

 2 #define APLL_VAL            set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)

 3 #define MPLL_VAL            set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)

 4 

 5 //设置PLL

 6 // FOUT = MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000 MHz

 7 ldr    r1, =APLL_VAL                        

 8 str    r1, [r0, #APLL_CON0_OFFSET]

 9 // FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz

10 ldr    r1, =MPLL_VAL                        

11 str    r1, [r0, #MPLL_CON_OFFSET]


(5)打开PLL。前面4步已经设置好了所有的开关和分频系数,该步骤打开PLL后PLL开始工作,锁定频率后输出,然后经过分频得到各个频率。 


1 //设置各种时钟开关,使用PLL

2 ldr    r1, [r0, #CLK_SRC0_OFFSET]

3 ldr    r2, =0x10001111

4 orr    r1, r1, r2

5 str    r1, [r0, #CLK_SRC0_OFFSET]

6、汇编代码 


 1 // 时钟控制器基地址

 2 #define ELFIN_CLOCK_POWER_BASE        0xE0100000    

 3 

 4 // 时钟相关的寄存器相对时钟控制器基地址的偏移值

 5 #define APLL_LOCK_OFFSET        0x00        

 6 #define MPLL_LOCK_OFFSET        0x08

 7 

 8 #define APLL_CON0_OFFSET        0x100

 9 #define APLL_CON1_OFFSET        0x104

10 #define MPLL_CON_OFFSET            0x108

11 

12 #define CLK_SRC0_OFFSET            0x200

13 #define CLK_SRC1_OFFSET            0x204

14 #define CLK_SRC2_OFFSET            0x208

15 #define CLK_SRC3_OFFSET            0x20c

16 #define CLK_SRC4_OFFSET            0x210

17 #define CLK_SRC5_OFFSET            0x214

18 #define CLK_SRC6_OFFSET            0x218

19 #define CLK_SRC_MASK0_OFFSET    0x280

20 #define CLK_SRC_MASK1_OFFSET    0x284

21 

22 #define CLK_DIV0_OFFSET            0x300

23 #define CLK_DIV1_OFFSET            0x304

24 #define CLK_DIV2_OFFSET            0x308

25 #define CLK_DIV3_OFFSET            0x30c

26 #define CLK_DIV4_OFFSET            0x310

27 #define CLK_DIV5_OFFSET            0x314

28 #define CLK_DIV6_OFFSET            0x318

29 #define CLK_DIV7_OFFSET            0x31c

30 

31 #define CLK_DIV0_MASK            0x7fffffff

32 

33 // M、P、S的配置值都是查数据手册中典型时钟配置值的推荐配置得来的。

34 #define APLL_MDIV                   0x7d        // 125

35 #define APLL_PDIV               0x3

36 #define APLL_SDIV               0x1

37 

38 #define MPLL_MDIV                0x29b        // 667

39 #define MPLL_PDIV                0xc

40 #define MPLL_SDIV                0x1

41 

42 #define set_pll(mdiv, pdiv, sdiv)    (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)

43 #define APLL_VAL            set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)

44 #define MPLL_VAL            set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)

45 

46 .global clock_init

47 clock_init:

48     ldr    r0, =ELFIN_CLOCK_POWER_BASE

49     

50     // 1 设置各种时钟开关,暂时不使用PLL

51     ldr    r1, =0x0

52     //CLK_SRC bit[0]就是APLL_SEL,(APLL_SEL:control MUXAPLL(0:FINPLL,1:FOUTAPLL))

53     str    r1, [r0, #CLK_SRC0_OFFSET]                

54 

55     // 2 设置锁定时间,使用默认值即可

56     // 设置PLL后,时钟从Fin提升到目标频率时,需要一定的时间,即锁定时间

57     ldr    r1,    =0x0000FFFF                    

58     str    r1,    [r0, #APLL_LOCK_OFFSET]                

59     str r1, [r0, #MPLL_LOCK_OFFSET]                     

60 

61     // 3 设置分频

62     // 清bit[0~31]

63     ldr r1, [r0, #CLK_DIV0_OFFSET]                    

64     ldr    r2, =CLK_DIV0_MASK                    

65     bic    r1, r1, r2

66     ldr    r2, =0x14131440                        

67     orr    r1, r1, r2

68     str    r1, [r0, #CLK_DIV0_OFFSET]

69 

70     // 4 设置PLL

71     // FOUT = MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000 MHz

72     ldr    r1, =APLL_VAL                        

73     str    r1, [r0, #APLL_CON0_OFFSET]

74     // FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz

75     ldr    r1, =MPLL_VAL                        

76     str    r1, [r0, #MPLL_CON_OFFSET]

77 

78     // 5 设置各种时钟开关,使用PLL

79     ldr    r1, [r0, #CLK_SRC0_OFFSET]

80     ldr    r2, =0x10001111

81     orr    r1, r1, r2

82     str    r1, [r0, #CLK_SRC0_OFFSET]

83 

84     mov    pc, lr


7、C语言代码


 1 // 时钟控制器基地址

 2 #define ELFIN_CLOCK_POWER_BASE        0xE0100000    

 3 

 4 // 时钟相关的寄存器相对时钟控制器基地址的偏移值

 5 #define APLL_LOCK_OFFSET        0x00        

 6 #define MPLL_LOCK_OFFSET        0x08

 7 

 8 #define APLL_CON0_OFFSET        0x100

 9 #define APLL_CON1_OFFSET        0x104

10 #define MPLL_CON_OFFSET            0x108

11 

12 #define CLK_SRC0_OFFSET            0x200

13 #define CLK_SRC1_OFFSET            0x204

14 #define CLK_SRC2_OFFSET            0x208

15 #define CLK_SRC3_OFFSET            0x20c

16 #define CLK_SRC4_OFFSET            0x210

17 #define CLK_SRC5_OFFSET            0x214

18 #define CLK_SRC6_OFFSET            0x218

19 #define CLK_SRC_MASK0_OFFSET    0x280

[1] [2]
关键字:S5PV210  时钟系统  外部晶振 引用地址:S5PV210_时钟系统

上一篇:shell学习一:shell命令行实现
下一篇:S5PV210_流水灯

推荐阅读最新更新时间:2026-03-23 17:11

STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。 这里说下配置过程: 时钟自动切换,开启切换中断 在中断里面清除中断标志,使能CSS并开启CSS中断 CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率 窗口输出配置信息: 用手触碰PA1、PA2引脚使外部晶振失效 串口输出CSS中断
[单片机]
STM8s<font color='red'>外部</font><font color='red'>时钟</font><font color='red'>晶振</font>失效<font color='red'>时钟</font>安全<font color='red'>系统</font>CSS启动演示
STM32系统时钟设置,采用外部有源晶振相关配置问题
在调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变。程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢。 查找程序发现在系统时钟初始化时,RCC_HSEConfig(RCC_HSE_Bypass); 语句配置不对,此语句解释为HSE晶振被外部时钟旁路。指将芯片内部的用于外部晶体起振和功率驱动等的部分电路和XTAL_OUT引脚断开,这时使用的外部时钟是有源时钟或者其他STM32提供的CCO输出等时钟信号,直接单线从XTAL_IN输入,这样即使外部有晶体也震荡不起来了。 因为之前用的是有源晶振,接法如下图1:HSE配置如下:RCC_HSEConfi
[单片机]
S5PV210初始化系统时钟
S5PV210时钟体系 S5PV210中包含3大类时钟domain,分别是主系统时钟domain (简称MSYS,下面将使用简称来进行相关讲解)、显示相关的时钟domain (DSYS)、外围设备的时钟domain (PSYS)。 1) MSYS:用来给cortex a8处理器,dram控制器,3D,IRAM,IROM,中断控制器等提供时钟; 2) DSYS:用来给显示相关的部件提供时钟,包括FIMC, FIMD, JPEG, and multimedia IPs; 3) PSYS:用来给外围设备提供时钟,如i2s, spi,i2c,uart等 S5PV210外接的晶振频率(简称Fin)为24MHz,通过时钟控制逻辑PLL可以提高
[单片机]
<font color='red'>S5PV210</font>初始化<font color='red'>系统</font><font color='red'>时钟</font>
stm32修改外部晶振频率的方法
背景: 身为一个嵌入式程序员,经常要和硬件打交道,遇到不靠谱的硬件工程师,那真的是苦不堪言啊,这不,又遇到一个原理图画8M晶振,焊接12M晶振的坑等我跳,我tn的真的义无反顾的跳进去两天,无法自拔 正题: stm32f103官方默认8M外部晶振,经过分频倍频后达到72M(根据型号不同也可能是48M等)主频,如果外部晶振换成12M晶振,则需要修改底层文件,下面记录修改方法 环境: 硬件平台:stm32f103vct6(flash 256k,对应HD) 编译环境:iar 8.32.8 系统环境:win10 64bit 修改方法: 1、找到文件 stm32f10x.h ,找到如下代码段: 将8000000改为120000
[单片机]
stm32变更外部晶振时钟配置
学习野火的固件库UART1串口案例时,用的是SIM9008模块应用板上STM32103F103RB芯片,使用的外部晶振是12M。 串口读取的是乱码 默认的外部晶振是8M 由于stm32的库默认是外部晶振8M的情况下实现的,所以配置串口波特率的时候也是按8M,包括主频。 如果采用外部晶振8M或12M,配置时钟为72MHZ 。 1)在system32_stm32f10x.c文件中的void SetSysClockTo72(void)里这样改: 8M: RCC- CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72 12M: RCC- CFGR |=
[单片机]
STM32外部晶振电的主时钟方案
STM32的时钟源 STM32F103有两种主时钟方案,一个是依靠内部RC振荡器的HSI(内部高速时钟),另一个是HSE(外部高速时钟)。 内部高速时钟源(HSI) 看数据手册,内部的HSI是由ST出厂时校准过的,但是精度并不高,在0到70℃下误差范围达到 -1.3%到2%,即便是在标准的25℃下,也有 -1.1%到1.8% 的误差(如下图)。 对于高波特率的异步串口通讯,或者需要高精度定时的场合(如:需要跑积分算法的时候),用HSI就有隐患,甚至根本达不到设计要求。 外部高速时钟源(HSE) 为了更高的时钟精度,就要用HSE做主时钟源,起码做到30ppm还是很容易的。无源晶振相对便宜一些,要求不是非常高的话也足够了。 对
[单片机]
STM32<font color='red'>外部</font><font color='red'>晶振</font>电的主<font color='red'>时钟</font>方案
STM32使用内部晶振还是外部晶振
在项目开发过程中,经常会面临“用内部晶振还是外部晶振”的问题。如何选择?关键还是看应用! 如果产品附加值比较高,并且产品对温度,电磁环境等可靠性要求严格的时候,需要考虑使用外部晶振。 毕竟,内部晶振受环境影响比较大(内部晶振的叫法不是很严谨,准确的说内部是RC振荡器,鉴于阻容器件尤其电容大小受温度影响较大,因此温度、电压等对其影响较大,如下图技术手册中所指出的)。 话说回来,在MCU上如果不使用外部晶振,那么引脚OSC_IN和OSC_OUT如何接才比较好呢? ▲技术手册 我们以STM32为例说明,如果使用内部RC振荡器而不使用外部晶振,请按照以下方法处理: (1)对于100脚或144脚的产品,OSC_IN应接地,
[单片机]
STM32使用内部<font color='red'>晶振</font>还是<font color='red'>外部</font><font color='red'>晶振</font>
HAL库使用修改为外部25M晶振
一个是修改SystemClock_Config函数中的参数和时钟来源,另一个是修改stm32f4xx_hal_conf.h中HSE_VALUE的值为25000000。 下面是修改前后的git diff diff --git a/drivers/board.c b/drivers/board.c index 4fb1fee..bbc8096 100644 --- a/drivers/board.c +++ b/drivers/board.c @@ -27,13 +27,12 @@ void SystemClock_Config(void) __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULAT
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved