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

📄 uart.c

📁 ucos在sc2410上的移植代码应该是可以在目标板上运行
💻 C
字号:
//****************************************************************************************
//** 文件名:Uart.c

//** Copyright (c) 2002 Hard&SoftMcuStudio

//** 创建人:Hard&SoftMcuStudio

//** 日期:2002.06.27

//** 描述:Uart drivers
//**
//** 版本:1.0
//**************************************************************************************
#include "uart.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

INT32U ulRx0Index = 0;
INT32U ulRx1Index = 0;
INT8U aucRx0Buf[RX_BUFFER_SIZE];
INT8U aucRx1Buf[RX_BUFFER_SIZE];

/************************* UART ****************************/
void __irq Uart0_RxInt(void)
{
	rI_ISPC=BIT_URXD0 ;   //clear pending bits,Default value=0x0000000
	//aucRx0Buf[ulRx0Index] = RdURXH0();
	//Uart0_SendByte(aucRx0Buf[ulRx0Index]);
	//ulRx0Index = (ulRx0Index + 1) % RX_BUFFER_SIZE;
	//added by chenfurong in 030321
	Uart0_ReceiveHook(RdURXH0());
}

void __irq Uart1_RxInt(void)
{
	rI_ISPC=BIT_URXD1 ;   //clear pending bits,Default value=0x0000000
	//aucRx1Buf[ulRx1Index] = RdURXH1();
	//Uart1_SendByte(aucRx1Buf[ulRx1Index]);
	//ulRx1Index = (ulRx1Index + 1) % RX_BUFFER_SIZE;
	Uart1_ReceiveHook(RdURXH1());
}

//--------------------------------------------------------------//
//                  Init and Enable Uart0 & Uart1                                               //
//-------------------------------------------------------------//
//*****************************************************************
//** 函数名:void Uart_init(void)
//** 输 入: Null
//** 输 出: Null
//** 功能描述:设置两个串口的波特率
//** 全局变量:Null
//*****************************************************************
void Uart_Init(void)
{
	Uart0_Init(Uart0BaudRate);	//set UART0 default baudrate as 57600bps for GSM
	Uart1_Init(Uart1BaudRate);	//set UART1 default baudrate as 9600bps for GPS
}
//*****************************************************************
//** 函数名:void Uart0_init(INT32 ulBandRate)
//** 输 入: INT32 ulBandRate:需设置的波特率
//** 输 出: Null
//** 功能描述:初始化Uart0
//** 全局变量:Null
//*****************************************************************
void Uart0_Init(INT32 baud)
{
	INT32 i;
	//should disable Globe Interrupt here?
	rUFCON0=0x0;		//Disable FIFO
	rUMCON0=0x0;		//Disable AFC
	rULCON0=0x3;		//Normal,No parity,1 stop,8 bit
	rUCON0=0x245;		//rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
	rUBRDIV0=( (int)(MCLK/16./baud + 0.5) -1 );//32;//
	for(i=0;i<100;i++);
}
void Uart0_TxEmpty(void)
{
 	while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
 }
//*****************************************************************
//** 函数名:void Uart0_SendByte(INT8U ucUart_Ch,INT8U ucData)
//** 输 入:
//**       INT8U ucData:需要输出的数据.
//** 输 出: Null
//** 功能描述:由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart0_SendByte(INT8U data)
{
    while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
    WrUTXH0(data);
}
//*****************************************************************
//** 函数名:void Uart0_SendString(INT8U ucUart_Ch,INT8U * pucData)
//** 输 入:
//**       INT8U *pucData:需要输出的字符串.
//** 输 出: Null
//** 功能描述:由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************

void Uart0_SendString(INT8 *pcTemp)
{
	while(*pcTemp)
		Uart0_SendByte(*pcTemp++);
}
//*****************************************************************
//** 函数名:void Uart0_Printf(INT8U ucUart_Ch,INT8U * pucFMT,…)
//** 输 入:
//**       INT8U *pucFMT:需要输出的带格式的字符串.
//** 输 出: Null
//** 功能描述:按指定的格式由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************
//if you don't use vsprintf(), the code size is reduced very much.
void Uart0_Printf(INT8 * pcString,...)
{
    va_list ap;
    char ucString[256];

    va_start(ap,pcString);
    vsprintf(ucString,pcString,ap);
    Uart0_SendString(ucString);
    va_end(ap);
}

//*****************************************************************
//** 函数名:void Uart1_init(INT32 ulBandRate)
//** 输 入: INT32 ulBandRate:需设置的波特率
//** 输 出: Null
//** 功能描述:初始化Uart1
//** 全局变量:Null
//*****************************************************************
void Uart1_Init(INT32 baud)
{
	INT32 i;
	rUFCON1=0x0;
	rUMCON1=0x0;
	rULCON1=0x2b;
	rUCON1=0x245;
	rUBRDIV1=( (int)(MCLK/16./baud + 0.5) -1 );
	for(i=0;i<100;i++);
}

void Uart1_TxEmpty(void)
{
	while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
//*****************************************************************
//** 函数名:void Uart1_SendByte(INT8U ucUart_Ch,INT8U ucData)
//** 输 入:
//**       INT8U ucData:需要输出的数据.
//** 输 出: Null
//** 功能描述:由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart1_SendByte(INT8U data)
{
    while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
    rUTXH1=data;
}
//*****************************************************************
//** 函数名:void Uart1_SendString(INT8U ucUart_Ch,INT8U * pucData)
//** 输 入:
//**       INT8U *pucData:需要输出的字符串.
//** 输 出: Null
//** 功能描述:由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart1_SendString(INT8 *pcTemp)
{
	while(*pcTemp)
		Uart1_SendByte(*pcTemp++);
}
//*****************************************************************
//** 函数名:void Uart1_Printf(INT8U ucUart_Ch,INT8U * pucFMT,…)
//** 输 入:
//**       INT8U *pucFMT:需要输出的带格式的字符串.
//** 输 出: Null
//** 功能描述:按指定的格式由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
//if you don't use vsprintf(), the code size is reduced very much.
void Uart1_Printf(INT8 * pcString,...)
{
	
    va_list ap;
    char ucString[256];

    va_start(ap,pcString);
    vsprintf(ucString,pcString,ap);
    Uart1_SendString(ucString);
    va_end(ap);
}

INT8U Uart0_RecvLastByte(void)
{
       if( ulRx0Index == 0 )
       {
       	return aucRx0Buf[RX_BUFFER_SIZE-1];
       }
       else
       {
		return aucRx0Buf[ulRx0Index-1];
       }
}

INT8U Uart1_RecvLastByte(void)
{
       if(ulRx1Index==0)
       {
       	return aucRx1Buf[RX_BUFFER_SIZE-1];
       }
       else
       {
		return aucRx1Buf[ulRx1Index-1];
       }
}

⌨️ 快捷键说明

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