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

📄 uart.c

📁 成功移植ucos2.85到s3c44b0的开发板
💻 C
字号:
#define ULCON0		(*(volatile unsigned *)0x1d00000)
#define ULCON1		(*(volatile unsigned *)0x1d04000)
#define UCON0		(*(volatile unsigned *)0x1d00004)
#define UCON1		(*(volatile unsigned *)0x1d04004)
#define UFCON0		(*(volatile unsigned *)0x1d00008)
#define UFCON1		(*(volatile unsigned *)0x1d04008)
#define UMCON0		(*(volatile unsigned *)0x1d0000c)
#define UMCON1		(*(volatile unsigned *)0x1d0400c)
#define UTRSTAT0	(*(volatile unsigned *)0x1d00010)
#define UTRSTAT1	(*(volatile unsigned *)0x1d04010)
#define UERSTAT0	(*(volatile unsigned *)0x1d00014)
#define UERSTAT1	(*(volatile unsigned *)0x1d04014)
#define UFSTAT0	    (*(volatile unsigned *)0x1d00018)
#define UFSTAT1	    (*(volatile unsigned *)0x1d04018)
#define UMSTAT0	    (*(volatile unsigned *)0x1d0001c)
#define UMSTAT1	    (*(volatile unsigned *)0x1d0401c)
#define UBRDIV0	    (*(volatile unsigned *)0x1d00028)
#define UBRDIV1  	(*(volatile unsigned *)0x1d04028)
#define UTXH0		(*(volatile unsigned char *)0x1d00020)
#define UTXH1		(*(volatile unsigned char *)0x1d04020)
#define URXH0		(*(volatile unsigned char *)0x1d00024)
#define URXH1		(*(volatile unsigned char *)0x1d04024)

#define PCONC		(*(volatile unsigned *)0x1d20010)
#define PCONE		(*(volatile unsigned *)0x1d20028)


#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#include "uart.h"

#define MCLK 60000000  


static char whichUart = 0;
/****************************************************************************
【功能说明】选择串口(0或1)
****************************************************************************/
void Uart_Select(char ch)
{
    whichUart=ch;
}

/****************************************************************************
【功能说明】串口初始化
****************************************************************************/
void Baud_Init(int baud)
{
    UFCON0=0x0;     //FIFO disable
    UFCON1=0x0;
    UMCON0=0x0;
    UMCON1=0x0;
	//UART0
    ULCON0=0x3;     //Normal,No parity,1 stop,8 bit
    UCON0=0x245;
    UBRDIV0=(MCLK/16/baud + 0.5)-1;
	//UART1
    ULCON1=0x3;
    UCON1=0x245;
    UBRDIV1=(MCLK/16/baud + 0.5)-1;
}


//串口初始化
void Uart_Init(char ch,int baud)
{
    PCONC|=0xf<<24;            //PC12~PC13:TXD1~RXD1
    PCONE=(PCONE&(~(0xf<<2)))|(0xa<<2);   //PE1~PE2: TXD0~RXD0
    Uart_Select(ch);
    Baud_Init(baud); 
}


/****************************************************************************
【功能说明】从串口接收一个字符
****************************************************************************/
char Uart_Getch(void)
{
    if(whichUart==0)
    {	    
		while(!(UTRSTAT0 & 0x1)); //Receive data read
		return URXH0;
    }
    else
    {
		while(!(UTRSTAT1 & 0x1)); //Receive data ready
		return	URXH1;
    }
}


/****************************************************************************
【功能说明】从串口获取一个字符串
****************************************************************************/
void Uart_GetString(char *string)
{
    char *string2=string;
    char c;
    while((c=Uart_Getch())!='\r')	//输入字符不等于回车
    {
		if(c=='\b')	 //输入字符等于退格
		{
		    if(	(int)string2 < (int)string )
		    {
				Uart_Printf("\b \b");
				string--;
		    }
		}
		else 
		{
		    *string++=c;
		    Uart_SendByte(c);
		}
    }
    *string='\0';			//内容为空
    Uart_SendByte('\n');	//换行
}

/****************************************************************************
【功能说明】从串口获取一个整型数
****************************************************************************/
int Uart_GetIntNum(void)
{
    char str[30];
    char *string=str;
    int base=10;
    int minus=0;
    int lastIndex;
    int result=0;
    int i;
    
    Uart_GetString(string);
    
    if(string[0]=='-')
    {
        minus=1;
        string++;
    }
    
    if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
    {
	base=16;
	string+=2;
    }
    
    lastIndex=strlen(string)-1;
    if( string[lastIndex]=='h' || string[lastIndex]=='H' )
    {
	base=16;
	string[lastIndex]=0;
	lastIndex--;
    }

    if(base==10)
    {
	result=atoi(string);
	result=minus ? (-1*result):result;
    }
    else
    {
	for(i=0;i<=lastIndex;i++)
	{
    	    if(isalpha(string[i]))
	    {
		if(isupper(string[i])) 
		    result=(result<<4)+string[i]-'A'+10;
		else
		    result=(result<<4)+string[i]-'a'+10;
	    }
	    else
	    {
		result=(result<<4)+string[i]-'0';
	    }
	}
	result=minus?(-1*result):result;
    }
    return result;
}

//***************************************************************************

/****************************************************************************
【功能说明】向串口发送一个字节的整型数
****************************************************************************/
void Uart_SendByte(char data)
{
    if(whichUart==0)
    {
		if(data=='\n')
		{
	    	while(!(UTRSTAT0 & 0x2));
	    	UTXH0='\r';
		}
		while(!(UTRSTAT0 & 0x2)); //Wait until THR is empty.
		UTXH0=data;
    }
    else
    {
		if(data=='\n')
		{
    	    while(!(UTRSTAT1 & 0x2));
	    	UTXH1='\r';
		}
		while(!(UTRSTAT1 & 0x2));  //Wait until THR is empty.
		UTXH1=data;
    }	
}		

/****************************************************************************
【功能说明】向串口送出一串字符
****************************************************************************/
void Uart_SendString(char *pt)
{
    while(*pt)
	Uart_SendByte(*pt++);
}

/****************************************************************************
【功能说明】以标准输出格式向串口输出各种信息
****************************************************************************/
//if you don't use vsprintf(), the code size is reduced very much.
#define MAX_TBUF	1000
static char tbuf[MAX_TBUF]= {0, };

void Uart_Printf(char *fmt,...)
{
    va_list v_list;
	char *ptr;
	int i= 0;


	va_start(v_list, fmt);     // Initialize variable arguments. 
	vsprintf(tbuf, fmt, v_list ); 
	va_end(v_list);


	ptr= tbuf;
	while( (*ptr) && i<MAX_TBUF) {
		Uart_SendByte(*ptr);
		ptr++;	i++;
	}
}

⌨️ 快捷键说明

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