开发环境
(1)硬件平台:FS2410
(2)主机:Ubuntu 12.04
FS2410串口的原理图
串口UART寄存器配置
配置TXD0与RXD0(GPH2、GPH3)
设置波特率(UBRDIVn)
设置传输格式(ULCONn)
选择时钟源与中断方式(UCONn)
设置FIFO(UFCONn)
设置流控(UMCONn)
接收字符和发送字符(UTRSTATn)
源代码
//uart.c
#include "2410addr.h"void putc(char ch) //发送字符
{while(!(rUTRSTAT0 & 0x2) ); //判断发送缓冲区是否为空 rUTXH0 = ch; //发送字符}char getc(void) //接收字符
{while(!(rUTRSTAT0 & 0x1)); //判断接收缓冲区是否为空return rURXH0; //返回接收的字符
}void putstr(char *str) //发送字符串
{while(*str != '\0'){if(*str == '\n'){putc('\n');putc('\r');}elseputc(*str);str++;}
}int main(void)
{char ch;char str[100];int i &#61; 0, j;for(j &#61; 0; j <100; j&#43;&#43;) //清空字符串str[j] &#61; &#39;\0&#39;;rGPHCON &#61; rGPHCON & ~(0xf <<4) | (0xa <<4); //配置RXD0、TXD0rGPHUP &#61; 0x0c; //设置上拉电阻rUFCON0 &#61; 0; //不用FIFOrUMCON0 &#61; 0; //不用流控rULCON0 &#61; 0x3; //8位数据&#xff0c;1个停止位&#xff0c;无校验&#xff0c;正常模式rUCON0 &#61; 0x5; //时钟源位PCLK&#xff0c; 中断方式为查询rUBRDIV0 &#61; ((int)(50000000 / 115200 / 16) - 1); //设置波特率为115200putc(&#39;\r&#39;);putstr("hello mystery \n");while(1){ch &#61; getc(); //接收字符putc(ch); //发送字符str[i&#43;&#43;] &#61; ch;if(ch &#61;&#61; &#39;\r&#39;){i &#61; 0;putc(&#39;\n&#39;);putstr("mystery:");putstr(str);putstr("\n");for(j &#61; 0; j <100; j&#43;&#43;) //清空字符串str[j] &#61; &#39;\0&#39;;}}return 0;
}
//start.S
.text
.global _start
_start:
#define WATCHDOG 0x53000000ldr r0, &#61;WATCHDOGmov r1, #0str r1, [r0]ldr sp, &#61;1024*4bl mainloop:b loop
//Makefile
uart.bin: start.S uart.carm-linux-gcc -c start.S -o start.oarm-linux-gcc -c uart.c -o uart.oarm-linux-ld -Ttext 0x30008000 start.o uart.o -o uartarm-linux-objcopy -O binary -S uart uart.binclean:rm -f *.o uart.binxyyc
编译运行
编译运行都OK