做嵌入式的基本上都清楚,板子基本上跑起來了,第一個(gè)肯定要配置的是串口,便于我們后面調(diào)試信息的輸出,和一些系統(tǒng)參數(shù)的輸出,讓我們有更直觀看見程序的運(yùn)行。
—————————————————————————————————————————————
硬件平臺(tái):TQ2440 (S3C2440A)
開發(fā)環(huán)境:ADS1.2
時(shí) 間:2010-12-12
—————————————————————————————————————————————
1:硬件電路:
底板電路 核心板上的連接管腳
由于TQ2440的板子上只引出了一個(gè)串口,也就是用的UART0作為COM1,所以我嗎只需要配置相關(guān)的引腳為串口功能即可。
接著參考2440的說明文檔:
所以把GPH相關(guān)的GPH0-3都配置為第二功能UART功能。即可以上至完成了管腳的配置,接著對(duì)UART的功能進(jìn)行配置。
A:UART寄存器:
從2440的數(shù)據(jù)手冊(cè)上我們可以知道他的寄存器的地址都是連接著的,所以我們直接用結(jié)構(gòu)體來表示,因?yàn)樗?個(gè)串口,所以,我們這里就可以用3個(gè)不同的結(jié)構(gòu)體指針來操作不同的寄存器。代碼如下:
1: #define IO_CON_BASE 0x56000000
2: #define IO_DAT_BASE 0x56000004
3:
4: #define UART0_BASE 0x50000000 // UART0 Base Address
5: #define UART1_BASE 0x50004000 // UART1 Base Address
6: #define UART2_BASE 0x50008000 // UART2 Base Address
7:
8: #define REG8(x) (*((volatile unsigned char *)(x)))
9: #define REG16(x) (*((volatile unsigned short *)(x)))
10: #define REG32(x) (*((volatile unsigned long *)(x)))
11:
12: typedef volatile unsigned char reg8;
13: typedef volatile unsigned short reg16;
14: typedef volatile unsigned long reg32;
15:
16: /*
17: GPIO_CFG_SET說明: group--表示是那組IO(注意沒有GPA)
18: index--表示這組中的那個(gè)引腳
19: type --表示是配置為輸入還是輸出等其他功能
20: */
21: #define GPIO_CFG_SET(group,index,type) do{
22: (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3< 25: 26: /* 27: GPIO_DAT_SET說明: group--表示是那組IO(注意沒有GPA) 28: index--表示這組中的那個(gè)引腳 29: val --表示對(duì)此引腳寫入的數(shù)據(jù) 30: */ 31: #define GPIO_DAT_SET(group,index,val) do{ 32: (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1< 35: /* 36: 因?yàn)镚PA的控制寄存器,每個(gè)引腳只只占用一位,所以為了能統(tǒng)一這里,就沒有把 37: GPA加進(jìn)來,而后面的GPB-GPJ的控制寄存器每個(gè)引腳對(duì)應(yīng)2位 38: */ 39: enum{GPB=1,GPC,GPD,GPE,GPF,GPG,GPH,GPI,GPJ}; 40: /* 41: 從GPB開始由于用兩位表示此引腳的功能所以有四種可能 42: 0代表INPUT,1代表OUTPUT,2代表第三功能,3代表第四功能 43: */ 44: enum{INPUT=0,OUTPUT,THI_FUNC,FOR_FUNC}; 45: /* 46: 定義高低電平 47: */ 48: enum{LOW=0,HIG}; 49: 50: // UART Registers 51: typedef struct { 52: reg32 ULCON; // UART Line Control 由于控制數(shù)據(jù)格式,常用的為N-8-1模式 53: reg32 UCON; // UART Control 控制UART的工作狀態(tài),例如DMA,中斷等 54: reg32 UFCON; // UART FIFO Control 控制UART的FIFO,這里沒有用到 55: reg32 UMCON; // UART MODEM Control 在MODEM模式下的控制寄存器,這里沒有用到 56: reg32 UTRSTAT; // UART Tx/Rx Status UART發(fā)送和接受狀態(tài)寄存器 57: reg32 UERSTAT; // UART Error Status UART錯(cuò)誤狀態(tài)寄存器 58: reg32 UFSTAT; // UART FIFO Status UART---FIFO狀態(tài)寄存器 59: reg32 UMSTAT; // UART MODEM Status UART---MODEM狀態(tài)寄存器 60: reg8 UTXH; // UART Tx Hold UART發(fā)送數(shù)據(jù)寄存器 ##注意這里是一個(gè)char類型的 61: reg8 pad0[3]; 62: reg8 URXH; // UART RX Buffer UART接受數(shù)據(jù)寄存器 ##注意這里是一個(gè)char類型的 63: reg8 pad1[3]; 64: reg32 UBRDIV; // UART Baud Rate Divisor UART的波特率產(chǎn)生器的分頻率 65: } regUART; 66: 67: #define pUART0 ((regUART *)UART0_BASE) 68: #define pUART1 ((regUART *)UART1_BASE) 69: #define pUART2 ((regUART *)UART2_BASE) 2:2440的UART的配置 上面已經(jīng)把相關(guān)的寄存器介紹的很清楚了,所以這里的配置就直接給出代碼了,因?yàn)榭梢灾苯訁⒖紨?shù)據(jù)手冊(cè)得到: 1: void uart_init(void) 2: { 3: //設(shè)置GPH[0..3]為uart0的輸出引腳 4: GPIO_CFG_SET(GPH,0,THI_FUNC); 5: GPIO_CFG_SET(GPH,1,THI_FUNC); 6: GPIO_CFG_SET(GPH,2,THI_FUNC); 7: GPIO_CFG_SET(GPH,3,THI_FUNC); 8: 9: pUART0->ULCON= 0x03; //N-8-1 10: pUART0->UCON= 0x245; //中斷和查詢模式 11: pUART0->UFCON= 0x0; //No Use 12: pUART0->UMCON= 0x0; //No Use 13: pUART0->UBRDIV= 26; //當(dāng)前板子的速度是FCLK:400M,HCLK=100M,PCLK=50M,UATR=115200 14: } 這樣串口就能工作起來的了,自己在把鏈接串口工具配置成相同的波特率就能正常工作了。 3: 相關(guān)代碼的實(shí)現(xiàn) 接下來就是串口發(fā)送和接受數(shù)據(jù)的一些功能函數(shù)的實(shí)現(xiàn)了,下面也只實(shí)現(xiàn)了一些簡單的函數(shù): 輸出部分: 1: void u_printf(char *fmt,...) //格式化輸出 2: { 3: va_list ap; 4: char str[100]; 5: va_start(ap,fmt); 6: vsprintf(str,fmt,ap); 7: send_str(str); 8: va_end(ap); 9: } 10: void send_str(char *p_str) //發(fā)送一個(gè)字符串 11: { 12: while(*p_str!='