OpenEdv-开源电子网

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

串口问题求救

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
发表于 2012-7-24 10:36:30 | 显示全部楼层 |阅读模式

我在别处看到的程序 ,求各位高手给解答下 红字部分,为什么要清除挂起位,溢出是怎么回事,为什么要清除标志位,红字部分用寄存器如何操作
void USART3_IRQHandler(void)
{
    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
    {
        usart3_receive_process_event(USART_ReceiveData(USART3));
        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
    }

    //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
    if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET)
    {
        usart3_receive_process_event(USART_ReceiveData(USART3));
        USART_ClearFlag(USART3,USART_FLAG_ORE);
    }
}

还有就是 原子哥的串口中断是这么写的,这里边为什么没有这么啰嗦呢,也没清除挂起位,标志位
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;
  if((USART_RX_STA&0x80)==0)//接收未完成
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }                  
 }             
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-24 11:10:26 | 显示全部楼层
回复【楼主位】think:
---------------------------------
你自己可以测试一下,不清除标志位会怎么样!
结果就是你一次中断,会导致不停的进入中断函数.

溢出应该就是串口在第一个数据没被读走的时候,就又收到第二个数据了.
此为溢出.

寄存器操作就简单了,参考我们的标准例程即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2012-7-24 11:25:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥!!你好!!!
void USART1_IRQHandler(void)
{
 u8 res;     
 if(USART1->SR&(1<<5))//接收到数据
 {  
  res=USART1->DR; 
  if((USART_RX_STA&0x80)==0)//接收未完成
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了 
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收   
    }   
   }
  }                   
 }              





这就是寄存器的标准例程吧,我从光盘里看到的。这里边怎么没有清除标志位呢?
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2012-7-24 12:07:39 | 显示全部楼层
关注一下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-24 12:41:32 | 显示全部楼层
因为读DR,可以达到同样的效果
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2012-7-24 14:41:02 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
 usart3_receive_process_event(USART_ReceiveData(USART3));这里USART_ReceiveData(USART3)也读DR了

怎么解释,后边的 清除也可以省略了??
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2012-7-24 16:46:59 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
void USART3_IRQHandler(void)
{
    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
    {
        usart3_receive_process_event(USART_ReceiveData(USART3));
        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
    }

    //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
    if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET)
    {
        usart3_receive_process_event(USART_ReceiveData(USART3));
        USART_ClearFlag(USART3,USART_FLAG_ORE);
    }
}
这个函数里,也读DR了, 后边两个函数式多余的吗
                       USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                                       USART_ClearFlag(USART3,USART_FLAG_ORE);

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-24 18:25:03 | 显示全部楼层
第一个可以不要吧.第二个可以留着.
要翻手册看看读DR能不能清除USART_FLAG_ORE标志,如果能,就也可以去掉.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2012-7-27 16:30:50 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,你看我改的对吗?通过寄存器改的
void USART1_IRQHandler(void)
{
u8 res;
    if(USART1->SR&(1<<5))//接收到数据
    {
res=USART1->DR;
             usart1_receive_process_event(res);
USART1->SR &=0xDF; //清除接收数据寄存器非空中断标志
        //USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }

    //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
    if(USART1->SR&(1<<3))
    {
        res=USART1->DR;
        usart1_receive_process_event(res);
        USART1->SR &=0xf7;
        //USART_ClearFlag(USART1,USART_FLAG_ORE);
    }
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-27 18:37:20 | 显示全部楼层
回复【9楼】think:
---------------------------------
测试一下就知道了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2012-7-27 21:49:11 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
就是从寄存器设置上来说,对吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-28 00:42:36 | 显示全部楼层
回复【11楼】think:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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