探讨(HAL库)使用rs485时,开了DMA收发,但是没有开串口的全局中断,导致只发送(接收)了一次数据就不发送了。
造成的原因:
调用
HAL_UART_Transmit_DMA(),HAL 库将 USART1 的发送状态 (gState) 标记为HAL_UART_STATE_BUSY_TXDMA 控制器在后台将数据从内存搬运到 USART 的发送数据寄存器 (TDR)
当最后一个字节由 DMA 搬运到 USART 的 TDR 后,DMA 的传输工作就完成了 。但是,此时最后一个字节可能还“躺”在 USART 的移位寄存器中,没有真正发送到总线上 。
HAL 库需要等待 USART 硬件报告“发送完成 (TC, Transmission Complete)”标志,才能确认数据已全部发完,并将
gState改回HAL_UART_STATE_READY,为下一次发送做准备。TC 标志的检测和处理,正是通过
USART1的全局中断服务函数USART1_IRQHandler来完成的。如果没有开启串口全局中断,TC 标志就无法被处理,
gState将永远保持在HAL_UART_STATE_BUSY_TX状态。当你第二次调用
HAL_UART_Transmit_DMA()时,HAL 库检查到gState为忙,就会直接返回HAL_BUSY并退出,导致第二次发送失败。
