HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Receive_DMA的区别

功能

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

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

    image-20241030101624494
  2. HAL_UART_Receive_DMA 的接收类型是HAL_UART_RECEPTION_STANDARD,为标准接收;

    image-20241030101352545 image-20241030101459847

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

image-20241030105621598

image-20241030105708696

中断回调

  1. 因为其接收类型的不同HAL_UART_RECEPTION_STANDARDHAL_UART_RECEPTION_TOIDLE导致其中断回调函数的不同;

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

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

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

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

结论

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值