学习朱有鹏朱老师嵌入式教学视频学习笔记 shfit键又坏了
大部分cpu采用三种方式;
外部直接输入时钟信号,soc引脚用来输入外部时钟信号,可以用在低频,用的很少
外部晶振加上内部时钟发生器。可以用在低频。大部分的单片机
外部晶振加上内部时钟发生器加上内部PLL锁相环产生高频时钟加上内部分频器分频得到各种频率的时钟,210就是这样。
210采用这种方式的原因;
第一;外部高频电路很复杂,干扰大。
第二;高频晶振价格高
第三 ;因为soc不同设备之间时钟频率不同,所以需要先统一高频,然后每个外设都有自己的分频器。
s5pv210的时钟系统简介;
时钟域;
MSYS.DSYS.PSYS
首先在s5pv210开发板上有三种时钟域
main system (MSYS) 包括cortexA8内核,dram控制器,IRAM,IROM
display system (DSYS) 和视频显示,编解码有关的。硬件编解码比如软件的快得多。
peripheral system (PSYS)。和内部的各种外设有关 GPIO,USB等
时钟产生过程 晶振加时钟发生器
s5pv210外接的晶振是USBXTI,所以给晶振模块上电后,得到原始时钟,经过一系列开关筛选,并经过PLL锁相环得到高频时钟。
四种PLL使用范围,在数据手册可以查看到;
APLL;Cortex A8 and MSYS clock domain uses APLL ( ARMCLK, HCLK_MSYS, and PCLK_MSYS).
MPLL和VPLL;DSYS and PSYS clock domain (that is, HCLK_DSYS, HCLK_PSYS, PCLK_DSYS, and PCLK_PSYS) and
other peripheral clocks (that is, audio IPs, SPI, and so on)
EPLL;Video clocks uses VPLL
三种时钟域的关系 CLOCK RELATIONSHIP
MSYS;
ARMCLK;给cpu内核工作使用的时钟,也就是主频
HCLK-MSYS;给内存DMC0。DMC1使用
PCLK-MYSY 低频时钟
HCLK-IMEM 给iram,irom使用的时钟
DSYS;
HCLK-DSYS;高频时钟
PCLK-DYSY 低频时钟
PSYS;
HCLK-PSYS;高频时钟
PCLK-PYSY 低频时钟
默认设置的时钟典型值;
时钟系统体系框图;
从晶振和时钟发生器得到原始时钟,经过PLL高频再分频到各总线时钟
从中间时钟到各外设自己使用的时钟;
时钟系统的寄存器
1,xPLL-LOCK 控制PLL的锁定周期
PLL需要锁定周期,当输入频率改变或分频(乘法)值改变时。不可能一下就从低频突变到1Ghz, PLL_LOCK寄存器指定此锁定周期,该周期基于PLL的源时钟。
2,xPLL-CON用来开关pll电路,查看锁定状态,设置倍频倍数
3,控制不同MUX的选择
4,决定mux器件的开关。
4,设置DIV分频器的数值
实现时钟设置代码
.global clock_init
clock_init:
ldr r0, =ELFIN_CLOCK_POWER_BASE
// 1 设置各种时钟开关,暂时不使用PLL
ldr r1, =0x0
// 芯片手册P378 寄存器CLK_SRC:Select clock source 0 (Main)
str r1, [r0, #CLK_SRC0_OFFSET]
// 2 设置锁定时间,使用默认值即可
// 设置PLL后,时钟从Fin提升到目标频率时,需要一定的时间,即锁定时间
ldr r1, =0x0000FFFF
str r1, [r0, #APLL_LOCK_OFFSET]
str r1, [r0, #MPLL_LOCK_OFFSET]
// 3 设置分频
// 清bit[0~31]
ldr r1, [r0, #CLK_DIV0_OFFSET]
ldr r2, =CLK_DIV0_MASK
bic r1, r1, r2
ldr r2, =0x14131440
orr r1, r1, r2
str r1, [r0, #CLK_DIV0_OFFSET]
// 4 设置PLL
// FOUT = MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000 MHz
ldr r1, =APLL_VAL
str r1, [r0, #APLL_CON0_OFFSET]
// FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz
ldr r1, =MPLL_VAL
str r1, [r0, #MPLL_CON_OFFSET]
// 5 设置各种时钟开关,使用PLL
ldr r1, [r0, #CLK_SRC0_OFFSET]
ldr r2, =0x10001111
orr r1, r1, r2
str r1, [r0, #CLK_SRC0_OFFSET]
mov pc, lr