搜索
查看: 1551|回复: 6

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

[复制链接]

该用户从未签到

10

主题

36

帖子

2

蝴蝶豆

中级会员

最后登录
2022-9-14
发表于 2020-12-21 12:40:09 | 显示全部楼层 |阅读模式
使用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的代码,也没见人提到过,各位专家是怎么解决的,敬请指教。
捕获.PNG
回复

使用道具 举报

该用户从未签到

10

主题

36

帖子

2

蝴蝶豆

中级会员

最后登录
2022-9-14
 楼主| 发表于 2020-12-21 14:19:32 | 显示全部楼层
如何手动清除ORE标志,在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);
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

195

帖子

65

蝴蝶豆

金牌会员

最后登录
2023-9-26
发表于 2020-12-21 15:12:27 | 显示全部楼层
为什么会有ORE,不看手册吗,你是中断处理时间太长,丢了数据,
手册上指出,相ORE时候,先读SR,再读DR 可以清除ORE
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

36

帖子

2

蝴蝶豆

中级会员

最后登录
2022-9-14
 楼主| 发表于 2020-12-21 15:57:52 | 显示全部楼层
串口调试软件,自动发,单片机这里一有断点,就ORE了。
我想在主循环里面加个判断,处理这个小概率事件,毕竟有可能发生。
我不知道HAL库怎么写清除代码。
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

195

帖子

65

蝴蝶豆

金牌会员

最后登录
2023-9-26
发表于 2020-12-21 16:14:55 | 显示全部楼层
没你的中断处理时间太长了,导致丢了数据产生ORE,你能不能自己用寄存器写个,不要用HAL,
你的921600波特率,速度太快了,差不多1us 中断了,改用DMA接收
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

36

帖子

2

蝴蝶豆

中级会员

最后登录
2022-9-14
 楼主| 发表于 2020-12-21 16:54:16 | 显示全部楼层
好的,我研究学习一下DMA
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

36

帖子

2

蝴蝶豆

中级会员

最后登录
2022-9-14
 楼主| 发表于 2020-12-21 17:30:19 | 显示全部楼层
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  //HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE))
  {
    HAL_UART_Receive(&huart1,ch,1,100);
    flag = 1;
  }
  __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
  /* USER CODE END USART1_IRQn 1 */
}
接收中断函数,写成这样就没问题了,有ORE也没关系,不执行HAL_UART_IRQHandler(&huart1);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-14 14:57 , Processed in 1.191753 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表