📄 uart.c
字号:
U0TER_bit.TxEn = 1;
Tmp = U0IER; // Clear pending interrupts
// enable RBR Interrupt, THRE Interrupt, RX Line Status Interrupt
U0IER = 0x07;
VIC_SetVectoredIRQ(Uart0Isr,IrqSlot,VIC_UART0);
VIC_EnableInt(1<<VIC_UART0);
}
else
{
pUart1RxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
if(pUart1RxFifo == NULL)
{
return(FALSE);
}
pUart1TxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
if(pUart1TxFifo == NULL)
{
return(FALSE);
}
// Init receive and transmit FIFOs
pUart1RxFifo->PopIndx = pUart1RxFifo->PushIndx = \
pUart1TxFifo->PopIndx = pUart1TxFifo->PushIndx = 0;
// Assign Port 8,9 and 10, 11, 12, 13, 14, 15 to UART1
PINSEL0 &= (UART1_MODEM_STAT_ENA?~0xFFFF0000:~0xF0000);
PINSEL0 |= (UART1_MODEM_STAT_ENA? 0x55550000: 0x50000);
U1LCR = 0x03; // Word Length =8, no parity , 1 stop
U1MCR = 0; // Word Length =8, no parity , 1 stop
U1FCR = 0x7; // Enable and Clear the UART0 FIFO, Set RX FIFO interrupt level - 1 char
// Transmit enable
U1TER_bit.TxEn = 1;
Tmp = U1IER; // Clear pending interrupts
// enable RBR Interrupt, THRE Interrupt, RX Line Status Interrupt
// Modem Status Interrupt, CTS Interrupt Enable
U1IER = 0x07 | (UART1_MODEM_STAT_ENA?0x88:0);
VIC_SetVectoredIRQ(Uart1Isr,IrqSlot,VIC_UART1);
VIC_EnableInt(1<<VIC_UART1);
}
return(TRUE);
}
/*************************************************************************
* Function Name: UartCalcDivider
* Parameters: Int32U Freq, Int32U Baud
* pInt32U pDiv, pInt32U pAddDiv, pInt32U pMul
*
* Return: None
*
* Description: Calculate the coefficients of the UART baudrate generator
*
*************************************************************************/
static
void UartCalcDivider(Int32U Freq, Int32U Baud,
pInt32U pDiv, pInt32U pAddDiv, pInt32U pMul)
{
Int32U Temp, Error = (Int32U)-1;
Int32U K1, K2, K3, Baudrate;
Int32U DivTemp, MulTemp, AddDivTemp;
//
for(MulTemp = 1; MulTemp < 16; ++MulTemp)
{
K1 = Freq*MulTemp;
for(AddDivTemp = 1; AddDivTemp < 16; ++AddDivTemp)
{
K3 = (MulTemp + AddDivTemp)<<4;
K2 = K3 * Baud;
DivTemp = K1/K2;
// if DIVADDVAL>0, UnDL must be UnDL >= 0x0002 or the UART will
// not operate at the desired baud-rate!
if(DivTemp < 2)
{
continue;
}
Baudrate = DivTemp * K3;
Baudrate = K1/Baudrate;
Temp = (Baudrate > Baud)? \
(Baudrate - Baud): \
(Baud - Baudrate);
if (Temp < Error)
{
Error = Temp;
*pDiv = DivTemp;
*pMul = MulTemp;
*pAddDiv = AddDivTemp;
if(Error == 0)
{
return;
}
}
}
}
}
/*************************************************************************
* Function Name: UartSetLineCoding
* Parameters: UartNum_t Uart,UartLineCoding_t pUartCoding
*
* Return: None
*
* Description: Init UART Baud rate, Word width, Stop bits, Parity type
*
*************************************************************************/
void UartSetLineCoding(UartNum_t Uart,UartLineCoding_t UartCoding)
{
Int32U Div, Mul, AddDiv, Frequency;
// Check parameters
if ((UartCoding.dwDTERate == 0) || (UartCoding.dwDTERate > UART_MAX_BAUD_RATE))
{
return;
}
Frequency = SYS_GetFpclk();
UartCalcDivider(Frequency,UartCoding.dwDTERate,&Div,&AddDiv,&Mul);
if (Uart == UART_0)
{
U0LCR_bit.WLS = UartCoding.bDataBits;
U0LCR_bit.SBS = UartCoding.bStopBitsFormat;
U0LCR_bit.PE =(UartCoding.bParityType == UART_NO_PARITY)?0:1;
U0LCR_bit.PS = UartCoding.bParityType;
U0LCR_bit.DLAB = 1;
U0DLL = Div & 0xFF;
U0DLM = (Div >> 8) & 0xFF;
U0FDR = AddDiv + (Mul << 4);
U0LCR_bit.DLAB = 0;
}
else
{
U1LCR_bit.WLS = UartCoding.bDataBits;
U1LCR_bit.SBS = UartCoding.bStopBitsFormat;
U1LCR_bit.PE =(UartCoding.bParityType == UART_NO_PARITY)?0:1;
U1LCR_bit.PS = UartCoding.bParityType;
U1LCR_bit.DLAB = 1;
U1DLL = Div & 0xFF;
U1DLM = (Div >> 8) & 0xFF;
U1FDR = AddDiv + (Mul << 4);
U1LCR_bit.DLAB = 0;
}
}
/*************************************************************************
* Function Name: UartRead
* Parameters: UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize
*
* Return: Int32U
*
* Description: Read received data from UART.
* Return number of readied characters
*
*************************************************************************/
Int32U UartRead(UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize)
{
Int32U Count;
pUartFifo_t pUartFifo = (Uart == UART_0)?pUart0RxFifo:pUart1RxFifo;
for (Count = 0; Count < BufferSize; ++Count)
{
if(!FifoPop(pUartFifo,pBuffer+Count))
{
break;
}
}
return(Count);
}
/*************************************************************************
* Function Name: UartWrite
* Parameters: UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize
*
* Return: Int32U
*
* Description: Write a data to UART. Return number of successful
* transmitted bytes
*
*************************************************************************/
Int32U UartWrite(UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize)
{
Int32U Count = 0;
pUartFifo_t pUartFifo = (Uart == UART_0)?pUart0TxFifo:pUart1TxFifo;
if(BufferSize != 0)
{
if (pUartFifo->PopIndx == pUartFifo->PushIndx)
{
// The Tx FIFO is empty
pInt8U pUartTxReg = (pInt8U)((Uart == UART_0)?&U0THR:&U1THR);
*pUartTxReg = *pBuffer;
++Count;
}
for ( ; Count < BufferSize; ++Count)
{
if(!FifoPush(pUartFifo,*(pBuffer+Count)))
{
break;
}
}
}
return(Count);
}
/*************************************************************************
* Function Name: UartGetUartEvents
* Parameters: UartNum_t Uart
*
* Return: UartLineEvents_t
*
* Description: Get Uart Line events (PE,OE, FE, BI)
*
*************************************************************************/
UartLineEvents_t UartGetUartLineEvents (UartNum_t Uart)
{
UartLineEvents_t LineEvents;
LineEvents.Data = 0;
LineEvents.Data = AtomicExchange(LineEvents.Data,
(Uart == UART_0)?
&Uart0LineEvents.Data:
&Uart1LineEvents.Data);
return(LineEvents);
}
/*************************************************************************
* Function Name: UartSetUartLineState
* Parameters: UartNum_t Uart UartNum_t Uart, Boolean Break
*
* Return: none
*
* Description: Set Uart Break Event
*
*************************************************************************/
void UartSetUartLineState (UartNum_t Uart, Boolean Break)
{
if(Uart == UART_0)
{
U0LCR_bit.BC = Break;
}
else
{
U1LCR_bit.BC = Break;
}
}
#if UART1_MODEM_STAT_ENA > 0
/*************************************************************************
* Function Name: Uart1SetModemLineState
* Parameters: UartModemLineState_t UartModemLineState
*
* Return: none
*
* Description: Init UART1 Modem lines state (RTS, DTR)
*
*************************************************************************/
void Uart1SetModemLineState(UartModemLineState_t UartModemLineState)
{
U1MCR_bit.DTR = UartModemLineState.bDTR;
U1MCR_bit.RTS = UartModemLineState.bRTS;
}
/*************************************************************************
* Function Name: Uart1GetUartModemEvents
* Parameters: none
*
* Return: UartModemEvents_t
*
* Description: Get Uart1 Modem lines events (DCD,DSR,CTS,RI)
*
*************************************************************************/
UartModemEvents_t Uart1GetUartModemEvents (void)
{
UartModemEvents_t ModemEvents;
ModemEvents.Data = 0;
ModemEvents.Data = AtomicExchange(ModemEvents.Data,(pInt32U)&Uart1ModemEvents);
return(ModemEvents);
}
#endif // UART1_MODEM_STAT_ENA > 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -