|
本帖最后由 freertos 于 2018-3-2 14:49 编辑
串口中断里面为什么不要清除发送寄存器空标志(最后一次发送完成后没有继续写DR不会自动清除TXE)和发送完成标志TC等?
- /* 处理发送缓冲区空中断 */
- if (USART_GetITStatus(_pUart->uart, USART_IT_TXE) != RESET)
- {
- //if (_pUart->usTxRead == _pUart->usTxWrite)
- if (_pUart->usTxCount == 0)
- {
- /* 发送缓冲区的数据已取完时, 禁止发送缓冲区空中断 (注意:此时最后1个数据还未真正发送完毕)*/
- USART_ITConfig(_pUart->uart, USART_IT_TXE, DISABLE);
- /* 使能数据发送完毕中断 */
- USART_ITConfig(_pUart->uart, USART_IT_TC, ENABLE);
- }
- else
- {
- /* 从发送FIFO取1个字节写入串口发送数据寄存器 */
- USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);
- if (++_pUart->usTxRead >= _pUart->usTxBufSize)
- {
- _pUart->usTxRead = 0;
- }
- _pUart->usTxCount--;
- }
- }
- /* 数据bit位全部发送完毕的中断 */
- else if (USART_GetITStatus(_pUart->uart, USART_IT_TC) != RESET)
- {
- //if (_pUart->usTxRead == _pUart->usTxWrite)
- if (_pUart->usTxCount == 0)
- {
- /* 如果发送FIFO的数据全部发送完毕,禁止数据发送完毕中断 */
- USART_ITConfig(_pUart->uart, USART_IT_TC, DISABLE);
- /* 回调函数, 一般用来处理RS485通信,将RS485芯片设置为接收模式,避免抢占总线 */
- if (_pUart->SendOver)
- {
- _pUart->SendOver();
- }
- }
复制代码
|
|