从上图可知,要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART,UART里面的移位器依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。
接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。
第002节_S3C2440_UART编程
在文件uart.c里需要编写这几个函数:
uart0_init() : 用于初始化串口
putchar() : 用于发送一个字符
getchar() : 用于接收一个字符
puts() : 用于发送一串字符
在uart0_init()的功能如下:
· 1. 设置引脚用于串口:根据原理图和参考手册设置GPH2,3用于TxD0, RxD0,并且为了将其保持为高电平,先设置其为上拉:
GPHCON & = ~((3<<4) | (3<<6));
GPHCON | = ((2<<4) | (2<<6));
GPHUP & = ~((1<<2) | (1<<3)); /* 使能内部上拉 */
· 2. 设置波特率
UCON0 = 0x00000005; //将uart时钟设置为PCLK, 中断/查询模式:
uart clock=50M,波特率假设是115200,
根据公式
UBRDIVn = (int)(UARTclock / ( buad rate x 16) ) –1
得到
UBRDIVn = (int)(50000000/ ( 115200 x 16) ) –1 = 26
UBRDIV0 = 26;
· 3. 设置数据格式
数据格式设置为常用的8n1: 8个数据位, 无较验位, 1个停止位
ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
读取UTRSTAT0寄存器,查询其第2位判断发送buff是否为空,即上一次发送是否完成,如果完成即向UTXH0写入要发送的新数据;查询其第0位判断接收buff是否为空,即本次接收是否完成,如果接收完成,读取URXH0的值。
int putchar(int c)
{
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int getchar(void)
{
while (!(UTRSTAT0 & (1<<0)));
return URXH0;
}
循环输出字符,就可以实现字符串的输出:
int puts(constchar*s)
{
while (*s)
{
putchar(*s);
s++;
}
}
在main.c主函数里,先调用初始化函数uart0_init(),然后循环获取用于输入的数据,然后回显出来。并且在收到`
`回车时,输出`
`换行,有些时候`
`表示回车,则输出`
`换行。
main.c代码如下:
#include "s3c2440_soc.h"
#include "uart.h"
int main(void)
{
unsigned char c;
uart0_init();
puts("Hello, world!
");
while(1)
{
c = getchar();
if (c =='
')
{
putchar('
');
}
if (c =='
')
{
putchar('
');
}
putchar(c);
}
return0;
}
//
`