Tiny210---时钟系统

发布者:VelvetSoul最新更新时间:2025-02-07 来源: cnblogs关键字:Tiny210  时钟系统  倍频器 手机看文章 扫描二维码
随时随地手机看文章

1.S5PV210时钟系统

如图1:

 

 

S5PV210中包含3大类时钟domain:

1)       MSYS(主系统时钟) 用来给cortex a8处理器,dram控制器,3D,IRAM,IROM,中断控制器等提供时钟。

2)       DSYS(显示相关的时钟) 用来给显示相关的部件提供时钟,包括FIMC, FIMD, JPEG, and multimedia IPs。

3)       PSYS(外围设备的时钟) 用来给外围设备提供时钟,如i2s, spi,i2c,uart等。

这三个区域都是AMBA总线,AMBA总线分为AHB和APB两种总线每种总线都有不同的时钟频率。如下图2:

 

AHB对应HCLK,APB对应PCLK,

FCLK   is used by ARM920T,内核时钟,主频。

HCLK   is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是总线时钟,包括USB时钟。

PCLK   is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface, ADC, UART, GPIO, RTC and SPI.即IO接口时钟,例如串口的时钟设置就是从PCLK来的。

 

那么MSYS,DSYS,PSYS最少有6个时钟(实际上不止6个):HCLK_MSYS/PCLK_MSYS、HCLK_DSYS/PCLK_DSYS、HCLK_PSYS/PCLK_PSYS,再外加一个CPU要用的时钟ARMCLK,总共7个时钟频率。

 

由图3可知最后,总共有13个CLK提供出来。

由图4可以知道S5PV210共有4个倍频器即PLL,包括APLL,MPLL,EPLL,VPLL.

 P448

 

void clock_init() 

    // 1 设置各种时钟开关,暂时不使用PLL 
    CLK_SRC0 = 0x0; 
    // 2 设置锁定时间,使用默认值即可 
    APLL_LOCK = 0x0000FFFF; 
    MPLL_LOCK = 0x0000FFFF; 
    // 3 设置分频 
    CLK_DIV0 = 0x14131440; 
    // 4 设置PLL 
    APLL_CON0 = APLL_VAL;
    MPLL_CON = MPLL_VAL; 
    // 5 设置各种时钟开关,使用PLL 
    CLK_SRC0 = 0x10001111; 

 

第一步 、设置各种时钟开关,暂时不使用PLL。

首先我们需要选择使用外接24MHz晶振,由时钟系统图可知,APLL和MPLL的时钟源由“FINPLL”决定,在芯片手册中搜索“FINPLL”,可知相关寄存器为CLK_SRC0,

如图3

在未设置PLL和各种分频系数之前,我们不能使用PLL,为了保险起见,暂时直接使用频率较低的外接的24MHz晶振,待设置好PLL和分频系数后再重新设置各种时钟开关。所以设置为0x00。

 

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

第三步 、设置分频
与分频相关的寄存器是CLK_DIV0,见下图4:

 

第四步 、设置PLL

PLL即倍频器,用来放大运行频率。设置好分频后,我们就需要设置PLL了。APLL/MPLL的启动是通过设置APLL_CON0/MPLL_CON寄存器,我们逐个来设置。

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,任意搭配都是可以的。

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,任意搭配都是可以的。

第五步 设置各种时钟开关

在时钟系统图中,所有的MUX都是用来选择时钟的,相关寄存器是CLK_SRC0

参考S5PV210时钟设置参考图,设置各种时钟开关: 
APLL_SEL=1,使用FOUTAPLL 
MPLL_SEL=1,使用FOUTMPLL 
EPLL_SEL=1,使用FOUTEPLL 
VPLL_SEL=1,使用FOUTVPLL 
MUX_MSYS_SEL=0,使用SCLKAPLL 
MUX_DSYS_SEL=0,使用SCLKMPLL 
MUX_PSYS_SEL=0,使用SCLKMPLL 
ONENAND_SEL=1,使用HCLK_DSYS 
所以CLK_SRC0=0x10001111;


关键字:Tiny210  时钟系统  倍频器 引用地址:Tiny210---时钟系统

上一篇:S5PV210 三个Camera Interface/CAMIF/FIMC的区别
下一篇:libnfc移植到ARM上

推荐阅读最新更新时间:2026-03-25 11:30

tiny210裸机第1课(启动原理)
软硬件环境 宿主机系统:ubuntu 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand 交叉编译器:arm-linux-gcc-4.5.1 手册:S5PV210的S5PV210_UM_REV1.1(老版本居然连内存地址空间都不同) 1.写在前面的话 虽然现在主要做应用层软件,还是想学一下底层的东东,弄清楚cpu的启动原理。内容多为摘抄《Linux平台下Mini210S裸机程序开发指南》--友善之臂和他人博客,作为日后翻阅的笔记之用。 2.S5PV210介绍 S5PV210的datasheet中有对它的基本架构的一些介绍,里面有这么一幅图 从这张图中我
[单片机]
<font color='red'>tiny210</font>裸机第1课(启动原理)
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)
在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印。 在上节。我们看到调用 relocate_code 重定位。在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明。 u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定: 当使用-pie 选项后。链接器会生成一个修正表(fixup tables)。在终于的二进制文件 u-boot.bin 中表现为多了 2 个段 .rel.dyn 和 .dynsym。还须要在链接脚本文件里添加这 2 个段,u-boot.b
[单片机]
<font color='red'>tiny210</font>(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
这节我们实现nand的ecc,保存环境变量到nand flash 中。然后把我们之前的led灯烧写到nand flash 中。开机启动。在 tiny210.h 中定义宏 CONFIG_S5PV210_NAND_HWECC、CONFIG_SYS_NAND_ECCSIZE、CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定义了消息长度。即每多少字节进行 1 次 ECC 校验 CONFIG_SYS_NAND_ECCBYTES 定义为 13Byte,将 drivers/mtd/nand/s5pv210_nand.c 中的 CONFIG_S3C2410_NAND_HWECC 替换为CON
[单片机]
<font color='red'>tiny210</font>(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
Tiny210裸机之UART串口操作
start.S源码: .global _start _start: ldr sp, =0xD0030000 @初始化堆栈 b main ==================================================================== main.c: #include clock.h #include led.h #include uart.h #include lib.h int main(void) { led_init(); // 设置对应管脚为输出 clock_init(); // 初始化时钟 uart_init(); // 初始化UART0
[单片机]
Tiny210按键输入子系统
buttons.c驱动源码: // 参考drivers\input\keyboard\gpio_keys.c #include linux/module.h #include linux/version.h #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/interrupt.h #include linux/irq.h #include linux/sched.h #include linux/pm.h #include linux/slab.h #include linux/sysctl.h
[单片机]
Tiny210驱动之虚拟网卡驱动
virt_net.c驱动: // 参考 drivers\net\cs89x0.c #include linux/module.h #include linux/errno.h #include linux/netdevice.h #include linux/etherdevice.h #include linux/kernel.h #include linux/types.h #include linux/fcntl.h #include linux/interrupt.h #include linux/ioport.h #include linux/in.h #include linux/skbuff.
[单片机]
Tiny210 IIC驱动之at24cxx访问
at24cxx_dev.c驱动源码: #include linux/kernel.h #include linux/module.h #include linux/platform_device.h #include linux/i2c.h #include linux/err.h #include linux/slab.h static struct i2c_board_info at24cxx_info = { I2C_BOARD_INFO( at24c08 , 0x50), }; static struct i2c_client *at24cxx_client; static int at24cxx_de
[单片机]
Tiny210和Tiny4412裸板程序烧写比较
1、Tiny4412启动时首先运行固化在芯片内部iROM中的程序,把启动设备(可能是EMMC/nand flash、SD、USB启动)特定位置处的程序读入片内存 (iRAM) ,并执行它,BL1又把启动设备上另一个特定位置处的程序读入片内内存,并执行它。这个被称为 BL2(Bootloader 2) ,是我们编写的源码。(详情可参考博文“Exynos4412的启动过程分析”)在汇编流水灯程序中我们通过mkbl2工具制作的BL2: sudo ./sd_fusing.sh /dev/sdc ../../../hardware/1th_led_s/led.bin 分析sd_fusing.sh可知: #################
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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