Clock研究
关键字
PLL 锁相环,用于产生高频率时钟,有两种锁相环,MPLL和UPLL
MPLL 用于对CPU产生高频率的锁相环
UPLL 用于对USB设备产生高频率的锁相环
XTIpll 外部晶振
EXTCLK 外部时钟
OSC 振荡器
FCLK CPU系统时钟
HCLK AHB高速总线时钟
PCLK APB外围设备总线时钟
-
Clock框图
-
时钟的产生
如上图所示,可以通过设置CPU引脚OM[3:2]选择使用外部时钟EXTCLK或者由外部晶振XTIpll通过OSC产生时钟。
MPLL在复位开始的时候,MPLL输出(Mpll)并没有作为系统时钟,而是使用外部时钟或者外部晶振提供的时钟直接作为系统时钟。只有在MPLLCON寄存器中写入值之后才由MPLL的输出作为系统时钟
-
时钟控制逻辑
时钟控制逻辑决定使用PLL时钟(Mpll)还是直接使用外部时钟(XTpll或者EXTCLK)。
上图实际上包括了两个过程:上电复位和配置PLL
-
上电复位
时钟控制逻辑如下:
晶振在若干毫秒内开始震荡(第三行)
在OSC(XTIpll)时钟稳定后,此时的PLL按照默认配置运行,PLL输出不稳定,使用Fin作为FCLK(第六行)
释放nRESET信号,即nRESET上拉(第二行)
需要说明的是在nRESET是CPU的一个引脚,它处于高位的时候,Fin才会向CPU输出频率,也就是说上图在nRESET上拉的时候,CPU才开始工作,如果nRESET处于低位4个时钟周期,并从低电平变为高电平的时候,将会引发CPU复位,在CPU复位的时候,将会有如下操作:
-
复制当前PC和CPSR的值到R14_svc和SPSR_svc
-
强制进入管理模式,职位CPSR中的I和F位,清楚CPSR中的T位
-
强制PC开始从0地址取值
-
在ARM状态下恢复执行
-
配置PLL
不论是上电复位还是在普通模式下都可以改变PLL,其时钟控制过程也是相同的。
时钟控制逻辑禁止FCLK,时间长度是一个Lock Time,然后PLL便可以稳定输出(如上图第四行)
-
锁相环是如何得到高频率的
Mpll = (2*m*Fin)/(p*2s)
其中Mpll是MPLL的输出频率,m,p,s是三个分频器的值,Fin是输入频率
-
分频
从Clock框图中可以看出,FCLK是供给给Arm920T内核的时钟,HCLK是供给给内存控制器,Nand控制器,LCD控制器等的时钟,PCLK是供给给外部的低速设备控制器的时钟。Mpll输出的频率需要将FCLK分频,供给给HCLK和PCLK,这是通过设置CLKDIVN和CAMDIVN寄存器来实现的。除此之外,当FCLK与HCLK相等的时候,CPU工作在fast bus mode快速总线模式下,当他们不相等的时候,需要将CPU设置为异步总线模式
-
从软件角度看时钟系统
时钟是计算机系统的硬件基础,所有的硬件都是工作在时钟信号之上的,随着高信号和低信号的交替变换,完成一步一步预定的操作。硬件和软件在逻辑上是等效的。从软件角度看,这不就是一个并行系统么?硬件部件可以看做是软件模块,只要有时钟存在,他们就会不停的运作,不论是CPU,内存,LCD,UART还是DMA,他们都更随时钟的脚步,当然他们之间也需要有协调和同步的时候,但从逻辑上看,他们不就像是操作系统上不同的进程在运行么?CPU通过寄存器来控制和读取不同硬件的状态,设备通过中断向CPU发出请求,这不都是一种进程间通信的手段么?不同于单CPU操作系统上的多进程实际上是分时系统,这些硬件组成的是真正的并行系统
-
代码实现:
WTCON EQU 0x53000000 ; 看门狗控制寄存器
WTDAT EQU 0x53000004 ; 看门狗数据寄存器
LOCKTIME EQU 0x4c000000 ; 变频锁定时间寄存器
MPLLCON EQU 0x4c000004 ; MPLL寄存器
CLKDIVN EQU 0x4c000014 ; 分频比寄存器
AREA CLOCK, CODE, READONLY
ENTRY
start
ldr r0, = 0x53000000 ; 看门狗关闭代码
mov r1, #0
str r1, [r0]
;bl clock_init ; 调用时钟初始化函数
bl led_on ; 调用点亮Led函数
clock_init ; 时钟初始化代码
; 设置锁频时间
ldr r0, =LOCKTIME ; 取得LOCKTIME寄存器地址
ldr r1, =0x00ffffff ; LOCKTIME寄存器设置数据
str r1, [r0] ; 将LOCKTIME设置数据写入LOCKTIME寄存器
; 设置分频数
ldr r0, =CLKDIVN ; 取得CLKDIVN寄存器地址
mov r1, #0x05 ; CLKDIVN寄存器设置数据
str r1, [r0] ; 将CLKDIVN设置数据写入CLKDIVN寄存器
; 修改CPU总线模式
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
ldr r0, =MPLLCON
ldr r1, =0x5c011 ; MPLL is 400MHz
str r1, [r0]
mov pc, lr
参考
S3C2440全套中文手册.pdf
深入浅出嵌入式底层软件