⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 将s3c2410作为usb设备
💻 C
字号:
#include <stdarg.h>
#include "Def.h"
#include "smdk2410.h"
#include "Uart.h"

//推荐nPClock=50*1024*1024
void UartInit(U32 nPClock)
{
	GPHCON=vGPHCON;			//0x0016faaa	(GPH0-3)用于UART0
	GPHUP=vGPHUP;			//0x000007ff	
	
	UFCON0=0x0;				//FIFO禁用
	UMCON0=0x0;				//流量控制禁用
	ULCON0=0x3;				//8数据位,1停止位,无校验
	UCON0	=0x245;			//收发轮循 0010 0100 0101
	UBRDIV0=(int)(nPClock/(UART_BAUD_RATE * 16)) - 1;	//115200速率
}

void UartPutChar(char chVal)
{
	while((UTRSTAT0 & UTRSTAT_TX_EMPTY) == 0);
	UTXH0=chVal;
}

void UartPrint(const char *pszBuf)
{
	while(*pszBuf)
		UartPutChar(*pszBuf++);
}

void UartPutInt(unsigned int nVal)
{
	char pszBuf[12]={0};
	int i;
	for(i=10;i>0;i--)
	{
		pszBuf[i]=nVal%10+48;
		nVal=nVal/10;
		if(nVal==0)
			break;	
	}
	char *pszTemp=pszBuf;
	while(0==(*pszTemp))
		pszTemp++;
	UartPrint(pszTemp);
}

void UartPutPointer(unsigned int nVal)
{
	char pszBuf[11]={0};
	int i;
	for(i=9;i>=2;i--)
	{
		int iTemp=nVal%16;
		if(iTemp>9)
			pszBuf[i]=iTemp+87;
		else
            pszBuf[i]=iTemp+48;	
		nVal=nVal/16;
	}
	pszBuf[i--]='x';
	pszBuf[i]='0';
	char *pszTemp=pszBuf;
	while(0==(*pszTemp))
		pszTemp++;
	UartPrint(pszTemp);
}

void UartPutHex(unsigned int nVal)
{
	char pszBuf[9]={0};
	int i;
	for(i=7;i>=0;i--)
	{
		int iTemp=nVal%16;
		if(iTemp>9)
			pszBuf[i]=iTemp+87;
		else
            pszBuf[i]=iTemp+48;	
		nVal=nVal/16;
		if(nVal==0)
			break;
	}
	if(i%2!=0){
		i--;
		pszBuf[i]=48;
	}
	char *pszTemp=pszBuf;
	while(0==(*pszTemp))
		pszTemp++;
	UartPrint(pszTemp);
}

//只支持%c %d %u %x %X %s %p
void UartPrintf(const char *pszFmt,...)
{
	char chTemp;
	va_list vl;
	//
	va_start(vl, pszFmt);
	while(*pszFmt){
		if(pszFmt[0]=='%' && pszFmt[1]=='c'){
			chTemp=va_arg(vl,int);
			UartPutChar(chTemp);
			pszFmt+=2;
		}else if(pszFmt[0]=='%' && (pszFmt[1]=='d' || pszFmt[1]=='u')){
			UartPutInt(va_arg(vl,unsigned int));
			pszFmt+=2;
		}else if(pszFmt[0]=='%' && (pszFmt[1]=='x' || pszFmt[1]=='X') ){
			UartPutHex(va_arg(vl,unsigned int));
			pszFmt+=2;
		}else if(pszFmt[0]=='%' && pszFmt[1]=='s'){
			UartPrint(va_arg(vl,char *));
			pszFmt+=2;
		}else if(pszFmt[0]=='%' && pszFmt[1]=='p'){
			UartPutPointer(va_arg(vl,unsigned int));
			pszFmt+=2;
		}else{
			UartPutChar(*pszFmt);
			pszFmt++;
		}
	}
	va_end(vl);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -