zoukankan      html  css  js  c++  java
  • 系统时钟和UART的设置

    系统时钟:

          在开发版上,不同的器件运行在不同的时钟频率上,如CPU可能运行在400Mhz的频率上、SDRAM、DM9000等内存存储运行在100Mhz~133MHz上、

    串口i2c等运行在50Mhz上,而在开发板上只有一个12Mhz的晶振,则我们需要设置两个部分

    1、提高时钟频率12Mhz提高到400Mhz,有运用到PLL

    2、对400Mhz时钟分频,分为400Mhz、100Mhz~133Mhz、50Mhz。

    如图所示:

    开发板上分布

    怎么设置?

    相关设置代码

    #define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))
    #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))
    /*
     * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV
     * 有如下计算公式:
     *  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
     *  S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
     *  其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
     * 对于本开发板,Fin = 12MHz
     * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,
     * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
     */
    void clock_init(void)
    {
        // LOCKTIME = 0x00ffffff;   // 使用默认值即可
        CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
    
        /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
    __asm__(
        "mrc    p15, 0, r1, c1, c0, 0
    "        /* 读出控制寄存器 */ 
        "orr    r1, r1, #0xc0000000
    "          /* 设置为“asynchronous bus mode” */
        "mcr    p15, 0, r1, c1, c0, 0
    "        /* 写入控制寄存器 */
        );
    
        /* 判断是S3C2410还是S3C2440 */
        if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
        {
            MPLLCON = S3C2410_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
        }
        else
        {
            MPLLCON = S3C2440_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
        }       
    }

    -------------------------------------------------------------------------------------------------------------------------------------------------

    串口的使用

    PC:如何用串口?

    1、选中串口号

    2、设置波特率、停止位、数据位、关闭流控等

    3、打开串口

    4、收发数据

    我们需要做的:

    1、初始化串口

    2、设置引脚,把引脚设置为接受发送引脚

    3、设置相关寄存器,对流控、时钟源、波特率等设置

    设置串口相关代码

    #include "s3c24xx.h"
    #include "serial.h"
    
    #define TXD0READY   (1<<2)
    #define RXD0READY   (1)
    
    #define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz
    #define UART_CLK        PCLK        //  UART0的时钟源设为PCLK
    #define UART_BAUD_RATE  115200      // 波特率
    #define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)
    
    /*
     * 初始化UART0
     * 115200,8N1,无流控
     */
    void uart0_init(void)
    {
        GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0
        GPHUP   = 0x0c;     // GPH2,GPH3内部上拉
    
        ULCON0  = 0x03;     // 8N1(8个数据位,无较验,1个停止位)
        UCON0   = 0x05;     // 查询方式,UART时钟源为PCLK
        UFCON0  = 0x00;     // 不使用FIFO
        UMCON0  = 0x00;     // 不使用流控
        UBRDIV0 = UART_BRD; // 波特率为115200
    }
    
    /*
     * 发送一个字符
     */
    void putc(unsigned char c)
    {
        /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
        while (!(UTRSTAT0 & TXD0READY));
        
        /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
        UTXH0 = c;
    }
    
    /*
     * 接收字符
     */
    unsigned char getc(void)
    {
        /* 等待,直到接收缓冲区中的有数据 */
        while (!(UTRSTAT0 & RXD0READY));
        
        /* 直接读取URXH0寄存器,即可获得接收到的数据 */
        return URXH0;
    }
    
    /*
     * 判断一个字符是否数字
     */
    int isDigit(unsigned char c)
    {
        if (c >= '0' && c <= '9')
            return 1;
        else
            return 0;       
    }
    
    /*
     * 判断一个字符是否英文字母
     */
    int isLetter(unsigned char c)
    {
        if (c >= 'a' && c <= 'z')
            return 1;
        else if (c >= 'A' && c <= 'Z')
            return 1;       
        else
            return 0;
    }
  • 相关阅读:
    在 SVG 中添加交互性
    大型Web2.0站点构建技术初探 (转)
    鼠标右键右键菜单
    用SVG技术实现动态图形输出的嵌入式Web服务
    使用脚本动态操作 SVG 文档
    GDI+技术的坐标解决方案
    一个项目的粗略流程
    xml矢量图:svg的viewBox和vml的coordsize决定的虚坐标系简说
    用VML画图(一些基本的矢量图)
    列出本地可用字体
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6408825.html
Copyright © 2011-2022 走看看