三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

探讨(HAL库)使用rs485时,开了DMA收发,但是没有开串口的全局中断,导致只发送(接收)了一次数据就不发送了。

探讨(HAL库)使用rs485时,开了DMA收发,但是没有开串口的全局中断,导致只发送(接收)了一次数据就不发送了。

造成的原因

  1. 调用HAL_UART_Transmit_DMA(),HAL 库将 USART1 的发送状态 (gState) 标记为HAL_UART_STATE_BUSY_TX

  2. DMA 控制器在后台将数据从内存搬运到 USART 的发送数据寄存器 (TDR)

  3. 当最后一个字节由 DMA 搬运到 USART 的 TDR 后,DMA 的传输工作就完成了 。但是,此时最后一个字节可能还“躺”在 USART 的移位寄存器中,没有真正发送到总线上 。

  4. HAL 库需要等待 USART 硬件报告“发送完成 (TC, Transmission Complete)”标志,才能确认数据已全部发完,并将gState改回HAL_UART_STATE_READY,为下一次发送做准备。

  5. TC 标志的检测和处理,正是通过USART1的全局中断服务函数USART1_IRQHandler来完成的。

  6. 如果没有开启串口全局中断,TC 标志就无法被处理,gState将永远保持在HAL_UART_STATE_BUSY_TX状态。

  7. 当你第二次调用HAL_UART_Transmit_DMA()时,HAL 库检查到gState为忙,就会直接返回HAL_BUSY并退出,导致第二次发送失败。

← 返回列表