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发送注意增加小的延时文章来源:https://www.toymoban.com/news/detail-680981.html
circular模式的 ***CpltCallback回调才有用,normal模式不使用回调。文章来源地址https://www.toymoban.com/news/detail-680981.html
到了这里,关于stm32 hal库uart使用 DMA中断只能发送一次的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!