【发布时间】:2016-08-08 02:23:02
【问题描述】:
我看到 HAL 提供了以下函数来接收带中断的串行数据:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
这基本上设置了 rx 中断和返回。
一旦接收到的字节数达到Size,就会调用HAL_UART_RxCpltCallback()。
HAL 在执行此回调之前禁用 rx 中断
问题:
传入字节的数量是可变的(从 1 到 ~100),我需要将它们放入环形缓冲区。
所以我将 Size 设置为 1 并在回调中再次调用 HAL_UART_Receive_IT() 以重新启用中断,如果板子不时发送 1 或 2 个字节,它会很好地工作,但超出此范围会丢失字节
我的猜测是它们被错过了,因为它们在中断禁用 - 启用之间到达
有没有办法让中断永远运行而不会覆盖 HAL Cube 生成的代码?
如果不是,那么覆盖所涉及功能的干净方法是什么?
我是否缺少一些可以避免需要找到此解决方案的东西?
【问题讨论】:
-
这似乎是一个没有简单解决方案的已知问题:stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver
-
似乎 DMA 可以将数据从任何外围设备写入任何内存缓冲区,包括环形缓冲区(DMA 设置)。而 DMA 中断是在接收时刻处理所有数据甚至其一半数据的简单方法。
-
这并不取决于您的问题。但我认为尝试 keil io 驱动程序可能是值得的。这是您可以为您的 mcu 找到它们的链接 keil.com/dd2/pack