STM32 HAL库使用HAL_UARTEx_ReceiveToIdle_DMA函数触发空闲中断问题的解决方案

最近使用STM32cubeide编写单片机代码,使用串口HAL库时,遇到HAL_UARTEx_ReceiveToIdle_DMA()函数只触发了接收半满和接收全满中断,没有触发空闲中断,后来在STM32官网论坛找到了具体解决方法,在此分享给遇到同样问题的小伙伴

HAL_UARTEx_ReceiveToIdle_DMA()用法

HAL_UARTEx_ReceiveToIdle_DMA()是HAL库较新的函数(我看了官方文档,2020年的文档还没有这个函数,2023年的文档才有),用于DMA方式接收不定长数据,使用该函数时需要给一个预期接收数据量Buff_Size,当串口收到小于等于Buff_Size时,会进入HAL_UARTEx_RxEventCallback()函数,实际上有3种情况都会进入HAL_UARTEx_RxEventCallback()函数,1.接收到的数据等于Buff_Size的一半时,2.接收到的数据小于Buff_Size且传输结束时(即出现空闲),3.接收到的数据等于Buff_Size时。也就是说接收到的数据大于Buff_Size的一半且小于Buff_Size时,会触发两次HAL_UARTEx_RxEventCallback()函数。一个半满,一个空闲中断。如何分辨是哪一种情况触发的呢?使用HAL_UARTEx_GetRxEventType()函数,会有三个结果,分别是HAL_UART_RXEVENT_HT,HAL_UART_RXEVENT_TC,HAL_UART_RXEVENT_IDLE,分别对应半满、全满和空闲中断。这里可以提一下,不喜欢半满中断的,可以使用__HAL_DMA_DISABLE_IT()函数将其关闭。

HAL_UARTEx_ReceiveToIdle_DMA()无法触发IDLE空闲中断

我在使用时发现半满中断和全满中断都触发了HAL_UARTEx_RxEventCallback()函数,唯独空闲中断没有触发,其原因是半满中断和全满中断是DMA的中断,开启DMA时自动开启了,而空闲中断却是需要主动打开串口的全局中断,默认是没有开启的,如下图所示,勾选全局中断即可解决。

作者:DP1042

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库使用HAL_UARTEx_ReceiveToIdle_DMA函数触发空闲中断问题的解决方案

发表回复