OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8218|回复: 7

F407的hal库串口一直进入串口接收中断的bug

[复制链接]

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-1-8
在线时间
21 小时
发表于 2018-1-12 10:04:30 | 显示全部楼层 |阅读模式
1金钱
//串口6中断服务程序
代码是仿照串口1的程序该来的,测试时串口接收数据比较多时,就容易导致这个bug,一直进入串口接收中断,if条件一直满足,即使串口6的硬件连接都断开了,依然始终进入串口接收中断
串口1有时也会出现这个问题,一直进入串口接收中断,程序死在这里,不能执行其他的操作,也不进入hardfault。
请问各位大神,有遇到过这个问题吗?有什么解决方法呢?
void USART6_IRQHandler(void)                       
{
        u8 Res;
        u8 flag;
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntEnter();   
#endif
        if((__HAL_UART_GET_FLAG(&UART6_Handler,UART_FLAG_RXNE)!=RESET))
        {
        HAL_UART_Receive(&UART6_Handler,&Res,1,1000);
                usart6_rec_buf[wk2114_read_len++]=Res;
        }
        HAL_UART_IRQHandler(&UART6_Handler);       
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntExit();                                                                                           
#endif
}


最佳答案

查看完整内容[请看2#楼]

你在中断中设一个断点,然后看看中断时是不是有其它错误标记位被置位了,有就在代码中加上清楚错误标记的代码。 我个人认为原子HAL库中,串口部分的教程是很坑的,建议你参考官方的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-12 10:04:31 | 显示全部楼层
江枫三号楼 发表于 2018-1-12 11:26
在实际调试时发现,程序并没有停在HAL_UART_Receive这里,程序是一直在运行的,一直进入中断,if条件一直 ...

你在中断中设一个断点,然后看看中断时是不是有其它错误标记位被置位了,有就在代码中加上清楚错误标记的代码。
我个人认为原子HAL库中,串口部分的教程是很坑的,建议你参考官方的。
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-12 10:09:49 | 显示全部楼层
HAL_UART_Receive() 是阻塞式函数,不要在中断中使用!!!
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-1-8
在线时间
21 小时
 楼主| 发表于 2018-1-12 11:26:57 | 显示全部楼层
Noctis 发表于 2018-1-12 10:09
HAL_UART_Receive() 是阻塞式函数,不要在中断中使用!!!

在实际调试时发现,程序并没有停在HAL_UART_Receive这里,程序是一直在运行的,一直进入中断,if条件一直满足。
原子的源码程序就是推荐这种写法的。
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-1-8
在线时间
21 小时
 楼主| 发表于 2018-1-18 10:57:12 | 显示全部楼层
Noctis 发表于 2018-1-12 12:03
你在中断中设一个断点,然后看看中断时是不是有其它错误标记位被置位了,有就在代码中加上清楚错误标记的 ...

不用原子推荐的方法,改用官方的方法后,问题解决了。
回复

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2018-1-28 15:18:11 来自手机 | 显示全部楼层
交易看HAL_USART_.c的官方库函数的说明介绍,最方便是用DMA模式,平常使用IT模式的接收发送函数,只有程序很小才用阻塞的那个函数需要在主函数一直查询
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-1-8
在线时间
21 小时
 楼主| 发表于 2018-1-28 15:49:04 | 显示全部楼层
abdfgh 发表于 2018-1-28 15:18
交易看HAL_USART_.c的官方库函数的说明介绍,最方便是用DMA模式,平常使用IT模式的接收发送函数,只有程序 ...

使用的是gprs模块,接收发送长度不确定,就没用DMA。刚开始是使用IT模式,但是在接收数据时,有时会无缘无故得持续进入接收中断,即使把接收线断开,还是会进入,原因不明。最后改用那个阻塞函数,加了个超时判断,暂时没发现问题。
时间紧,功能多,有些东西都没时间细细研究,能用没出现问题,就糊弄过去了,等时间充裕了可能要好好研究部一番hal库的串口。
回复

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2018-1-29 16:23:47 | 显示全部楼层
江枫三号楼 发表于 2018-1-28 15:49
使用的是gprs模块,接收发送长度不确定,就没用DMA。刚开始是使用IT模式,但是在接收数据时,有时会无缘 ...

就我目前使用的来看 DMA加串口空闲中断是最方便的,带IT的接收也可以参照原子的串口做,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart==&huart2)
  {
    if(RS3485_RX_STA<RS3485_MAX_RECV_LEN)//还可以接收数据
    {
      RS3485_TIMEOUT=0;
      if(RS3485_RX_STA==0)
      {
        RS3485_START=1;
      }
      RS3485_RX_BUF[RS3485_RX_STA++]=RS3485_IT_BUF[0];//记录接收到的值
    }
    else
    {
      RS3485_RX_STA|=1<<15;//强制标记接收完成
    }
    HAL_UART_Receive_IT(&huart2,RS3485_IT_BUF,1);
  }
}
主程序初始化完  HAL_UART_Receive_IT(&huart2,RS3485_IT_BUF,1);
加一句这个打开接收中断就可以了 是用的超时接收10MS超时,配合一个定时器就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 03:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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