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

📄 lpc_uart.c

📁 philips mcb2100平台
💻 C
字号:
/***************************************************************************
;    Copyright (c) 2004, BU MMS China, Philps Semiconductor                     
;    All rights reserved.                                                             
;     
;    file name : LPC_UART.C
;    description: UART driver 
;
;    History     :                                                                     
;    1. Date: Jul. 20, 2004                                              
;        Author: Sherly Zhu                                                   
;        Description: Create the basic function    
;
;    2. Date :Aug. 12,2004
;        Author: Sherly Zhu                                                    
;        Description: Modify the some functions   
;
;    3. Date: Sep.2, 2004
;        Author: Sherly Zhu                                                    
;        Description: Modify the functions   
;
; **************************************************************************/

#include "LPC_UART.h"
#include "LPC_VIC.h"
#include "COMMRTOS.h"

/*************************************************************************
; Function : Uart_Init
; Parameters: LPC_INT8U  --port number
;                   LPC_UART_config_t  --configuration information
; Return: int
; Description: Initialize Uart port according to port number and configuation information.
;                   if no error ,return zero; else return non-zero.
; *************************************************************************/
int  Uart_Init(LPC_INT8U PortNum, LPC_UART_config_t *Config)
{   
LPC_INT32U Divisor, Frame, FIFO;
VIC_Interrupt_t intr;	
LPC_INT8U err=0;	

  if(PortNum>LPC_MAX_NUMB)                //error check
    return 1;

  if ((Config->BaudRate == 0) )           //error check    
    return 1;
  if ((Config->BaudRate > MaxBaudRate))   //error check
    return 1;

  // baut rate calculation: Divisor = pclk / (16*bautrate)
  Divisor = (FPCLK>>4) ;
  Divisor=Divisor/(Config->BaudRate);  

  // frame format
  Frame = Config->WordLenth;
  if ( Config->Stopbit )
    Frame |= ( 1<<LCR_STOPBITSEL_BIT );
  if ( Config->ParityEnable )
  {
    Frame |= ( 1<<LCR_PARITYENBALE_BIT );
    Frame |= ( Config->ParitySelect<<LCR_PARITYSEL_BIT );
  }
  if ( Config->BreakEnable )
    Frame |= ( 1<<LCR_BREAKCONTROL_BIT );

  // FIFO
  FIFO=0;
  if ( Config->FIFOEnable )
  {
    FIFO = ((Config->FIFORxTriggerLevel & 0x3)<<6) | 0x1;
  }

  //initialize data buffer for tx and rx
  CommBuf_Init (PortNum, &err);
  if(err!=0) return 1;

  if(PortNum==LPC_UART0)
  {
    //pin select for uart0
    // Enable TxD0 and RxD0, bit 0~3=0101/
    PINSEL0 |= 0x5;

    // Set baut rate 
    U0LCR |= (1<<LCR_DLAB_BIT);		// DLAB = 1
    U0DLM = Divisor>>8;
    U0DLL = Divisor & 0xff;
    // Set frame format 
    U0LCR = Frame;		// DLAB =0
    // Set FIFO 
    U0FCR = FIFO;
    // Set Interrupt Enable Register 
    U0IER = Config->InterruptEnable & 0x7;
    //set Uart0 interrupt priority
    intr.intPriority=Priority0;
    intr.intSrc=INTSRC_UART0;

  }
  else 
  {

    //pin select for uart1
    /* Enable TxD0 and RxD0, bit 16~19=0101 */
    PINSEL0 |= 0x50000;

    /* Set baut rate */
    U1LCR |= (1<<LCR_DLAB_BIT);		// DLAB = 1
    U1DLM = Divisor>>8;
    U1DLL = Divisor & 0xff;
    /* Set frame format */
    U1LCR = Frame;		// DLAB =0
    /* Set FIFO */
    U1FCR = FIFO;
    /* Set Interrupt Enable Register */
    U1IER = Config->InterruptEnable & 0x7;
    //set Uart1 interrupt priority
    intr.intPriority=Priority1;
    intr.intSrc=INTSRC_UART1;		
  }
	
  //configurate as vectored IRQ
  VIC_EnableVectoredIRQ(&intr);		

  return 0;
}

/*************************************************************************
; Function : StartSent
; Parameters: LPC_INT8U  --port number
; Return: void
; Description: Start send the data from portNum port.
; *************************************************************************/
void StartSent(LPC_INT8U PortNum)
{
LPC_INT8U oserr;

  switch(PortNum)
  {
  case LPC_UART0:
    U0THR = CommGetTxChar(PortNum,&oserr);       	
    break;

  case LPC_UART1:
    U1THR = CommGetTxChar(PortNum,&oserr);       	
    break;
  }
}

/*************************************************************************
; Function : IRQC_Uart0
; Parameters: void
; Return: void
; Description: Interrupt serve routine of Uart0 interrupt.
; *************************************************************************/
 void IRQC_Uart0(void)
 {
 
LPC_INT8U i;
LPC_INT8U c;
LPC_INT8U err;

  while(1)
  {
    switch((U0IIR)&0x7)
    {
    case 0x01:                      //no interrupt
      VICVectAddr =0;
      return;        
    case 0x04:                      //rx interrupt
      for(i=0;i<16;i++)
      {
	if( (U0LSR & 0x01)==0 )        //check if data in FIFO has been read out?
	  break;
	CommPutRxChar(LPC_UART0, U0RBR);   			                                    			
      }					 
      break;
    case 0x02:                      //tx interrupt
      for(i=0;i<16;i++)
      {
        c=CommGetTxChar(LPC_UART0,&err);			           			           
        if(err==COMM_NO_ERR)
    	  U0THR  = c;
        else                 //transmit buffer empty 
    	{
    	  CommSendIdle(LPC_UART0);		
    	  break;
        }	
      }
      break;
    }
  }
}				   

/*************************************************************************
; Function : IRQC_Uart1
; Parameters: void
; Return: void
; Description: Interrupt serve routine of Uart1 interrupt.
; *************************************************************************/
void IRQC_Uart1(void)
{
LPC_INT8U i;
LPC_INT8U c;
LPC_INT8U err;

  while(1)
  {
    switch((U1IIR)&0x7)
    {
    case 0x01:                      //no interrupt
      VICVectAddr =0;
      return;        
    case 0x04:                      //rx interrupt
      for(i=0;i<16;i++)
      {
        if( (U1LSR & 0x01)==0 )        //FIFO has been read out 
	  break;
        CommPutRxChar(LPC_UART1, U1RBR);   			                                    			
      }					 
      break;
    case 0x02:                      //tx interrupt
      for(i=0;i<16;i++)
      {
        c=CommGetTxChar(LPC_UART1,&err);			           			           
        if(err==COMM_NO_ERR)
          U1THR  = c;
        else                 //transmit buffer empty
        {
          CommSendIdle(LPC_UART1);		
          break;
        }	
      }
      break;

    }
  }
}

⌨️ 快捷键说明

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