如何在 STM32F1 上使用 HAL 库保持 uart RX 中断永久启用

Ger*_*ard 5 c hal stm32

我看到 HAL 提供了以下用于通过中断接收串行数据的函数:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
它基本上设置了 rx 中断并返回。
HAL_UART_RxCpltCallback()一旦接收到的字节数达到 就会被调用Size
HAL 在执行此回调之前禁用 rx 中断

问题:
传入字节的数量将是可变的(从 1 到 ~100),我需要将它们放入环形缓冲区中。
因此,我设置Size为 1 并HAL_UART_Receive_IT()在回调内部再次调用以重新启用中断,如果主板时不时地发送 1 或 2 个字节,那么它会很好地工作,但超出这个范围就会丢失字节

我的猜测是它们被错过了,因为它们在中断禁用 - 启用之间到达

有没有办法让中断永远运行而不覆盖 HAL Cube 生成的代码?
如果没有,覆盖相关函数的干净方法是什么?
我是否缺少某些东西可以避免找到此解决方案?

小智 0

您可以通过轮询方法而不是中断方法来尝试UART。轮询方式:UART 接收到“Size”参数指定的数据量后才会返回。

  • 问题是“大小”是可变的,并且我的应用程序对时间至关重要,这就是我首先使用中断的原因。通过编辑 HAL 函数“UART_Receive_IT”来实现此功能,以便传入字节直接进入环形缓冲区,并且中断不会被禁用 (2认同)