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

📄 printc.c

📁 lpc2468主机驱动
💻 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 "LPC24xx.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 中断处理
**
** parameters:			None
** Returned value:		None
**
*****************************************************************************/
void UART0Handler (void) __irq 
{
  BYTE IIRValue, LSRValue;
  BYTE Dummy = Dummy;

  IENABLE;					/* 处理中断嵌套 */	
  IIRValue = U0IIR;
    
  IIRValue >>= 1;			/* 跳过U0IIR寄存器的BIT0位-Pending bit */
  IIRValue &= 0x07;			/* 检查bit1~3,识别中断类型 */
  if ( IIRValue == IIR_RLS )		/* 接收数据线状态 */
  {
	LSRValue = U0LSR;
	/* 接收数据线状态 */
	if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
	{
	  /* 出现错误或者跳出中断 */
	  /* 读LSR将清除中断 */
	  UART0Status = LSRValue;
	  Dummy = U0RBR;		/* 变量Dummy读取RX,并且清除中断,然后跳出中断处理 */

	  IDISABLE;
	  VICVectAddr = 0;		/* Acknowledge Interrupt */
	  return;
	}
	if ( LSRValue & LSR_RDR )	/* 准备接收数据 */			
	{
	  *(UART0Buffer+UART0Count) = U0RBR;
	  UART0Count++;

	  if ( UART0Count == BUFSIZE )
	  {
		UART0Count = 0;		/* 缓冲区溢出 */
	  }	
	}
  }
  else if ( IIRValue == IIR_RDA )	/* 允许接收数据 */
  {
	/* Receive Data Available */
	//*(UART0Buffer+UART0Count) = U0RBR;

	UART0Count++;
        if(UART0Count > 0x80000)
        ;
	if ( UART0Count == BUFSIZE )
	{
	  UART0Count = 0;		/* 缓冲区溢出 */
	}
  }
 /* else */if ( IIRValue == IIR_CTI )	
  {
	/* 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;		/* 检查LSB的状态,以便了解U0THR中是否是合理的数据 */

	if ( LSRValue & LSR_THRE )
	{
	  UART0TxEmpty = 1;
	}
	else
	{
	  UART0TxEmpty = 0;
	}
  }
    
  IDISABLE;
  VICVectAddr = 0;		/* Acknowledge Interrupt */
}
/*****************************************************************************
** Function name:		UARTInit
**
** Descriptions:		初始化UART0,
** 					设置PINSEL,时钟,校验位,停止位,FIFO等
**
** parameters:			UART baudrate 波特率
** Returned value:		true or false, 如果中断处理不能被VIC表处理则返回错误
** 
*****************************************************************************/
DWORD UARTInit( DWORD baudrate )
{
    DWORD Fdiv;
 	
	PINSEL0 |= 0x00000050;
    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;		/* 使能并且复位TX和RX的FIFO */

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

    U0IER = IER_RBR | IER_RLS ;	/* 使能UART0的中断 */

	return (TRUE);
}


/*****************************************************************************
** Function name:		UARTSend
**
** Descriptions:		通过UART0根据数据长度送出一串数据
**
** parameters:			buffer pointer
** Returned value:		None
** 
*****************************************************************************/
void UARTSend(char *BufferPtr)
{  	    
	while(1)
	{
		if(*BufferPtr == '\0')	break;
		UARTSendByte(*BufferPtr++);
	}
}

/*****************************************************************************
** Function name:		UARTSendByte
**
** Descriptions:		通过UART输出一个BYTE的数据
** parameters:			data
** Returned value:		None
**
*****************************************************************************/
void UARTSendByte(BYTE Data)
{
	U0THR = Data;
	while((U0LSR &0x40) ==0);
}

/*****************************************************************************
** Function name:		putch
**
** Descriptions:		实现putch输出函数,打印出多个字符
** parameters:			data
** Returned value:		None
**
*****************************************************************************/
void putch(char data)
{
	UARTSend(&data);
}

/*****************************************************************************
** Function name:		puts
**
** Descriptions:		实现puts输出函数,打印出单个字符
** parameters:			*str
** Returned value:		None
**
*****************************************************************************/
void puts(char *str)
{	
	UARTSend(str);
}

/*****************************************************************************
** Function name:		printf
**
** Descriptions:		实现print功能函数
** parameters:			*fmt, ...
** Returned value:		None
**
*****************************************************************************/
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 + -