for (uint16 cnt = 0; cnt < len; cnt++)
{
dmaCfg.txBuf[dmaCfg.txTail] = *buf++;
dmaCfg.txMT = 0;
{
dmaCfg.txBuf[dmaCfg.txTail] = *buf++;
dmaCfg.txMT = 0;
if (dmaCfg.txTail >= HAL_UART_DMA_TX_MAX-1)
{
dmaCfg.txTail = 0;
}
else
{
dmaCfg.txTail++;
}
{
dmaCfg.txTail = 0;
}
else
{
dmaCfg.txTail++;
}
// Keep re-enabling ISR as it might be keeping up with this loop due to other ints.
IEN2 |= UTXxIE;
}
IEN2 |= UTXxIE;
}
上面的是在串口写数据的函数中,当执行到 IEN2 |= UTXxIE 时,如果UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];还没有发送完,中断标记没有置1.是不是数据就丢失了?还是说每次执行到 IEN2 |= UTXxIE 时,UxDBUF 中的数据一定是发送完并把中断标记置1?上面的代码会不会出现数据丢失?
UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];
#if (HAL_UART_DMA == 1)
HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )
#else
HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )
#endif
{
HAL_ENTER_ISR();
HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )
#else
HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )
#endif
{
HAL_ENTER_ISR();
if (dmaCfg.txHead == dmaCfg.txTail)
{
IEN2 &= ~UTXxIE;
dmaCfg.txMT = 1;
}
else
{
UTXxIF = 0;
UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];
{
IEN2 &= ~UTXxIE;
dmaCfg.txMT = 1;
}
else
{
UTXxIF = 0;
UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];
if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX))
{
dmaCfg.txHead = 0;
}
}
{
dmaCfg.txHead = 0;
}
}
HAL_EXIT_ISR();
}
}
求回答。谢谢