OpenEdv-开源电子网

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

关于卡死在串口接收中断问题

[复制链接]

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-3-29 10:39:50 | 显示全部楼层 |阅读模式
3金钱
我在串口一的接收中断中只写了一句检测发送是否完成的函数,如下所示:

void USART1_IRQHandler (void)
{       
#if SYSTEM_SUPPORT_OS
    OSIntEnter();
#endif
   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
   {
     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
   }
#if SYSTEM_SUPPORT_OS          
        OSIntExit();
#endif
}


这样写开机重启时有一定几率卡死在中断中是为什么?
在 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)前再加上一句USART_SendData(USART1,USART_ReceiveData(USART1))就一切正常了。
请前辈们指点一下,谢谢!

最佳答案

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

仔细看看这句话的含义就知道为啥卡住了 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-3-29 10:39:51 | 显示全部楼层
仔细看看这句话的含义就知道为啥卡住了
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-3-30 14:06:00 | 显示全部楼层
这样写,就再也不会死掉[mw_shl_code=c,true]void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
        {
        unsigned int Res;
        if (USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)
        {
                        USART_ReceiveData(USART1);
                        USART_ClearFlag(USART1, USART_FLAG_PE);
        }

        if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
        {
                        USART_ReceiveData(USART1);
                        USART_ClearFlag(USART1, USART_FLAG_ORE);
        }
        if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
        {
                        USART_ReceiveData(USART1);
                        USART_ClearFlag(USART1, USART_FLAG_FE);
        }
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï
        {             
                        USART_ClearFlag(USART1, USART_FLAG_RXNE);  
                        USART_ClearITPendingBit(USART1, USART_IT_RXNE);   //Çå3yÖD¶Ï±êÖ¾       
                        Res =USART_ReceiveData(USART1);        //¶á衽óêÕμ½μÄêy¾Y
                  g_Uart1_Timer=1;//èç1ûóDêy¾Y£¬¿aÆô±ê־룬¶¨ê±Æ÷¿aê¼¼Æêy
                  if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
                        {               
                                USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                USART_RX_STA++;
                                if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ          
                  }                  
   }

} [/mw_shl_code]
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-3-30 14:08:42 | 显示全部楼层
而且同2楼说的,你里面的是什么鬼,写错了吧?没有清除标志函数呐
回复

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2018-3-30 15:21:50 | 显示全部楼层
你这写的啥啊  接收中断里面判断发送完成   不卡死才怪  
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 23:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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