S3C2440之UART0

#include "stdarg.h"
#include "2440addr.h"
#include "uart.h"

static int lenth = 0;
void uart_init(void)
{
	unsigned int temp;
	temp = rGPHCON;
	temp &=~((3<<4)|(3<<6));
	temp |=(2<<4)|(2<<6);
	rGPHCON = temp;
	
	temp = rGPHUP;
	temp |= 0x7ff;
	rGPHUP = temp;

	rULCON0 = 0x3;
	rUCON0 = 0x5; 
	rUFCON0 = 0;                    
	rUMCON0 = 0;      	      
	rUBRDIV0 = 26; //波特率115200 
<span style="font-family: Arial, Helvetica, sans-serif;">//配置串口中断</span>
rSRCPND |= (0x1<<28);
rINTMOD &= ~(0x1<<28);
rINTMSK &= ~(0x1<<28);
rINTPND |= (0x1<<28);
rSUBSRCPND |= 0x1;
rINTSUBMSK &= ~(0x1);
pISR_UART0 = (U32)UART0_IRQ;</span>
}
//串口中断函数
void __irq UART0_IRQ(void)// 要先声明
{
rSUBSRCPND |= 0x1;
rSRCPND |= (0x1<<28);
rINTPND |= (0x1<<28);

play = uart_getchar();
uart_printf("%c",play);
}
/*
输出字符串
使用方法:
	uart_printf("aa %s","aaa"); //输出:aa aaa
	uart_printf("asd %d",39);//输出:asd 39 
裸机不能输入%f
*/
//extern int vsprintf();

void uart_printf(char *fmt, ...)
{
	va_list argptr;//初始化指向可变参数列表的指针
	unsigned char buffer[80];
	va_start(argptr, fmt);//将第一个可变参数的地址付给ap,即ap指向可变参数列表的开始
	vsprintf(buffer,fmt,argptr);//将参数fmt、ap指向的可变参数一起转换成格式
	uart_puts(buffer);//输出字符串
	va_end(argptr);//ap付值为0,没什么实际用处,主要是为程序健壮性
}

/*
接收字符串

*/
unsigned char * uart_gets(unsigned char * str,int len)
{
	int i = 0;
	while(i<len-1)
	{
		str[i] = uart_getchar();
		uart_putchar(str[i]);	
		if(str[i] == '\n')
		{		
			break;
		}
		i = lenth;	
	}
	str[i] = 0;
	return str;
}

/*
输出字符串

*/
void uart_puts(unsigned char *ptr)
{
	while(*ptr != '\0')
	{	
		uart_putchar(*ptr++);
	}
	//uart_putchar('\r');
	uart_putchar('\n');
		
}
/****************
输出一个字符
可删除
****************/
void uart_putchar(unsigned char c)
{
	if(c == '\n')
	{
		c = '\r';
		while(!(rUTRSTAT0&0x2));  //等待并判断发送缓存是否为空
		rUTXH0 = c;
		lenth = 0;
	}
	else if(c == '\b')
	{
		if(lenth > 0)
		{
			while(!(rUTRSTAT0&0x2));  //等待并判断发送缓存是否为空
			rUTXH0 = c;
			while(!(rUTRSTAT0&0x2));  //等待并判断发送缓存是否为空
			rUTXH0 = ' ';
			while(!(rUTRSTAT0&0x2));  //等待并判断发送缓存是否为空
			rUTXH0 = c;
			lenth--;
		}
	}	
	else
	{
		while(!(rUTRSTAT0&0x2));  //等待并判断发送缓存是否为空
		rUTXH0 = c;
	}
	
}
/******************
从键盘接收一个字符
******************/
unsigned char uart_getchar(void)
{
	unsigned char ch;
	while(!(rUTRSTAT0 & 0x1)); //等待并判断接收缓存是否准备好
	ch = rURXH0; 
	if(ch == '\r')
	{
		ch = '\n';
	}
	if(ch != '\b')
		lenth++;
	return ch;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值