1:s3c2440串口概述
s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行I/O(SIO)端
口,每个端口都可以在中断模式或DMA模式下操作。换言之,UART 可以生成一个中断或
DMA 请求用于CPU 和UART 之间的数据传输。
2:串口的工作原理
每个UART 包含一个波特率发送器,发送器,计数器和一个控制单元,如图11-1 所示。其波特率发生器可由PCLK,FCLK/n 或UEXTCLK(外部输入时钟)来锁定。发送器和接收器包含了64 位FIFO 和数据移位器。数据写到FIFO 然后在被传送前拷贝到发送移位器。数据通过发送数据引脚(TxDn)被发出。同时,接收数据通过接收数据引脚(RxDn)移入,然后从移位器拷贝到FIFO。
3:串口寄存器的设置
在使用UART前,需要设置波特率,传输格式,设置管脚为UART功能,选择UART通道的工作模式为中断模式或者DMA模式,设置好之后,往某个寄存器中写入数据即可发送,读取某寄存器即可得到接收的数据,可以通过查询状态寄存器或者设置中断来获知数据是否已经发送完毕,是否已经接收到数据。
配置相应I/O口的寄存器,将所涉及的UART通道管脚设置为UART功能。
比如UART通道0中,GPH2,GPH3分别用作TXD0,RXD0,要使用UART通道0时,先设置GPHCON寄存器将GPH2,GPH3引脚功能设置为TXD0,RXD0。
UBRDIVn寄存器,用于设置波特率。
ULCONn寄存器,设置传输格式。
UCONn寄存器,用于选择UART的时钟源,设置UART中断方式等等。
UFCONn寄存器,UFSTATn寄存器。UFCONn寄存器,用于设置是否使用FIFO,设置各FIFO的触发阈值,可以通过调协UFCONn寄存器来复位各个FIFO。读取UFSTAT n寄存器可以知道各个FIFO是否已满,其中有多少数据。如果不使用FIFO时,可以认为FIFO的深度为1,如果使用FIFO时,S3C2440的FIFO深度为64。
UMCONn寄存器,UMSTATn寄存器,用于流量控制。
UTRSTATn寄存器用来表明数据是否已经发送完毕,是否已经接收到数据。
USERSTATn寄存器,用于表示各种错误的发生。
UTXHn寄存器,CPU将数据写入到这个寄存器,UART即会将它保存到缓冲区中,并自动发送出去。
URXHn寄存器,当UART接收到数据时,CPU读取这个寄存器,即可获得数据。
4:uart实验
在PC机端,通过键盘输入字符串后,即可以在超级终端下看到输入的字符。
4.1:串口的初始化
void Uart_Init()
{
rGPHCON |= (0xa<<4);
rGPHUP = 0xffff;//将GPH2~3端口设置为串口功能,且允许上拉!
rUFCON0 = 0x0;//不使用FIFO
rUMCON0 = 0x0;//不适用流控制
rULCON0 = 0x3;//8个控制位,无校验位,1个停止位。
rUCON0 = 0x245;//工作于查询模式,设置uart的时钟源。
rUBRDIV0 = (int)(PCLK/16.0/baud + 0.5) - 1; //波特率设置为115200.
}
4.2:串口系统时钟的设置
void Pll_Init()
{
rLOCKTIME = 0xffffffff;
rUPLLCON = (U_MDIV<<12) + (U_PDIV<<4) + (U_SDIV);
delay(1000);
rMPLLCON = (M_MDIV<<12) + (M_PDIV<<4) + (M_SDIV);
delay(1000);
rCLKDIVN = CLKDIV;
rCLKCON |= (1<<10);
}
4.3:串口接收数据
unsigned char Get_Char()
{
while(!(rUTRSTAT0 & 0x01));//等待,直到接收缓冲区中有数据
return rURXH0;//读取rURXH0中数据.
}
4.4:串口发送数据
void Put_Char(unsigned char c)
{
while(!(rUTRSTAT0 & 0x04));//等待,直到发送缓冲区中数据为空
rUTXH0 = c;//想rUTXHO中写入数据,uart自动将它发送出去。
}
5:编译,下载测试。