下面内容是《ARM处理器裸机开发实战—机制而非策略》里的,以s3c2440开发板为例
系统时钟是整个电路的心脏。
总体来说,与s3c2440处理器有关的时钟主要有4种:Fin、FCLK、HCLK和PCLK。
Fin: 外部输入的晶振频率
FCLK: 主要用于CPU核
HCLK: 主要用在与AHB总线互连的设备上(存储器控制器、lcd控制器、dma)
PCLK: 主要用在与APB总线互连的低速设备上(uart adc 定时器)
S3c2440系统时钟概述
S3c2440处理器的系统时钟分为两部分,外部有时钟输入引脚,内部有2个锁相环将外部输入时钟倍频到处理器工作所需要的时钟。锁相环相当于一个时钟变换电路,低频晶振输入即可得到处理器所使用的较高频的时钟。
锁相环示意图如下:
其中,MPLLCON和CLKDIVN是两个控制寄存器,分别用于控制分频比。
MPLLCON控制FCLK和Fin的比例关系
CLKDIVN用于控制FCLK、HCLK和PCLK之间的比例关系
此外,s3c2440内部还有一个锁相环UPLL,用于将外部时钟倍频到USB设备正常工作所需要的时钟频率。
系统时钟初始化
其流程图如图所示:
S3c2440系统时钟初始化流程如下:
(1) 系统刚上电几毫秒后,FCLK等于外部晶振的振荡频率,即FCLK=Fin
(2) 当复位信号nReset恢复高电平后,锁相环按照寄存器MPLLCON和CLKDIVN设定的倍频比例开始生成所需要的时钟频率。从锁相环开始工作到输出新的稳定的频率值需要一定的时间(lock time 即锁相环的捕获时间),经过这段时间后,锁相环输出新的频率值,这是FCLK等于锁相环的输出。
FCLK、HCLK和PCLK与Fin的关系
如何控制锁相环PLL的输出频率?s3c2440处理器内部有两个寄存器:MPLLCON寄存器用于控制FCLK和Fin的比例关系,CLKDIVN寄存器用于控制FCLK、HCLK和PCLK之间的比例关系。
FCLK = (2*m*Fin) / (p*2^s)
其中,m=MDIV+8,p= PDIV +2,,s=SDIV。MDIV, PDIV, SDIV是MPLLCON寄存器中的数据。
例如,已知系统外部晶振输入为12MHz,要求FCLK输出为200MHz,经过计算可以得到MDIV=92,PDIV=4,SDIV=1
可以用下面的指令进行初始化
M_MDIV EQU 92
M_PDIV EQU 4
M_SDIV EQU 1
ldr r0 , =MPLLCON
ldr r1 , =((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)
str r1,[r0]