系統時鐘: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; }