系統時鍾:
在開發版上,不同的器件運行在不同的時鍾頻率上,如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; }