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

时间:2016-04-15 23:51:02

标签: c stm32 hal

我看到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生成的代码?
如果没有,那么覆盖相关功能的干净方法是什么?
是否有一些我错过的东西可以避免找到这个解决方案?

4 个答案:

答案 0 :(得分:0)

您可以尝试使用UART拉取方式而不是中断方式。 拉动方式:UART不会返回,直到收到"尺寸"指定的数量。参数。

答案 1 :(得分:0)

我认为你必须加上一个特殊字符来表示按摩的结束,或者你制定了自己的协议,例如:邮件头,邮件长度,内容,校验和 然后在一个字节中启用中断,在中断处理程序中存储接收到的缓冲区,直到找到消息中的最后一个字节,然后在RTOS情况下发送到主任务,或者设置全局标志。 顺便提一下,确保在

中设置适当的接收字节大小
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

里面

HAL_UART_RxCpltCallback

请检查HAL_UART_Receive_IT的返回,它可能会返回错误 实施

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle);

并检查UART总线是否有错误。

答案 2 :(得分:0)

试试这个

providers: [{provide: APP_INITIALIZER, useClass: YourService, multi: true}],

答案 3 :(得分:0)

带DMA的循环缓冲区(用于接收)似乎是满足您需求的解决方案。这将始终提供RX中断(您只需配置一次)。

对于类似的要求,通常我使用1字节循环缓冲区来处理数据。接收处理将在ISR中完成。