荣陶陶 发表于 2025-4-13 17:32

HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Receive_DMA的区别

功能
HAL_UART_Receive_DMA 仅仅是开启的串口的DMA接收,若是想使用空闲中断 + DMA接收则需要开启串口的空闲中断;

而HAL_UARTEx_ReceiveToIdle_DMA函数中则包含了开启串口空闲中断;



HAL_UART_Receive_DMA 的接收类型是HAL_UART_RECEPTION_STANDARD,为标准接收;





​ HAL_UARTEx_ReceiveToIdle_DMA的接收类型是HAL_UART_RECEPTION_TOIDLE,为接收到空闲中断或接收完成;





中断回调
因为其接收类型的不同HAL_UART_RECEPTION_STANDARD和HAL_UART_RECEPTION_TOIDLE导致其中断回调函数的不同;
HAL_UART_Receive_DMA的中断回调函数HAL_UART_RxCpltCallback,是在DMA1_Stream3_IRQHandler中断函数中调用的,当达到接收数据长度时触发的,虽然空闲中断被触发了,但是在并未在USART1_IRQHandler执行清除标志位和触发函数的执行;

HAL_UARTEx_ReceiveToIdle_DMA的中断回调函数HAL_UARTEx_RxEventCallback,是在USART1_IRQHandler中断函数中调用的,当达到接收指定数据长度或者产生空闲中断时时触发的;

使用HAL_UARTEx_ReceiveToIdle_DMA函数实现空闲中断 + DMA接收不定长数据是比较方便的,只需要在HAL_UARTEx_RxEventCallback函数中完成对数据的处理和再次开启就可以了,相关的标志位会在USART1_IRQHandler中被清除;

使用HAL_UART_Receive_DMA函数实现空闲中断 + DMA接收不定长数据是比较不方便的,需要在USART1_IRQHandler函数中完成检测标志位、清除标志位、停止DMA、获取数据长度、处理数据、开启新一轮的接收,需要自己补充函数完成一系列的操作。

结论
实现串口的空闲中断 + DMA接收不定长数据使用HAL_UARTEx_ReceiveToIdle_DMA函数是比较方便。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_41555003/article/details/143892557

页: [1]
查看完整版本: HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Receive_DMA的区别