根据提供的文档内容,本文将详细解析ARM9硬件接口学习之四——CLOCK的相关知识点,主要聚焦于S3C2410芯片中的时钟管理机制,包括PLL(锁相环)的工作原理及其配置方法。
### S3C2410时钟系统概述
#### 1. PLL简介
S3C2410芯片配备了两个PLL电路:MPLL(主PLL)和UPLL(USB PLL)。这些PLL电路的主要功能是基于外部晶振输入,生成更高的时钟频率供CPU和其他外围设备使用。
- **MPLL**:主要用于CPU核心及其外围设备。
- **UPLL**:专为USB设备提供时钟源。
#### 2. 时钟结构
通过MPLL可以产生三种不同用途的时钟频率:
- **FCLK**:用于CPU核心。
- **HCLK**:用于AHB(Advanced High-performance Bus)总线上的设备,如SDRAM。
- **PCLK**:用于APB(Advanced Peripheral Bus)总线上的设备,如UART。
### MPLL启动流程详解
#### 1. 上电复位过程
根据S3C2410数据手册第224页的“Figure7-4.Power-On Reset Sequence”,可以了解到MPLL的启动流程如下:
1. **晶振输出稳定**:上电几毫秒后,晶振输出稳定,此时FCLK等于晶振频率。nRESET信号恢复高电平后,CPU开始执行指令。
2. **MPLL启动**:可以通过在程序开始处启动MPLL。启动前需要先设置相关的寄存器,设置完成后需要等待一段称为LockTime的时间。在这段时间内,FCLK会暂时停止输出,导致CPU停止工作。
3. **MPLL输出稳定**:LockTime结束后,MPLL输出稳定,CPU开始以新的FCLK频率运行。
#### 2. MPLL相关寄存器配置
为了设置S3C2410的时钟频率,需要配置以下几个寄存器:
1. **LOCKTIME**:该寄存器用于设置MPLL和UPLL的LockTime。位[23:12]用于UPLL,位[11:0]用于MPLL。通常建议使用默认值0x00ffffff。
2. **CLKDIVN**:该寄存器用于设置FCLK、HCLK和PCLK之间的比例关系。默认情况下,三者比例为1:1:1。例如,如果设置为0x03,则比例变为1:2:4。
3. **MPLLCON**:此寄存器用于配置MPLL的具体参数。通过MDIV、PDIV和SDIV来计算最终的FCLK频率。计算公式为:\(MPLL(FCLK) = (m * Fin) / (p * 2^s)\),其中\(m = MDIV + 8\),\(p = PDIV + 2\),\(Fin\)为默认输入时钟频率(12MHz)。
例如,将MPLLCON设置为0x5c0040,可以得到\(FCLK = 200MHz\)。再结合CLKDIVN设置,可知\(HCLK = 100MHz\),\(PCLK = 50MHz\)。
### 实际应用示例
为了方便理解和应用,以下是一个简单的时钟初始化函数示例:
```c
void clock_init(void) {
/* 设置LockTime */
rLOCKTIME = 0xFFFFFF;
/* 设置FCLK:HCLK:PCLK = 1:2:4 */
/* 假设处理器主频为200MHz,则HCLK为100MHz,PCLK为50MHz */
rCLKDIVN = 0x3;
/* 设置时钟频率为200MHz */
rMPLLCON = 0x5c0040;
}
```
通过上述函数,可以轻松地实现S3C2410芯片的时钟初始化,确保CPU和外围设备能够按照预设的频率稳定工作。
S3C2410的时钟管理系统通过MPLL和UPLL为整个系统提供了稳定的时钟源,并通过合理的寄存器配置实现了灵活的时钟频率分配。这对于确保嵌入式系统的性能和稳定性至关重要。