做嵌入式的基本上都清楚,板子基本上跑起来了,第一个肯定要配置的是串口,便于我们后面调试信息的输出,和一些系统参数的输出,让我们有更直观看见程序的运行。
—————————————————————————————————————————————
硬件平台:TQ2440 (S3C2440A)
开发环境:ADS1.2
时 间:2010-12-12
—————————————————————————————————————————————
1:硬件电路:

底板电路 核心板上的连接管脚
由于TQ2440的板子上只引出了一个串口,也就是用的UART0作为COM1,所以我吗只需要配置相关的引脚为串口功能即可。
接着参考2440的说明文档:

所以把GPH相关的GPH0-3都配置为第二功能UART功能。即可以上至完成了管脚的配置,接着对UART的功能进行配置。
A:UART寄存器:
从2440的数据手册上我们可以知道他的寄存器的地址都是连接着的,所以我们直接用结构体来表示,因为他有3个串口,所以,我们这里就可以用3个不同的结构体指针来操作不同的寄存器。代码如下:
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--表示这组中的那个引脚
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--表示这组中的那个引脚 29: val --表示对此引脚写入的数据 30: */ 31: #define GPIO_DAT_SET(group,index,val) do{ 32: (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1< 35: /* 36: 因为GPA的控制寄存器,每个引脚只只占用一位,所以为了能统一这里,就没有把 37: GPA加进来,而后面的GPB-GPJ的控制寄存器每个引脚对应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 由于控制数据格式,常用的为N-8-1模式 53: reg32 UCON; // UART Control 控制UART的工作状态,例如DMA,中断等 54: reg32 UFCON; // UART FIFO Control 控制UART的FIFO,这里没有用到 55: reg32 UMCON; // UART MODEM Control 在MODEM模式下的控制寄存器,这里没有用到 56: reg32 UTRSTAT; // UART Tx/Rx Status UART发送和接受状态寄存器 57: reg32 UERSTAT; // UART Error Status UART错误状态寄存器 58: reg32 UFSTAT; // UART FIFO Status UART---FIFO状态寄存器 59: reg32 UMSTAT; // UART MODEM Status UART---MODEM状态寄存器 60: reg8 UTXH; // UART Tx Hold UART发送数据寄存器 ##注意这里是一个char类型的 61: reg8 pad0[3]; 62: reg8 URXH; // UART RX Buffer UART接受数据寄存器 ##注意这里是一个char类型的 63: reg8 pad1[3]; 64: reg32 UBRDIV; // UART Baud Rate Divisor UART的波特率产生器的分频率 65: } regUART; 66: 67: #define pUART0 ((regUART *)UART0_BASE) 68: #define pUART1 ((regUART *)UART1_BASE) 69: #define pUART2 ((regUART *)UART2_BASE) 2:2440的UART的配置 上面已经把相关的寄存器介绍的很清楚了,所以这里的配置就直接给出代码了,因为可以直接参考数据手册得到: 1: void uart_init(void) 2: { 3: //设置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; //当前板子的速度是FCLK:400M,HCLK=100M,PCLK=50M,UATR=115200 14: } 这样串口就能工作起来的了,自己在把链接串口工具配置成相同的波特率就能正常工作了。 3: 相关代码的实现 接下来就是串口发送和接受数据的一些功能函数的实现了,下面也只实现了一些简单的函数: 输出部分: 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) //发送一个字符串 11: { 12: while(*p_str!='

