指定的超时后有意接收完整的UART DMA中断

时间:2018-10-04 13:16:49

标签: stm32 dma stm32f4 stm32f7

我已将UART配置为以DMA模式接收,其中缓冲区的大小约为64字节。因此,基本上,仅当接收到64个字符时才会触发HAL_UART_RxCpltCallback()DMA接收完全中断。

STM32中是否有一种方法可以配置DMA Rx的超时,当缓冲区仅被部分填充(即接收到少于64个字符)并且在指定的超时时间内我们不再接收到字符时,然后,DMA将引发相同的基于HAL_UART_RxCpltCallback()的中断,以使使用者消耗UART当前接收的部分数据吗?

3 个答案:

答案 0 :(得分:1)

这很容易,但是您必须使用USART接收器超时中断。 enter image description here

答案 1 :(得分:1)

您可以将UART空闲检测中断与DMA中断并行使用。 我已经在ST32F0xx处理器上使用了多次,并且运行良好。 F4和F7处理器上也应该有空闲检测功能。

互联网上有一些针对您的问题的教程,还提供了有关空闲检测的解决方案。 例如。看看这个this one

答案 2 :(得分:0)

为了获得已传输字节的计数,可以使用 DMA_CNDTRx DMA_SxNDTR 寄存器(名称与STM系列不同,其中x-通道号)。

该寄存器在每次DMA传输后递减。传输完成后,如果通道配置为自动重载模式,则该寄存器可以保持为零或通过先前编程的值自动重载。

不幸的是,STM HAL不提供API,您应该自己实现。