S3C2440的UART详解
void uart0_init(void)
{
GPHCON |= 0xaa; // GPH0,GPH1,GPH2,GPH3分别nCTS0,nRTS0,TXD0,RXD0
GPHUP = 0x7ff; //内部上拉被禁止
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
ULCON0 = 0x03; // 8N1(8个数据位,无校验,1个停止位)
UCON0 = 0x245;
// 查询方式,UART时钟源为PCLK,中断请求方式为Tx-电平,Rx-脉冲
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //设置波特率
}
接下来几个是进行数据的发送和接收的函数
//======此函数的作用是向UART发送一个字符,不用FIFO,直接用UART发送
void Uart_SendByte(char data)
{
if(data==)
{
while(!(rUTRSTAT0 & 0x2));
取出rUTRSTAT0(UART0发送/接收寄存器)寄存器中的第2位,含义为Transmit buffer是否为空,为1时表示空。在发送缓冲器为空时,再发送
// Delay(1); //because the slow response of hyper_terminal
WrUTXH0(); //将数据写入到UART0发送缓冲器中
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
// Delay(1);
WrUTXH0(data);
}
//========发送字符串的函数
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
//C语言的可变参数,为了达到printf的功能
//例如:Uart_Printf(“my name is %s”a[10]);就相当于Uart_SendString(“my name is XX”);XX是a[10]的内容
void Uart_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
}
//==等待,直到UART的发送器为空,就是发送完毕
void Uart0_TxEmpty()
{
while(!(rUTRSTAT0 & 0x4)); //Wait until Tx shifter is empty.
}
//===从终端上获取敲入的字符,返回值为char类型。RdURXH0有数据时,返回URXH的数据。当URXH没有数据时,总是等待,直到有数据。
char Uart_Getch(void)
{
while(!(rUTRSTAT0 & 0x1)); //接收缓冲器接收到有效数据
return RdURXH0(); //从UART0接收缓冲器(URXH0)接收数据
}
//===Uart_GetKey 这个与Uart_Getch 不同的是,当URXH没有数据时返回0。有数据时,返回数据,这个函数可以用来查看当前URXH中的值。
char Uart_GetKey(void)
{
if(rUTRSTAT0 & 0x1) //Receive data ready
return RdURXH0();
else
return 0;
}
//==这个函数用于从终端得到一个字符串,并储存到string中
void Uart_GetString(char *string)
{
char *string2 = string;
char c;
while((c = Uart_Getch())!=)//’’是回车键
{
if(c==)//’’是backspace按键
{
if( (int)string2 < (int)string )
{
Uart_Printf(" ");//因为backspace,所以删除最后一个显示的字符
string--;
}
}
else
{
*string++ = c; //不是回车和退格键,则储存到string中
Uart_SendByte(c); //每输入一个字符,都将它输出到终端中
}
}
*string= ;
Uart_SendByte();
}
评论