STM32
直播中

李勇

8年用户 1391经验值
私信 关注
[问答]

求助,如何解决串口ORE中断问题?

使用STM32F1做串口通信测试,想试一下在921600波特率下通信是否稳定,stm32cubemx自动生成代码,开启了两个中断,一个定时器tim2(每1ms中断1次),一个Usart1中断(在中断里面把接收到的1个字符发送出去)。没有启动Tim2中断前,串口能随时发随时收。
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uint8_t ch[2];
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler( huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  HAL_UART_Receive( huart1,ch,1,100);
  HAL_UART_Transmit( huart1,ch,1,100);
  __HAL_UART_CLEAR_FLAG( huart1,UART_FLAG_RXNE);
  /* USER CODE END USART1_IRQn 1 */
}

主程序啥也不干,空转。
使用了Tim2中断,并且在Tim2里面设置断点,暂停一下,串口就不能接受数据了,再也进不了接收中断。查看寄存器状态,应该是串口连续接收到数据,未能及时响应,造成了ORE故障。所以,只要开启多个中断,串口接收处理不及时,都会产生ORE错误。

请教大家,我是不是在主程序里需要加入ORE故障判断并清除的代码?看了那么多代码,没有见到谁的主程序有判断ORE的代码,也没见人提到过,各位专家是怎么解决的,敬请指教。

回帖(2)

陈龙

2024-4-9 17:19:42
在CSDN找到一个清除方法,但不好使
    __HAL_UART_CLEAR_FLAG( huart1, UART_FLAG_PE);//清标志
    __HAL_UART_CLEAR_FLAG( huart1, UART_FLAG_FE);
    __HAL_UART_CLEAR_FLAG( huart1, UART_FLAG_NE);
    __HAL_UART_CLEAR_FLAG( huart1, UART_FLAG_ORE);
举报

马雁翔

2024-4-9 17:19:51
没你的中断处理时间太长了,导致丢了数据产生ORE,你能不能自己用寄存器写个,不要用HAL,
你的921600波特率,速度太快了,差不多1us 中断了,改用DMA接收
举报

更多回帖

发帖
×
20
完善资料,
赚取积分