ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); 1)FLCK、HCLK 和 PCLK 的关系 S3C2440 有三个时钟 FLCK、HCLK 和 PCLK s3c2440 官方手册上说 P7-8 写到: 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 来的; 那么这三个时钟是什么关系呢? 这三个时钟通常设置为 1:4:8,1:3:6 的分频关系,也就说如果主频 FLCK是400MHz,按照1:4:8的设置,那么HLCK是100MHz,PLCK是50MHz 寄存器 CLKDIVN 表明并设置了这三个时钟的关系 如果 CLKDIVN 设置为 0x5,那么比例即为 1:4:8,前提是 CAMDIVN[9]为 0. 2)输入时钟FIN 与主频FCLK 的关系 现代的CPU 基本上都使用了比主频低的多的时钟输入,在CPU 内部使用锁相环进行倍频。对于S3C2440,常用的输入时钟FIN 有两种:12MHz和16.9344MHz,那么CPU 是如何将FIN 倍频为FCLK 的呢? S3C2440 使用了三个倍频因子MDIV、PDIV 和SDIV 来设置将FIN 倍频为MPLL,也就是FCLK MPLL=(2*m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s="SDIV" 寄存器 MPLLCON 就是用来设置倍频因子的 理论上,你可以通过设置该寄存器来实现不同的频率,然而,由于实际存在的各种约束关系,设置一个适当的频率并不容易,手册上列出了一些常用频率的表格, 例如,假设输入时钟FIN=16.9344M,MDIV=110, PDIV="3", SDIV="1", 利用上面的公式,FCLK=2*16.9344*(110+8)/((2+3)*2)=399.65 3)关于USB 时钟 S3C2440 有两个锁相环,一个主锁相环MPLL 提供给 FCLK 的,另外一个UPLL 是提供给 USB 时钟(48MHz)的,与MPLL 一样,UPLL 的产生也是通过 UPLLCON 寄存器设置分频因子得到,计算公式稍有不同: UPLL=(m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s="SDIV",同样,可以通过查表得到一个合适的值。 最后值得一提的是,在CLKDIVN 的第三...