S3C2440串口代码_函数_初始化_发送Byte_发送string_Printf
通常情况下都会将串口的初始化语句写进一个初始化函数Uart_Init()中:
1 void Uart_Init(int baud) 2 { 3 int i; 4 rUFCON0 = 0x0; //UART FIFO disable 5 rULCON0 = 0x3; //关闭红外传输模式而用Normal模式,No parity,1 stop,每帧8bits数据位 6 rUCON0 = 0x805; //先看[11:10]=10,UART时钟源为PCLK,那么[15:12]就没用了,置零,接收与发送的中断类型均为Pulse,禁止接收超时中断的产生,禁止接收错误中断的产生 7 //不采用loopback工作模式而采用normal模式,不发送break signal而采用normal transmit 8 rUBRDIV0=( (int)(50000000/16./baud+0.5) -1 ); //Baud rate divisior register 0 9 for(i=0;i<100;i++);//延时 10 }
串口发送字节Byte的函数Uart_SendByte():
1 void Uart_SendByte(int data) 2 { 3 4 if(data=='\n') 5 { 6 while(!(rUTRSTAT0 & 0x2)); 7 8 WrUTXH0('\r'); 9 } 10 while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty. 11 12 WrUTXH0(data);//一个宏 13 }
上面程序中的WrUTXH0()是一个宏,定义在另外一个文件中,形式为:
#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)
所以WrUTXH0(data)的作用就相当于:
1 #define rUTXH0 (*(volatile unsigned *)0X50000020) 2 rUTXH0=data;
这两者功能是等价的。
串口发送字符串的函数Uart_SendString()实质就是不断调用Uart_SendByte()函数,将字符串一个字节一个字节的发出去:
1 void Uart_SendString(char *pt) 2 { 3 while(*pt) 4 Uart_SendByte(*pt++); 5 }
串口打印函数Uart_Printf()就是调用发送字符串的函数:
1 void Uart_Printf(char *fmt,...) 2 { 3 va_list ap; 4 char str[255]; 5 6 va_start(ap,fmt); 7 vsprintf(str,fmt,ap); 8 Uart_SendString(str); 9 va_end(ap); 10 }
Uart_GetKey():
1 char Uart_GetKey(void) 2 { 3 if (rUTRSTAT0 & 0X01) //接收是否完毕 =1结束 4 return rURXH0; 5 else 6 return 0; 7 }