解决STM32 HAL库UART使用DMA中断只能发送一次的问题

1.stm32 uart使用DMA,无论发送还是接收都各自有一个数据流中断。这个数据流中断是框架代码不必过多关心。

2.使用了DMA后,uart的global中断是否要使用?标准做法是在cubemx上要勾选的,不然,就会产生只能发送一次的问题。

问题的原因?

我相信这是hal库的问题,理论上讲有一个数据流中断就可以了。实际上只发送一次的原因是在第二次调用 HAL_UART_Transmit_DMA时 huart->gState==HAL_UART_STATE_BUSY

解决办法 :

1.比较直接的做法是在调用HAL_UART_Transmit_DMA前,将huart->gState= HAL_UART_STATE_READY.

2.比较优雅的做法:开启uart的global中断,这中断中

HAL_UART_IRQHandler->UART_EndTransmit_IT.后面的函数会在dma发送完成后,将huart->gState= HAL_UART_STATE_READY

备注:

一般情况uart dma发送选择normal模式(只作用一次),接收采用circular模式(连接作用)。

如果想一直发送和接收可以采用以下两种办法

1.开启uart global中断,开启UART_IT_IDLE中断使能。在idle中断处理时,重启调用HAL_UART_Transmit_DMA发送。

2.在HAL_UART_RxCpltCallback回调处理中调用HAL_UART_Transmit_DMA。DMA发送注意增加小的延时

circular模式的 ***CpltCallback回调才有用,normal模式不使用回调。

物联沃分享整理
物联沃-IOTWORD物联网 » 解决STM32 HAL库UART使用DMA中断只能发送一次的问题

发表评论