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:串口实验(代码)
我用的是gt2440的板子所以地址等设置是根据gt2440的开发板设置的
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHUP (*(volatile unsigned long *)0x56000078)
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)
#define TXD0READY (1<<2)
#define PCLK 50000000 //初始时钟为50m
#define UART_CLK PCLK
#define UART_BAUD_RATE 115200 //波特率115200
#define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
void uart0_init(void) //初始化串口操作
{
GPHCON |= 0xa0;
GPHUP = 0x0c;
ULCON0 = 0x03;
UCON0 = 0x05;
UFCON0 = 0x00;
UMCON0 = 0x00;
UBRDIV0 = UART_BRD;
}
void putc(unsigned char c) //发送一个字符
{
while (!(UTRSTAT0 & TXD0READY));
UTXH0 = c;
}
void puts(char *str) //发送一个字符串
{
int i = 0;
while (str[i])
{
putc(str[i]);
i++;
}
}
unsigned char getc() //接收一个字符
{
while (!(UTRSTAT0 & 0x1));
return URXH0;
}
在跑这段代码之前必须将板子的时钟设置在50mzh之下,否则会出现乱码的