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;这个是什么意思?是不是每执行到IEN2 |= UTXxIE这句就跳到HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) 这个服务程序中执行?执行完HAL_ISR_FUNCTION 到第2次 IEN2 |= UTXxIE时,第一个字节它一定已经发送完?会不会出现发送的字节还没有发送完,又执行到IEN2 |= UTXxIE,此时往UxDBUF 中写数据导致此次的数据丢失?
还有它能保证每一个字节都能成功发送?比如我写60个字节,都能保证全部发送?
UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; 这句往buf中写一个字节后,不用判断那个字节已经发送完的?
#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();
}
}
求回答。谢谢