功能
-
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
函数是比较方便。