📄 hal_uart.c
字号:
if ( cfg->rxTick > tick )
{
cfg->rxTick -= tick;
}
else
{
cfg->rxTick = 0;
}
#if HAL_UART_ISR
#if HAL_UART_DMA
if ( cfg->flag & UART_CFG_DMA )
{
pollDMA( cfg );
}
else
#endif
{
pollISR( cfg );
}
#elif HAL_UART_DMA
pollDMA( cfg );
#endif
/* The following logic makes continuous callbacks on any eligible flag
* until the condition corresponding to the flag is rectified.
* So even if new data is not received, continuous callbacks are made.
*/
if ( cfg->rxHead != cfg->rxTail )
{
uint8 evt;
if ( cfg->rxHead >= (cfg->rxMax - SAFE_RX_MIN) )
{
evt = HAL_UART_RX_FULL;
}
else if ( cfg->rxHigh && (cfg->rxHead >= cfg->rxHigh) )
{
evt = HAL_UART_RX_ABOUT_FULL;
}
else if ( cfg->rxTick == 0 )
{
evt = HAL_UART_RX_TIMEOUT;
}
else
{
evt = 0;
}
if ( evt && cfg->rxCB )
{
cfg->rxCB( ((cfg->flag & UART_CFG_U1F)!=0), evt );
}
}
#if HAL_UART_0_ENABLE
if ( cfg == cfg0 )
{
#if HAL_UART_1_ENABLE
if ( cfg1 )
{
cfg = cfg1;
}
else
#endif
break;
}
else
#endif
break;
} while ( TRUE );
#else
return;
#endif
}
/**************************************************************************************************
* @fn Hal_UART_RxBufLen()
*
* @brief Calculate Rx Buffer length - the number of bytes in the buffer.
*
* @param port - UART port
*
* @return length of current Rx Buffer
**************************************************************************************************/
uint16 Hal_UART_RxBufLen( uint8 port )
{
uartCfg_t *cfg = NULL;
#if HAL_UART_0_ENABLE
if ( port == HAL_UART_PORT_0 )
{
cfg = cfg0;
}
#endif
#if HAL_UART_1_ENABLE
if ( port == HAL_UART_PORT_1 )
{
cfg = cfg1;
}
#endif
HAL_UART_ASSERT( cfg );
return UART_RX_AVAIL( cfg );
}
/*****************************************************************************
* @fn HalUARTRead
*
* @brief Read a buffer from the UART
*
* @param port - USART module designation
* buf - valid data buffer at least 'len' bytes in size
* len - max length number of bytes to copy to 'buf'
*
* @return length of buffer that was read
*****************************************************************************/
uint16 HalUARTRead( uint8 port, uint8 *buf, uint16 len )
{
uartCfg_t *cfg = NULL;
uint8 cnt = 0;
#if HAL_UART_0_ENABLE
if ( port == HAL_UART_PORT_0 )
{
cfg = cfg0;
}
#endif
#if HAL_UART_1_ENABLE
if ( port == HAL_UART_PORT_1 )
{
cfg = cfg1;
}
#endif
HAL_UART_ASSERT( cfg );
while ( (cfg->rxTail != cfg->rxHead) && (cnt < len) )
{
*buf++ = cfg->rxBuf[cfg->rxTail];
if ( cfg->rxTail == cfg->rxMax )
{
cfg->rxTail = 0;
}
else
{
cfg->rxTail++;
}
cnt++;
}
#if HAL_UART_DMA
#if HAL_UART_ISR
if ( cfg->flag & UART_CFG_DMA )
#endif
{
/* If there is no flow control on a DMA-driven UART, the Rx Head & Tail
* pointers must be reset to zero after every read in order to preserve the
* full length of the Rx buffer. This implies that every Read must read all
* of the Rx bytes available, or the pointers will not be reset and the
* next incoming packet may not fit in the Rx buffer space remaining - thus
* the end portion of the incoming packet that does not fit would be lost.
*/
if ( !(cfg->flag & UART_CFG_FLW) )
{
// This is a trick to trigger the DMA abort and restart logic in pollDMA.
cfg->flag |= UART_CFG_RXF;
}
}
#endif
#if HAL_UART_ISR
#if HAL_UART_DMA
if ( !(cfg->flag & UART_CFG_DMA) )
#endif
{
cfg->rxCnt = UART_RX_AVAIL( cfg );
if ( cfg->flag & UART_CFG_RXF )
{
if ( cfg->rxCnt < (cfg->rxMax - SAFE_RX_MIN) )
{
RX_STRT_FLOW( cfg );
}
}
}
#endif
return cnt;
}
/******************************************************************************
* @fn HalUARTWrite
*
* @brief Write a buffer to the UART.
*
* @param port - UART port
* pBuffer - pointer to the buffer that will be written, not freed
* length - length of
*
* @return length of the buffer that was sent
*****************************************************************************/
uint16 HalUARTWrite( uint8 port, uint8 *buf, uint16 len )
{
uartCfg_t *cfg = NULL;
uint8 cnt;
#if HAL_UART_0_ENABLE
if ( port == HAL_UART_PORT_0 )
{
cfg = cfg0;
}
#endif
#if HAL_UART_1_ENABLE
if ( port == HAL_UART_PORT_1 )
{
cfg = cfg1;
}
#endif
HAL_UART_ASSERT( cfg );
if ( cfg->txHead == cfg->txTail )
{
#if HAL_UART_DMA
// When pointers are equal, reset to zero to get max len w/out wrapping.
cfg->txHead = cfg->txTail = 0;
#endif
#if HAL_UART_ISR
#if HAL_UART_DMA
if ( !(cfg->flag & UART_CFG_DMA) )
#endif
{
cfg->flag &= ~UART_CFG_TXF;
}
#endif
}
// Accept "all-or-none" on write request.
if ( TX_AVAIL( cfg ) < len )
{
return 0;
}
for ( cnt = len; cnt; cnt-- )
{
cfg->txBuf[ cfg->txHead ] = *buf++;
if ( cfg->txHead == cfg->txMax )
{
cfg->txHead = 0;
}
else
{
cfg->txHead++;
}
}
#if HAL_UART_ISR
#if HAL_UART_DMA
if ( !(cfg->flag & UART_CFG_DMA) )
#endif
{
if ( !(cfg->flag & UART_CFG_TXF) && len )
{
cfg->flag |= UART_CFG_TXF;
if ( !(cfg->flag & UART_CFG_U1F) )
{
U0DBUF = cfg->txBuf[cfg->txTail];
}
else
{
U1DBUF = cfg->txBuf[cfg->txTail];
}
}
}
#endif
return len;
}
#if HAL_UART_ISR
/***************************************************************************************************
* @fn halUart0RxIsr
*
* @brief UART0 Receive Interrupt
*
* @param None
*
* @return None
***************************************************************************************************/
#if HAL_UART_0_ENABLE
HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )
{
cfg0->rxBuf[cfg0->rxHead] = U0DBUF;
if ( cfg0->rxHead == cfg0->rxMax )
{
cfg0->rxHead = 0;
}
else
{
cfg0->rxHead++;
}
}
#endif
/***************************************************************************************************
* @fn halUart1RxIsr
*
* @brief UART1 Receive Interrupt
*
* @param None
*
* @return None
***************************************************************************************************/
#if HAL_UART_1_ENABLE
HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR )
{
cfg1->rxBuf[cfg1->rxHead] = U1DBUF;
if ( cfg1->rxHead == cfg1->rxMax )
{
cfg1->rxHead = 0;
}
else
{
cfg1->rxHead++;
}
}
#endif
/***************************************************************************************************
* @fn halUart0TxIsr
*
* @brief UART0 Transmit Interrupt
*
* @param None
*
* @return None
***************************************************************************************************/
#if HAL_UART_0_ENABLE
HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )
{
UTX0IF = 0;
if ( cfg0->txTail == cfg0->txMax )
{
cfg0->txTail = 0;
}
else
{
cfg0->txTail++;
}
if ( cfg0->txTail != cfg0->txHead )
{
U0DBUF = cfg0->txBuf[cfg0->txTail];
}
}
#endif
/***************************************************************************************************
* @fn halUart1TxIsr
*
* @brief UART1 Transmit Interrupt
*
* @param None
*
* @return None
***************************************************************************************************/
#if HAL_UART_1_ENABLE
HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )
{
UTX1IF = 0;
U1CSR &= ~CSR_TX_BYTE; // Rev-D does not require, older does.
if ( cfg1->txTail == cfg1->txMax )
{
cfg1->txTail = 0;
}
else
{
cfg1->txTail++;
}
if ( cfg1->txTail != cfg1->txHead )
{
U1DBUF = cfg1->txBuf[cfg1->txTail];
}
}
#endif
#endif
/******************************************************************************
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -