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

📄 printc.c

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 C
字号:
/*****************************************************************************
 *   uart.c:  UART API file for NXP LPC23xx/24xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2006.07.12  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC2468.h"                        /* LPC23xx/24xx definitions */
#include "type.h"
#include "target.h"
#include "irq.h"

#include "stdarg.h"
#include "string.h"

#include "uart.h"

volatile DWORD UART0Status, UART1Status;
volatile BYTE UART0TxEmpty = 1, UART1TxEmpty = 1;
volatile BYTE UART0Buffer[BUFSIZE], UART1Buffer[BUFSIZE];
volatile DWORD UART0Count = 0, UART1Count = 0;

/*****************************************************************************
** Function name:		UART0Handler
**
** Descriptions:		UART0 interrupt handler
**
** parameters:			None
** Returned value:		None
**
*****************************************************************************/
__irq __arm void UART0Handler (void) 
{
  BYTE IIRValue, LSRValue;
  BYTE Dummy = Dummy;

  __enable_interrupt();				/* handles nested interrupt */	
  IIRValue = U0IIR;
    
  IIRValue >>= 1;			/* skip pending bit in IIR */
  IIRValue &= 0x07;			/* check bit 1~3, interrupt identification */
  if ( IIRValue == IIR_RLS )		/* Receive Line Status */
  {
	LSRValue = U0LSR;
	/* Receive Line Status */
	if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
	{
	  /* There are errors or break interrupt */
	  /* Read LSR will clear the interrupt */
	  UART0Status = LSRValue;
	  Dummy = U0RBR;		/* Dummy read on RX to clear 
							interrupt, then bail out */
	  __disable_interrupt();
	  VICVectAddr = 0;		/* Acknowledge Interrupt */
	  return;
	}
	if ( LSRValue & LSR_RDR )	/* Receive Data Ready */			
	{
	  /* If no error on RLS, normal ready, save into the data buffer. */
	  /* Note: read RBR will clear the interrupt */
	  *(UART0Buffer+UART0Count) = U0RBR;
	  UART0Count++;

	  if ( UART0Count == BUFSIZE )
	  {
		UART0Count = 0;		/* buffer overflow */
	  }	
	}
  }
  else if ( IIRValue == IIR_RDA )	/* Receive Data Available */
  {
	/* Receive Data Available */
	*(UART0Buffer+UART0Count) = U0RBR;

	UART0Count++;
    if(UART0Count > 0x80000)
        ;
	if ( UART0Count == BUFSIZE )
	{
	  UART0Count = 0;		/* buffer overflow */
	}
  }
 /* else */if ( IIRValue == IIR_CTI )	/* Character timeout indicator */
  {
	/* Character Time-out indicator */
	UART0Status |= 0x100;		/* Bit 9 as the CTI error */
  }
  else if ( IIRValue == IIR_THRE )	/* THRE, transmit holding register empty */
  {
	/* THRE interrupt */
	LSRValue = U0LSR;		/* Check status in the LSR to see if
							valid data in U0THR or not */
	if ( LSRValue & LSR_THRE )
	{
	  UART0TxEmpty = 1;
	}
	else
	{
	  UART0TxEmpty = 0;
	}
  }
    
  __disable_interrupt();
  VICVectAddr = 0;		/* Acknowledge Interrupt */
}
/*****************************************************************************
** Function name:		UARTInit
**
** Descriptions:		Initialize UART0 port, setup pin select,
**						clock, parity, stop bits, FIFO, etc.
**
** parameters:			UART baudrate
** Returned value:		true or false, return false only if the 
**						interrupt handler can't be installed to the 
**						VIC table
** 
*****************************************************************************/
DWORD UARTInit( DWORD baudrate )
{
    DWORD Fdiv;
    PINSEL0 |= 0x00000050;       /* RxD0 and TxD0 */

    U0LCR = 0x83;		/* 8 bits, no Parity, 1 Stop bit */
    Fdiv = ( Fpclk / 16 ) / baudrate ;	/*baud rate */
    U0DLM = Fdiv / 256;							
    U0DLL = Fdiv % 256;
	U0LCR = 0x03;		/* DLAB = 0 */
    U0FCR = 0x07;		/* Enable and reset TX and RX FIFO. */

	if ( install_irq( UART0_INT, (void *)UART0Handler, HIGHEST_PRIORITY ) == FALSE )
	{
		return (FALSE);
	}

    U0IER = IER_RBR | IER_RLS ;	/*  Enable UART0 interrupt */

	return (TRUE);
}


/*****************************************************************************
** Function name:		UARTSend
**
** Descriptions:		Send a block of data to the UART 0 port based
**				on the data length
**
** parameters:			buffer pointer, and data length
** Returned value:		None
** 
*****************************************************************************/
void UARTSend(char *BufferPtr)
{  	    
	while(1)
	{
		if(*BufferPtr == '\0')	break;
		UARTSendByte(*BufferPtr++);
	}
}

void UARTSendByte(BYTE Data)
{
	U0THR = Data;
	while((U0LSR &0x40) ==0);
}

void putch(char data)
{
	UARTSend(&data);
}

void puts(char *str)
{	
	UARTSend(str);
}

int vsprintf(char * /*s*/, const char * /*format*/, va_list /*arg*/);
	
void printf(char *fmt, ...)
{
	va_list ap;
	char string[256];	 
	
	va_start(ap, fmt);
	vsprintf(string, fmt, ap);
	
	UARTSend(string);
	va_end(ap);
}

/*****************************************************************************
** Function name:		UART0Recv
**
** Descriptions:		从UART0接收一个字节数据
** parameters:			buffer pointer, and data length
** Returned value:		None
**
*****************************************************************************/
void UART0RecvByte(BYTE *BufferPtr)
{
    while((U0LSR & 0x01) == 0);         /* 等待接收数据到达RBR */
    *BufferPtr = U0RBR;

    return;
}
/*****************************************************************************
** Function name:		UART0_gets
**
** Descriptions:		查询方式从UART0接收数据
** parameters:			buffer pointer
** Returned value:		None
**
*****************************************************************************/
void UART0_gets(BYTE *BufferPtr)
{
    while( 1 )
    {							   	
      UART0RecvByte(BufferPtr);
      if(*BufferPtr == '\0')break;      // 接收到的数据是否为结束符

      BufferPtr ++;             // 未做边界检查,可能会有危险
    }

    return;
}
/******************************************************************************
**                            End Of File
******************************************************************************/


⌨️ 快捷键说明

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