|||
由于本日志不能上传附件,所以 SylixOS 与 S3C2416的常用文档请参见 pan.baidu.com/s/1bnwI77p。
在SylixOS的BSP中时钟的初始化文件位置在“bsp_zth2416\SylixOS\bsp\targetInit.c”中,其中“bsp_zth2416”为BSP工程名,其中通过RealCoder打开“BASE工程”与“BSP工程”如下图所示。
其中时钟配置说明如下图所示。
External Crystal 12M
MPLLCLK = 800M
EPLLCLK = 96M, ARMCLK = 400M, HCLK = 133M, DDRCLK = 266M, SSMCCLK = 66M, PCLK = 66M, HSMMC1 = 24M
ARMCLK = MPLLout / ARMCLK Ratio = MPLLout / (ARMDIV + 1) = 800 / 2 = 400MHz
HCLK = MPLLout / HCLK Ratio = MPLLout / ((PREDIV+1) * (HCLKDIV + 1)) = 800 / (3 * 2) = 133MHz
PCLK = HCLK / PCLKDIV = 133 / 2 = 66MHz
ARMDIV 1/1 = 3'b000 1/2 = 3'b001 1/3 = 3'b010 1/4 = 3'b011 1/6 = 3'b101 1/8 = 3'b111
PREDIV 2'b00 2'b01 2'b02 2'b03
HCLKDIV 2'b00 2'b01 2'b03
PCLKDIV 1'b0 1'b1
Page 89
PLL output frequency = 800MHz
ARMCLK = 400MHz, HCLK = 133MHz, PCLK = 66MHz, DDRCLK = 266MHz SSMCCLK = 66MHz
ARMDIV = 3'b001, PREDIV = 2'b10, HCLKDIV = 2'b01, PCLKDIV = 1'b1 HALKHCLK = 1'b1
PLL output frequency = 533MHz
ARMCLK = 266MHz, HCLK = 133MHz, PCLK = 66MHz, DDRCLK = 266MHz SSMCCLK = 66MHz
ARMDIV = 3'b0001, PREDIV = 2'b01, HCLKDIV = 2'b01, PCLKDIV = 1'b1 HALKHCLK = 1'b1
PLL配置函数如下:
/*********************************************************************************************************
** 函数名称: pllInit
** 功能描述: 初始化 PLL
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static void pllInit (void)
{
volatile int i;
/*
* ARMCLK Ratio = (ARMDIV + 1) = 2
* HCLK Ratio = (PREDIV + 1) * (HCLKDIV + 1) = 6
* pCLK Ratio = (PCLKDIV + 1) = 2
*
* ARMCLK = MCLK / ARMCLK Ratio = 400 MHZ
* HCLK = MCLK / HCLK Ratio = 133 MHZ
* PCLK = HCLK / pCLK Ratio = 66 MHZ
* HALF(SSMC)CLK = HCLK / 2 = 66 MHZ
*/
rCLKDIV0 = (1 << 9) | /* ARMDIV */
(2 << 4) | /* PREDIV */
(1 << 3) | /* HALFHCLK */
(1 << 2) | /* PCLKDIV */
(1 << 0); /* HCLKDIV */
rLOCKCON0 = 0x00000E10;
rCLKDIV1 = 1 << 4; /* USB 的固定时钟 48MHz */
rCLKSRC |= (3 << 7); /* 10 XTAL 11 EXTCLK */
rCLKSRC |= (1 << 6); /* EPLL Out */
rCLKSRC |= (1 << 4); /* MPLL Out */
rLOCKCON1 = 0x00001780;
for (i = 0; i < 0x10000; i++) {
}
}
CLOCK配置如下:
/*********************************************************************************************************
** 函数名称: clockInit
** 功能描述: 时钟初始化
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static void clockInit (void)
{
/*
* MCLK = 800 MHZ
*/
rMPLLCON = (0 << 24) | /* MPLL ON */
(400 << 14) | /* MDIV */
(3 << 5) | /* PDIV */
(1 << 0); /* SDIV */
/*
* ECLK = 96 MHZ (48 MHz 晶振)
* 这里各种依赖于ECLK的外设时钟不配置
* 由具体的驱动去配置
*/
rEPLLCON = (0 << 25) | /* EPLL 在停止模式时关闭 */
(0 << 24) | /* 使能 EPLL */
(32 << 16) | /* MDIV */
(1 << 8) | /* PDIV */
(4 << 0); /* SDIV */
rEPLLCON_K = 0x0000; /* KDIV */
armAsyncBusMode(); /* 异步总线工作模式 */
}