S3C2440 的通用异步收发器(UART)配有3个独立异步串行I/O(SIO)端口
每个 UART 包含一个波特率发生器、发送器、接收器和一个控制单元
UART 基本工作原理
内置波特率发生器,为串行数据的发送和接收提供时钟,根据这个时钟节拍,数据先写到FIFO中然后在拷贝到发送移位器中,在移位发送到引脚TxDn, 期间,发送过来的数据通过引脚RxDn进入移位器中然后拷贝到接收器的FIFO中
UART寄存器(详情见数据手册)
ULCONn(3个)
UCONn(3个)
UFCONn(3个)
UMCONn(2个)
UTRSTATn(3个)
UERSTATn(3个)
UFSTATn(3个)
UMSTATn(2个)
UTXHn(3个)
URXHn(3个)
UBRDIVn(3个)
存储在波特率分频寄存器中的值(UBRDIVn)是用于决定如下的串行Tx/Rx时钟率(波特率):
UBRDIVn = (int)( UART时钟 / ( 波特率 × 16) ) –1
( UART时钟:PCLK,FCLK/n 或UEXTCLK )
一个例子(启动代码自己添加)
#include "config.h"
#define PCLK 50000000
void Uart0_Init(unsigned int bandrate)
{
rGPHCON &=~((3<<4)|(3<<6));
rGPHCON |=(2<<4)|(2<<6); //GPH2--TXD[0];GPH3--RXD[0]
rGPHUP=0x00; //使能上拉功能
rULCON0 |=0x03; //8位数据,1位停止位
rUCON0 = 0x05;
rUBRDIV0= PCLK/bandrate/16-1;
rURXH0 =0; //清空UART0接收缓冲器
}
void Sendchar(unsigned char c)
{
rUTXH0=c; //写入UART0发送缓冲器
while(!(rUTRSTAT0 & (1<<2))); //等待字符发送完
}
unsigned char Getchar(void)
{
unsigned char c;
while(!(rUTRSTAT0 & (1<<0))); //等待接收字符
c=rURXH0; //接收缓冲器的字符
return c;
}
int Main()
{
unsigned char Z_char;
Uart0_Init(115200);
while(1)
{
Z_char=Getchar();
Sendchar(Z_char);
}
return 0;
}