打印

STM32 USART RXNE中断接收位总共有几种会将其清零

[复制链接]
17422|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gfs0521|  楼主 | 2011-6-24 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gfs0521 于 2011-6-24 14:52 编辑

收到采用19200Bps,开启发送完成后产生标志TC中断和RXNE接收中断

程序问题是在发送数据后 TC标志位中断产生时,2us以内也将收到RXNE标志中断,有时会导致收不到数据,RXNE只有在判断置1时才会读DR寄存器,看资料读取DR寄存器时,将自动清除RXNE标志位。所以在中断程序里没有软件清除RXNE位。

疑问还有哪些情况会导致自动清除RXNE位呢?


暂时解决的方法是在进入USART中断先延时5us后再判断接收中断或发送中断,测试就没有出现数据丢失的问题。
沙发
gfs0521|  楼主 | 2011-6-25 08:16 | 只看该作者
是否读取SR寄存器就会把RXNE标志位中断清零呢?  香主是否帮忙分析下

使用特权

评论回复
板凳
香水城| | 2011-6-25 13:12 | 只看该作者
我现在手头没有资料,参考手册上怎么说的?

使用特权

评论回复
地板
gfs0521|  楼主 | 2011-6-25 21:23 | 只看该作者
资料上 读取DR寄存器时自动将其清零

使用特权

评论回复
5
香水城| | 2011-6-27 11:26 | 只看该作者
LZ问的是还有哪些情况会导致自动清除RXNE位呢,我问的是资料上对你的这个问题是怎么说的?

使用特权

评论回复
6
gfs0521|  楼主 | 2011-6-27 11:48 | 只看该作者
资料上哪有这个问题的说明?

在发送中断产生时,还未退出中断程序时,此时产生了接收中断就会有可能丢失?

使用特权

评论回复
7
香水城| | 2011-6-27 11:55 | 只看该作者
资料上哪有这个问题的说明?

在发送中断产生时,还未退出中断程序时,此时产生了接收中断就会有可能丢失?
gfs0521 发表于 2011-6-27 11:48


在发送中断产生时,还未退出中断程序时,此时产生的接收中断不应该会丢失。贴出你的程序看看,是不是哪里有错误或不合理的地方?

使用特权

评论回复
8
gfs0521|  楼主 | 2011-6-27 11:56 | 只看该作者
是有时会有时不会出现丢失,我也说明了,如果延时了5us再判断就不会有问题,真是奇怪

使用特权

评论回复
9
香水城| | 2011-6-27 13:50 | 只看该作者
不完全理解你的说明:“收到采用19200Bps,开启发送完成后产生标志TC中断和RXNE接收中断”,不知道你的具体操作过程的先后次序如何,所以无法判断究竟是什么问题。

使用特权

评论回复
10
gfs0521|  楼主 | 2011-6-27 13:54 | 只看该作者
////////////////////////////////////////////////////////////////////////////////
// Description    : This function  Bps:19200  
// Input          : None
// Return         : None
////////////////////////////////////////////////////////////////////////////////
void Usart2_Interrupt(void)
{
  unsigned short Length;
  ////////避免发送数据时,接收不到发送的数据,2us时就容易丢失 ******
  ////////延时5us左右,保证发送中断后,同时也接收到发送的数据
  for(Length = 0; Length < 50; Length++) {}

  if((USART2->SR & USART_FLAG_RXNE) != RESET)
  {
    //USART2->SR &= (~USART_FLAG_RXNE);             //向USART2->DR读取数据将自动清零RXNE标志
    Rxd.OverTime = USART_10MS;                      //延时10ms判断是否串口结束 TTT
    Rxd.DataBuf = USART2->DR & 0xff;
   
    ......
  }
  
  /////////检测是否为USART发送结束
  if((USART2->SR & USART_FLAG_TC) != RESET)
  {
    USART2->SR &= (~USART_FLAG_TC);
    if(Txd.Head == HEADING_SENDING)
    {
      if(Txd.Total > 0)
      {
        Txd.Total--;
        USART2->DR = TxdData[Txd.FiFoTemp] & 0x00ff;
        Txd.Result = Crc8BitTab[Txd.Result ^ TxdData[Txd.FiFoTemp]];
        
        Txd.FiFoTemp++;
        if(Txd.FiFoTemp >= TXD_DATA_LENGTH) Txd.FiFoTemp = 0;
      }
      else
      {
        USART2->DR = Txd.Result & 0x00ff;
        Txd.Head = HEADING_SENDEND;     //发送结束,包括CRC校验码
      }
    }
  }
}

使用特权

评论回复
11
gfs0521|  楼主 | 2011-6-27 13:55 | 只看该作者
本帖最后由 gfs0521 于 2011-6-27 13:57 编辑

for(Length = 0; Length < 50; Length++) {}

去掉延时5us 在发送数据时,并同时接收数据很容易丢失掉一个字节

使用特权

评论回复
12
香水城| | 2011-6-27 14:01 | 只看该作者
“避免发送数据时,接收不到发送的数据”这句话是什么意思?

STM32发送数据的同时,还要接收回来自己发送的数据吗?


另外,通信的另一方会在接收数据的同一时刻发送数据吗? 即整个系统是全双工的(任一方的发送和接收都是重叠的)吗?

使用特权

评论回复
13
gfs0521|  楼主 | 2011-6-27 14:22 | 只看该作者
通信的本身在发送时会收到自己发送的数据

TXD发送的数据经外接器件还会由RXD接收,但总线的上会有延时,所以在发送数据时TC会先产生中断,在中断程序加一个IO口变化判断,RXNE接收中断会在TC中断过后2us左右才会产生,就是基本上两个中断不是同时产生的,但有时会漏掉RXNE中断

使用特权

评论回复
14
香水城| | 2011-6-27 16:51 | 只看该作者
请试试,如果有USART_FLAG_RXNE标志,处理完USART_FLAG_RXNE后直接退出中断;同样,如果有USART_FLAG_TC标志,处理完USART_FLAG_TC后也直接退出中断。

使用特权

评论回复
15
gfs0521|  楼主 | 2011-6-30 16:40 | 只看该作者
按照香主的方法测试了,直接退出还是会丢失数据,不知何因

使用特权

评论回复
16
苍凉人生| | 2016-6-20 15:40 | 只看该作者
LZ,你好,我最近做东西遇到相同的问题了,我控制的是个数字舵机,需要接收发送的数据,硬件上是将串口的收发端口直接连到一起的,在接收的数据中有很多字节和发送的不一样。想请教下这个问题你事怎么解决的啊
谢谢

使用特权

评论回复
17
xmshao| | 2016-6-20 16:54 | 只看该作者
苍凉人生 发表于 2016-6-20 15:40
LZ,你好,我最近做东西遇到相同的问题了,我控制的是个数字舵机,需要接收发送的数据,硬件上是将串口的收 ...

你确认下是否发生了溢出,检查下OR标志。

数据接收过程中,有无更高级中断不时发生。

使用特权

评论回复
18
苍凉人生| | 2016-6-20 18:35 | 只看该作者
好的,谢谢啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:佳信智能 QQ:1930517278 专业MODBUS控制器研发与生产

636

主题

894

帖子

0

粉丝