SylixOS的BSP开发实例之S3C2416 【第一篇】时钟配置

 由于本日志不能上传附件,所以 SylixOS 与 S3C2416的常用文档请参见pan.baidu.com/s/1bnwI77p。 

    在SylixOSBSP中时钟的初始化文件位置在“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();                                                  /*  异步总线工作模式            */
}

SylixOS技术讨论群(32537017) SylixOS开发者联盟群(216907470)

系统常用链接:
【1】系统主页  www.sylixos.com
【2】系统百科  wiki.sylixos.com/index.php/%E9%A6%96%E9%A1%B5
【3】系统下载  git.sylixos.com/cgit/
【4】系统论坛  bbs.sylixos.com/forum.php
【5】社区新闻  bbs.sylixos.com/forum.php
【6】清华镜像站点 coop.tuna.tsinghua.edu.cn/git  coop.tuna.tsinghua.edu.cn/git (改版中)
【7】北邮镜像站点(建设中)


### 关于SylixOS BSP启动的信息 #### SylixOS BSP启动教程概述 SylixOS板级支持包(Board Support Package, BSP)的构建和启动涉及多个方面,包括但不限于初始化硬件抽象层、配置外设接口以及加载必要的驱动程序。对于BSP开发而言,《sylixos应用和驱动/BSP移植》提供了详细的指导文档[^4]。 为了成功启动基于SylixOS系统的特定平台,在创建新的BSP时通常遵循以下流程: ```c // 初始化函数定义 void Board_Init(void){ // 系统时钟设置 SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); // UART初始化用于调试输出 MX_USARTx_UART_Init(); // 其他外设初始化... } ``` 这段代码展示了如何通过调用一系列初始化子程序来准备运行环境。这一步骤至关重要,因为只有当所有必需组件都被正确设定之后,才能继续执行后续操作。 #### 常见问题及解决办法 1. **无法识别目标板** 如果遇到这种情况,应确认连接线缆无误,并检查JTAG/SWD接口是否正常工作。另外还需验证所选CPU型号与实际使用的微控制器相匹配。 2. **引导过程中卡住** 这可能是由于内存映射错误或是某些关键寄存器未被适当配置引起的问题。建议仔细对照官方手册中的说明进行核对;也可以尝试启用更多的诊断信息以便更好地定位故障点所在位置。 3. **缺少必要驱动** 当发现有部分功能未能按预期运作时,则可能是因为对应的驱动模块尚未加入到项目当中。此时应该参照《sylixos的应用和驱动/BSP移植》,确保所有的依赖项都已妥善处理并编译入内核镜像文件中去。 #### 调试技巧 利用RealEvo-IDE提供的强大调试工具可以极大地方便开发者排查问题根源。该集成开发环境中包含了专门针对嵌入式系统的调试特性,比如实时变量监视、断点管理等功能,有助于加快解决问题的速度[^2]。 ```bash # 使用tcpdump捕获网络流量数据以辅助分析联网类别的异常状况 tcpdump -i eth0 host 192.168.1.1 and port 80 ``` 上述命令可用于收集有关HTTP请求的数据流样本,这对于理解潜在的通讯障碍非常有用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值