串口常见问题之ORE错误

                                                 

问题:UART5不能正常接收摄像头数据

原因:串口的抢占优先级不同导致抢占优先级高的串口(UART5)发生ORE错误(中文参考手册683)

实例分析:

       省赛使用三个串口,USART1(蓝牙),USART3(定位系统),UART5(摄像头),其中USART1目前不接受数据,所以不用考虑其对其他串口接收中断的影响。

       USART3中断优先级配置:

UART5中断优先级配置:

USART3每5ms进一次中断,UART5每40ms进一次中断,而USART3的抢占优先级又高于UART5,UART5不能及时清除RXNE标志位,导致ORE产生。

那么为什么会发生呢?

首先我们做了以下操作,使能了RXNE

又根据

因此ORE产生。

 

 

 

 

解决方法:

方法一:

原理:

方法二:

       在串口初始化里使能ERR中断

         在中断函数里写:

       需要注意:

另外注意:

1.    串口优先级不要随便配。我建议串口抢占优先级配成一样,CAN抢占优先级配成一样,定时器抢占优先级最低(级别最高),为0。至于响应优先级,繁忙的那个配低一点(级别最高)。如果有人反驳,并且有依据的话,麻烦帮我修改一下文档。谢谢。

2.    如解决方法一,以后有if,必写else!

3.    无论标准库函数,还是自己写。局部临时变量必须初始化!至于为什么,现在已经能用实例给出答案,请参考“定时器bug后续”。

4.    如第一张图所说,发生这种错误时,串口会丢数,请注意!

如若想详细了解中断,请参考中文参考手册第十章,中断与事件。

如若只想以实际应用为出发点了解中断,参考新浪博客,stm32中断优先级彻底讲解

本文参考:360个人图书馆 关于USART接收中断的BUG和注意事项

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用HAL库驱动STM32G0系列的UART接收数据时,可以通过注册回调函数来处理接收完成中断。以下是一个示例代码,展示了如何使用HAL_UART_RxCpltCallback回调函数来处理UART接收完成中断并清除ORE错误。 ```c #include "stm32g0xx_hal.h" UART_HandleTypeDef huart; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 检查是否发生了ORE错误 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { // 清除ORE错误标志位 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE); // 清空接收缓冲区 __HAL_UART_FLUSH_DRREGISTER(huart); } // 在这里处理接收完成中断 // 例如,将接收到的数据发送回去 HAL_UART_Transmit(huart, huart->pRxBuffPtr, 1, HAL_MAX_DELAY); // 重新启动接收 HAL_UART_Receive_IT(huart, huart->pRxBuffPtr, 1); } int main(void) { // 初始化HAL库和UART HAL_Init(); __HAL_RCC_USART1_CLK_ENABLE(); huart.Instance = USART1; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_RX; HAL_UART_Init(&huart); // 启动接收 HAL_UART_Receive_IT(&huart, huart.pRxBuffPtr, 1); while (1) { // 主循环中可以执行其他任务 // ... } } ``` 在上述代码中,我们在HAL_UART_RxCpltCallback回调函数中处理接收完成中断,并检查是否发生了ORE(Overrun Error)错误。如果发生了ORE错误,我们通过清除ORE错误标志位和清空接收缓冲区来解决该问题。然后,我们将接收到的数据通过UART发送回去,并重新启动接收以等待下一次中断。 请注意,以上示例代码是基于STM32G0系列处理器和HAL库的,如果你使用其他系列的STM32处理器或其他库,可能需要进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值