[应用相关] HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Receive_DMA的区别

[复制链接]
1346|2
 楼主| 荣陶陶 发表于 2025-4-13 17:32 | 显示全部楼层 |阅读模式
功能
HAL_UART_Receive_DMA 仅仅是开启的串口的DMA接收,若是想使用空闲中断 + DMA接收则需要开启串口的空闲中断;

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

3696567fa070c4f8d7.png

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

3485467fa07078b99f.png

5136067fa0701c6ea5.png

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

4674567fa06fbb956a.png

4193867fa06f7a4b22.png

中断回调
因为其接收类型的不同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

欢乐家园 发表于 2025-4-30 23:57 | 显示全部楼层
这个函数并没有涉及到空闲中断,因此它适用于固定长度的数据接收。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

240

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部