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

📄 uart.c

📁 ucos在NEC平台下的移植
💻 C
字号:
//-----------------------------------------------------------------------------
//
//	file:			uart.c
//	description:	demonstration program, USB-UART
//	Version:
//
//-------------------------------------------------------------------------------
#pragma SFR
#pragma NOP
#pragma DI
#pragma EI

#pragma interrupt INTST6	UART_TxInt
#pragma interrupt INTSR6	UART_RxInt

///////////////////////////////////////////////////////////////////////////////
//	Include
#include	"../include/config.h"
#include	<mac_headers.h>
#include	"../include/780547.h"
#include	"../include/mac_def.h"

///////////////////////////////////////////////////////////////////////////////
//	variables
static	BYTE	g_TxBuffer[COMM_BUFFER_SIZE];		// tx buffer
static	BYTE	g_TxCount = 0;						// tx bytes
static	BYTE	*g_TxPtr;							// tx pointer

		BYTE	g_RxBuffer[COMM_BUFFER_SIZE];		// rx buffer
		BYTE	g_RxCount = 0;						// rx bytes
		BOOL	g_RxLine = FALSE;					// line receive
static	BYTE	*g_RxPtr;							// rx pointer

//-------------------------------------------------------------------
// baudrate 
static char const g_baudrate_setting[MAX_BAUD_RATES][2] = {
	// Main system clock is 16MHz
	{CKSEL_9600, BRGC_9600},	// 9600	n=4
	{CKSEL_19200, BRGC_19200},	//19200	n=3
	{CKSEL_38400, BRGC_38400},	//38400	n=2
};

//-------------------------------------------------------------------
//	UART baudrate
void UART_SetSpeed(		// __fn__
	unsigned short	speed
)
{
	char			index;
	unsigned char	psw_flag;

	switch(speed) {
	case BPS_9600:
		index = 0;
		break;

	case BPS_19200:
		index = 1;
		break;

	default:
		index = 2;
		break;
	}

	UART_MODE	= (ASIM_POWER | ASIM_CL);	// clock start, rx/tx disable
	NOP();									// Wait for safe, before POWER down
	UART_MODE	= (ASIM_CL | ASIM_ISRM);	// Stop clock

	UART_MODE	= (ASIM_POWER | ASIM_CL | ASIM_ISRM);	// clock restart
	UART_CLOCK	= g_baudrate_setting[index][0];			// set the baudrate
	UART_BRGC	= g_baudrate_setting[index][1];
	UART_MODE	= (ASIM_POWER | ASIM_TXE | ASIM_RXE | ASIM_CL | ASIM_ISRM);	// tx/rx restart
}

//-------------------------------------------------------------------
//	UART tx interrupt
__interrupt void UART_TxInt()	// __fn__
{
	DI();

	// transmit all data ?
	if (g_TxCount == 0)	{
		EI();
		return;
	}

	// write tx data
	do {
		UART_TX = *g_TxPtr++;
		g_TxCount--;
	} while( !(UART_TX_STATUS & ASIF_TXBF) && g_TxCount>0);

	EI();
}

//-------------------------------------------------------------------
//	UART rx interrupt
__interrupt void UART_RxInt()	// __fn__
{
	volatile unsigned char	b;

	b = UART_RX_STATUS;
	// check error.
	if (b & (ASIS_PE | ASIS_FE | ASIS_OVE)) {
		b = UART_RX;		// dummy read for clear errors.
		return;
	}

	// store receive data into buffer.
	b = UART_RX;
	if (g_RxCount < COMM_BUFFER_SIZE) {
		*g_RxPtr++ = b;
		g_RxCount++;
	}

	// [line feed] notice end of command line.
	if (b == CODE_LF) {
		// mask rx interrupt
		UART_RX_INT_MASK = TRUE;
		g_RxLine = TRUE;
	}
}


//-------------------------------------------------------------------
//	first UART transmit
int UART_write(				// __fn__
	BYTE	*buffer,
	BYTE	len
)
{
	// to keep tx data, copy it into tx buffer.
	if (len > COMM_BUFFER_SIZE)	len = COMM_BUFFER_SIZE;
	memcpy(g_TxBuffer, buffer, len);
	g_TxCount	= len;
	g_TxPtr	 	= g_TxBuffer;

	// write tx data
	do {
		UART_TX = *g_TxPtr++;
		g_TxCount--;
	} while( !(UART_TX_STATUS & ASIF_TXBF) && g_TxCount>0);
	return	1;
}


//-------------------------------------------------------------------
//	start UART transmit
int	UART_StartTx(		// __fn__
	char		*buffer
)
{
	int				status;
	BYTE			len;
	
	// wait until last tx end.
	while(g_TxCount > 0) {
		NOP();
		NOP();
	}

	DI();

	len = (BYTE) strlen((char *)buffer);

	// after this routine, tx empty interrupt routine transmits rest of tx data.
	status = UART_write((BYTE *)buffer, len);

	EI();

	return	status;
}

//-------------------------------------------------------------------
//	Start UART receive.
int	UART_StartRx()		// __fn__
{
	// initialize rx buffer.
	g_RxCount	= 0;
	g_RxPtr		= &g_RxBuffer[0];
	g_RxLine	= FALSE;

	// enable rx interrupt.
	UART_RX_INT_MASK = FALSE;

	return	1;
}

⌨️ 快捷键说明

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