串口设置之输入输出字符
S5PV210 UART相关说明 
        通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据。发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据 时,UART检测另一根电线的信号,将串行收集在缓冲区中,CPU即可读取UART获得这些数据。 
        在S5PV210中,UART提供了4对独立的异步串口I/O端口,有4个独立的通道,每个通道可以工作于DMA模式或者中断模式。其中,通道0有 256byte的的发送FIFO和256byte的接收FIFO,通道1有64byte的的发送FIFO和64byte的接收FIFO,而通道2和3只有 16byte的的发送FIFO和16byte的接收FIFO。 
S5PV210的uart结构图如下: 
 
S5PV210的uart结构图
UART使用标准的TTL/CMCOS逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP芯片,使用的是TX0和DX0: 
 
搜索“XuTXD0”,可知: 
 
通过设置UART相关寄存器,我们就可以驱动UART工作,达到发送和接收字符的目的。 
例子:
/main.c/ 
int main() 
{ 
char c; 
uart_init(); // 初始化串口 
while (1) 
{ 
c = getc (); // 接收一个字符c 
putc(c+1); // 发送字符c+1 
} 
return 0; 
} 
在main函数中,先会调用uart_init()初始化UART,然后使用getc接收PC发过来的字符,再调用putc()将该字符+1回复给PC。 
/uart.c/ 
void uart_init() 
{ 
// 1 配置引脚用于RX/TX功能 
GPA0CON = 0x22222222; 
GPA1CON = 0x2222; 
// 2 设置数据格式等 
UFCON0 = 0x1; // 使能FIFO 
UMCON0 = 0x0; // 无流控 
ULCON0 = 0x3; // 数据位:8, 无校验, 停止位: 1 
UCON0 = 0x5; // 时钟:PCLK,禁止中断,使能UART发送、接收 // 3 设置波特率 
UBRDIV0 = UART_UBRDIV_VAL; // 35 
UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0x1 
} 
上述代码共有3个步骤,下面我们来一一讲解每一个步骤: 
第一步 配置引脚用于RX/TX功能 
参考UART引脚连接图,我们需要设置GPA0CON和GPA1CON寄存器使GPA0和GPA1引脚用于UART功能。 
 
第二步 设置数据格式等 
<1> ULCON0用来设置数据格式,见下图 
Word Length = 11,8bit的数据; 
Number of Stop Bit = 0,1bit的停止位; 
Parity Mode = 000,无校验; 
Infrared Mode =0,使用普通模式; 
所以ULCON0=0x3
<2> 9UCON0是UART的配置寄存器,见下图 
 
Receive Mode = 01 ,使用中断模式或者轮询模式; 
Transmit Mode = 01,使用中断模式或者轮询模式; 
Send Break Signal = 0,普通传输; 
Loop-back Mode = 0,不使用回环方式; 
我们采用轮询的方式接受和发送数据,不使用中断,所以bit[6-9]均为0; 
Clock Selection = 0,使用PCLK作为UART的工作时钟; 
我们不使用DMA,所以bit[16]和bit[20]均为0; 
所以UCON0 = 0x5
<3> UFCON0和UMCON0 
这两个寄存器比较简单,UFCON0用来使能FIFO,UMCON0用来设置无流控。
第三步 设置波特率 
波特率即每秒传输的数据位数,涉及两个寄存器:UBRDIV0和UDIVSLOT0 
 
波特率设置相关公式:UBRDIVn + (num of 1’s in UDIVSLOTn)/16 = (PCLK / (bps x 16)) ?1 
其中,由Maximum Operating Frequency for Each Sub-block图可知,UART工作于PSYS下,所以PCLK即PCLK_PSYS = 66.5MHz,我们的波特率bps设置为115200,所以 
(66.5MHz/(115200 x 16)) – 1 = 35.08 = UBRDIVn + (num of 1’s in UDIVSLOTn)/16,所以我们设置UBRDIV0=35,UDIVSLOT0=0x1 
getc()和putc()的代码如下: 
// 接收一个字符 
char getc(void) 
{ 
while ((UFSTAT0 & 0xff) == 0); // 如果RX FIFO空,等待 
return URXH0; // 取数据 
} 
// 发送一个字符 
void putc(char c) 
{ 
while (UFSTAT0 & (1<<24)); // 如果TX FIFO满,等待 
UTXH0 = c; // 写数据 
} 
 
通 过读UTRSTAT0 发送/接收状态寄存器,当Receive buffer data ready= 1时说明接收到数据,读URXH0寄存器可以得到8bit的数据;当Transmitter empty = 1时说明可以发送数据,写8bit的数据到UTXH0。
原文:http://blog.csdn.net/ajax_zh/article/details/44231275