一、开发环境
(1)硬件平台:FS2410
(2)主机:Ubuntu 10.10
二、FS2410串口的原理图
三、串口UART寄存器配置
(1)配置TXD0与RXD0(GPH2、GPH3)
(2)设置波特率(UBRDIVn)
(3)设置传输格式(ULCONn)
(4)选择时钟源与中断方式(UCONn)
(5)设置FIFO和流控(UFCONn 、UMCONn)
(6)接收字符和发送字符(UTRSTATn)
四、详细设计
uart.c:
#include "s3c2410.h"
void putc(char ch) //发送字符
{
while(!(UTRSTAT0 & 0x2) ); //判断发送缓冲区是否为空
UTXH0 = ch; //发送字符
}
char getc(void) //接收字符
{
while(!(UTRSTAT0 & 0x1)); //判断接收缓冲区是否为空
return URXH0; //返回接收的字符
}
void putstr(char *str) //发送字符串
{
while(*str != '\0')
{
if(*str == '\n')
{
putc('\n');
putc('\r');
}
else
putc(*str);
str++;
}
}
int main(void)
{
char ch;
char str[100];
int i = 0, j;
for(j = 0; j < 100; j++) //清空字符串
str[j] = '\0';
GPHCON = GPHCON & ~(0xf << 4) | (0xa << 4); //配置RXD0、TXD0
GPHUP = 0x0c; //设置上拉电阻
UFCON0 = 0; //不用FIFO
UMCON0 = 0; //不用流控
ULCON0 = 0x3; //8位数据,1个停止位,无校验,正常模式
UCON0 = 0x5; //时钟源位PCLK, 中断方式为查询
UBRDIV0 = ((int)(50000000 / 115200 / 16) - 1); //设置波特率为115200
putc('\r');
putstr("hello fs2410\n");
while(1)
{
ch = getc(); //接收字符
putc(ch); //发送字符
str[i++] = ch;
if(ch == '\r')
{
i = 0;
putc('\n');
putstr("fs2410:");
putstr(str);
putstr("\n");
for(j = 0; j < 100; j++) //清空字符串
str[j] = '\0';
}
}
return 0;
}
start.S:
.text
.global _start
_start:
#define WATCHDOG 0x53000000
ldr r0, =WATCHDOG
mov r1, #0
str r1, [r0]
ldr sp, =1024*4
bl main
loop:
b loop
Makefile:
uart.bin: start.S uart.c
arm-none-linux-gnueabi-gcc -c start.S -o start.o
arm-none-linux-gnueabi-gcc -c uart.c -o uart.o
arm-none-linux-gnueabi-ld -Ttext 0x30008000 start.o uart.o -o uart
arm-none-linux-gnueabi-objcopy -O binary -S uart uart.bin
clean:
rm -f *.o uart.bin
在开发板的uboot上输入以下命令:
tftp 30008000 uart.bin
go 30008000