TQ2440之UART
原创
©著作权归作者所有:来自51CTO博客作者JDSH0224的原创作品,请联系作者获取转载授权,否则将追究法律责任
概述:S3C2440有三个独立的异步串行I/O端口,每个都可以基于中断和居于DMA模式的操作,UART的时钟源是PCLK(外设的频率)、FCLK/n(ARM的主频)和UEXTCLK(外部时钟输入),每个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);
}