📄 lpc_uart.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 + -