系統時鐘和UART的設置

系統時鐘:git

      在開發版上,不一樣的器件運行在不一樣的時鐘頻率上,如CPU可能運行在400Mhz的頻率上、SDRAM、DM9000等內存存儲運行在100Mhz~133MHz上、async

串口i2c等運行在50Mhz上,而在開發板上只有一個12Mhz的晶振,則咱們須要設置兩個部分函數

一、提升時鐘頻率12Mhz提升到400Mhz,有運用到PLLspa

二、對400Mhz時鐘分頻,分爲400Mhz、100Mhz~133Mhz、50Mhz。code

如圖所示:blog

開發板上分佈內存

怎麼設置?開發

相關設置代碼get

#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 */
    }       
}

-------------------------------------------------------------------------------------------------------------------------------------------------it

串口的使用

PC:如何用串口?

一、選中串口號

二、設置波特率、中止位、數據位、關閉流控等

三、打開串口

四、收發數據

 

咱們須要作的:

一、初始化串口

二、設置引腳,把引腳設置爲接受發送引腳

三、設置相關寄存器,對流控、時鐘源、波特率等設置

 

設置串口相關代碼

#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;
}
相關文章
相關標籤/搜索