|
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
uint16_t i;
for (i = 0; i < _usLen; i++)
{
/* 如果发送缓冲区已经满了,则等待缓冲区空 */
while (1)
{
__IO uint16_t usCount;
DISABLE_INT();
usCount = _pUart->usTxCount;
ENABLE_INT();
if (usCount < _pUart->usTxBufSize)
{
break;
}
else if(usCount == _pUart->usTxBufSize)/* 数据已填满缓冲区 */
{
if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)
{
SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE);
}
}
}
.......
}
如果超过了 FIFO 大小,就需要等待有空间可用,针对这种情况有个重要的知识点,就是当缓冲刚刚填满的时候要判断发送空中断是否开启了,
如果填满了还没有开启,就会卡死在 while 循环中,所以多了一个刚填满时的判断,填满了还没有开启发送空中断,要开启下。
if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0) 为什么要做这个判断了,直接 SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); 不是还要少一个操作吗?
还是说读操作比写操作要快一些?
|
|