系統時鍾和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\n"        /* 讀出控制寄存器 */ 
    "orr    r1, r1, #0xc0000000\n"          /* 設置為“asynchronous bus mode” */
    "mcr    p15, 0, r1, c1, c0, 0\n"        /* 寫入控制寄存器 */
    );

    /* 判斷是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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM