概述:S3C2440有三个独立的异步串行I/O端口,每个都可以基于中断和居于DMA模式的操作,UART的时钟源是PCLK(外设的频率)、FCLK/n(ARM的主频)和UEXTCLK(外部时钟输入),每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,如图:

TQ2440之UART_寄存器

 

ULCONn:线路控制寄存器,包括起始位,数据位,奇偶校验位,停止位,红外模式和普通模式

UCONn:控制寄存器,FCLK分频器,时钟选择,中断类型(脉冲和电平)

UFCONn:FIFO控制寄存器,FIFO的触发深度,使能,FIFO清理

UMCONn:UART MODEM控制寄存器

UTRSTATn:RX TX状态寄存器(与FIFO状态寄存器的区别),发送器空,发送缓冲器空,接受缓冲期数据就绪

UFSTATn:FIFO状态寄存器,FIFO字节计数

UMSTATn:MODEM寄存器

UTXHn URXHn:接受和发送缓冲寄存器

UBRDIVn:波特率分频寄存器

UERSTATn:错误状态寄存器,断点错误,帧错误,奇偶校验错误,溢出错误

 

源码:

#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000023)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x50000027)

void uart_config(int pclk, int baud)
{
rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable
rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits
rUCON0 = 0x245; // Control register
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0
}
void write_data(char data)
{
while(!(rUTRSTAT0 & 0x2));
WrUTXH0(ch);
}
char read_data(void)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();}
int main(int argc, int *argv[])
{
char c;
uart_config(pclk, 115200); //pclk is cpu peripheral clock
write_data('A');
c = read_data();
printf("%c\n", c);
}