从我们的uart的TX端发送一个字符串“hello world”给我们PC上的minicom.
***************************************************************************************
test.c文件如下:
#include "uart.h"
void my_memcopy(char *soc,char *dir);
char *my_memset(char *s,int c,unsigned int n);
int (*printf)(char *,...) = (void *)0x57e11d4c;
int main()
{
int i = 0;
char buf[15];
char *pbuf=(char *)my_memset((void *)buf,0,15);
my_memcopy("hello world\n",pbuf);
//下面是对uart中寄存器的配置如下:
ULCON0 = 3;
UCON0 = 1|(1<<2)|(2<<10);
/*
DIV_VAL = (PCLK / (bps x 16 ) ) −1
=(66M/(115200*16))-1
=34.8
x/16 = 0.8
x = 16*0.8
x = 12.8 ~ 13
*/
UBRDIV0 = 34;
UDIVSLOT0 =0xDFDD;
while(1){
/*while(1)
{
if(UTRSTAT0&(1<<1))
break;
}
if(*(buf+i)=='\n')
UTXH0 = '\r';//遇到一个\n就会换行,而且在下一行,还会空两格(minicom中的显示就是这样的),这个\r是回到行首。
*/
while(1){
if(UTRSTAT0&(1<<1))//判断Tx(发送缓存)是否为空,为空了,我们就可以发送数据了。
break;
}
if(*(buf+i) == 0)
break;
else{
UTXH0 = *(buf+i); //这里是一个字节,一个字节的发送数据。
i += 1;
}
}
return 0;
}
void my_memcopy(char *soc,char *dir)
{
while(*soc)
{
*dir++ = *soc++;
}
}
char *my_memset(char *s,int c,unsigned int n){
unsigned int i=0;
while(i <= n)
{
*(s+i) = c;
i++;
}
return s;
}
**********************************************************************************
uart.h文件如下:
//interrupt
#define VIC0INTENABLE (*(volatile unsigned long *)0x71200010)
#define VIC0INTSELECT (*(volatile unsigned long *)0x7120000C)
#define VICxIRQSTATUS (*(volatile unsigned long *)0x71200000)
#define VICxRAWINTR (*(volatile unsigned long *)0x71200008)
//模拟watdong
#define VIC0SOFTINT (*(volatile unsigned long *)0x71200018)
#define VIC0SOFTINTCLAR (*(volatile unsigned long *)0x7120001C)
//watdog
#define WTCON (*(volatile unsigned long *)0x7E004000)
#define WTDAT (*(volatile unsigned long *)0x7E004004)
#define WTCNT (*(volatile unsigned long *)0x7E004008)
#define WTCLRINT (*(volatile unsigned long *)0x7E00400C)
//led
#define GPMCON (*(volatile unsigned long *)0x7F008820)
#define GPMDAT (*(volatile unsigned long *)0x7F008824)
//key
#define GPNCON (*(volatile unsigned long *)0x7F008830)
#define GPNDAT (*(volatile unsigned long *)0x7F008834)
//ex_interrupt
#define EINT0CON0 (*(volatile unsigned long *)0x7F008900)
#define EINT0CON1 (*(volatile unsigned long *)0x7F008904)
#define EINT0MASK (*(volatile unsigned long *)0x7F008920)
#define EINT0PEND (*(volatile unsigned long *)0x7F008924)
//clock
#define APLLLOCK (*(volatile unsigned long *)0x7E00F000)
#define MPLLLOCK (*(volatile unsigned long *)0x7E00F004)
#define EPLLLOCK (*(volatile unsigned long *)0x7E00F008)
#define APLLCON (*(volatile unsigned long *)0x7E00F00C)
#define MPLLCON (*(volatile unsigned long *)0x7E00F010)
#define EPLLCON0 (*(volatile unsigned long *)0x7E00F014)
#define EPLLCON1 (*(volatile unsigned long *)0x7E00F018)
#define CLKSRC (*(volatile unsigned long *)0x7E00F01C )
#define CLKDIV0 (*(volatile unsigned long *)0x7E00F020 )
#define CLKDIV1 (*(volatile unsigned long *)0x7E00F024 )
#define CLKDIV2 (*(volatile unsigned long *)0x7E00F028 )
#define CLKOUT (*(volatile unsigned long *)0x7E00F02C )
#define HCLKGATE (*(volatile unsigned long *)0x7E00F030 )
#define PCLKGATE (*(volatile unsigned long *)0x7E00F034 )
#define SCLKGATE (*(volatile unsigned long *)0x7E00F038 )
#define MEM0CLK_GATE (*(volatile unsigned long *)0x7E00F03C)
#define MISCCON (*(volatile unsigned long*)0x7E00F839)
//UART
#define ULCON0 (*(volatile unsigned long *)0x7F005000)
#define UCON0 (*(volatile unsigned long *)0x7F005004)
#define UFCON0 (*(volatile unsigned long *)0x7F005008)
#define UMCON0 (*(volatile unsigned long *)0x7F00500C)
#define UTRSTAT0 (*(volatile unsigned long *) 0x7F005010)
#define UERSTAT0 (*(volatile unsigned long *) 0x7F005014)
#define UFSTAT0 (*(volatile unsigned long *)0x7F005018)
#define UMSTAT0 (*(volatile unsigned long *)0x7F00501C)
#define UTXH0 (*(volatile unsigned long *)0x7F005020)
#define URXH0 (*(volatile unsigned long *)0x7F005024)
#define UBRDIV0 (*(volatile unsigned long *)0x7F005028)
#define UDIVSLOT0 (*(volatile unsigned long *)0x7F00502C)
#define UINTP0 (*(volatile unsigned long *)0x7F005030)
#define UINTSP0 (*(volatile unsigned long *)0x7F005034)
#define UINTM0 (*(volatile unsigned long *)0x7F005038)
*******************************************************************************
makefile文件如下:
all:
arm-none-linux-gnueabi-gcc -c test.c -o test.o
arm-none-linux-gnueabi-ld -Ttext=0x50000000 test.o -o test
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary test test.bin
cp test.bin /tftpboot/
clean:
rm -rf *.o *.bin test vector /tftpboot/*.bin