打印

stm32 串口接收数据量大 异常

[复制链接]
13344|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txm2006|  楼主 | 2012-6-18 10:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 txm2006 于 2012-6-18 15:16 编辑

STM32F051  串口接收数据多时,串口就不能读取到接收的数据。一旦出现异常即使不向串口发送数据,也会一直进中断。
中断函数如下:
void USART2_IRQHandler(void)
{

  if(USART_GetITStatus(USART2, USART_FLAG_ORE) != RESET)
  {
    USART_ClearITPendingBit(USART2, USART_FLAG_ORE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }
}


USARTx
ISR 寄存器 的值为0x006000D8



中断程序中已经清除了ORE标志,但是不起作用。
问题已经困扰好几天了,求指点!

位 3 ORE: 溢出错误
在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好
了一个字节的数据并准备往RDR 寄存器去转移的时候,会由硬件将这个位置1。
由软件向USART_ICR 寄存器的ORECF 位写1,可以清除这个标志。
如果USART_CR1 寄存器中的RXNEIE 位或EIE 位是1,就会产生中断请求。
0: 没有溢出错误
1: 检测到溢出错误
注: 1. 当这个位被置1,RDR 寄存器中的数据不会丢,但移位寄存器中的(那个新的)
数据就会蒸发掉了。 如果在多缓冲区通讯时EIE 位是1,并且ORE 标志被置1 的话,
就会同步引起一个中断请求。
2. 如果USART_CR3 寄存器中的OVRDIS 位是1,那么这个位就会被长期的强制
为零(没有了溢出检测功能)



沙发
txm2006|  楼主 | 2012-6-18 11:47 | 只看该作者
没人遇到么?:o

使用特权

评论回复
板凳
txm2006|  楼主 | 2012-6-18 15:14 | 只看该作者
搞定!!!!
中断函数改成下面就可以了:
void USART2_IRQHandler(void)
{

  if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  {
    USART_ClearFlag(USART2, USART_FLAG_ORE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }
}

使用特权

评论回复
地板
watch186| | 2012-10-24 10:26 | 只看该作者
必须顶  我也是遇到啦  以前用就没有问题  这次做东西结果在串口上出了这么大问题~哎

使用特权

评论回复
5
watch186| | 2012-10-24 11:00 | 只看该作者
忍不住啦  果然可以  再顶一下

使用特权

评论回复
6
zxm19820916| | 2013-3-6 17:50 | 只看该作者
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
这个能编译通过吗?
我的芯片是STM32F051C8,查看这个函数,参数USART_IT_RXNE是非法的。

使用特权

评论回复
7
pilihuo| | 2013-10-10 09:18 | 只看该作者
我也遇到类似问题,实验一下看结果如何

使用特权

评论回复
8
Euphorix| | 2014-6-12 21:42 | 只看该作者
在做双串口和485通信时出现大量丢包问题,明天用这个方法试试。

使用特权

评论回复
9
jeffshuai| | 2014-11-13 18:32 | 只看该作者
谢谢,我也是这问题

使用特权

评论回复
10
txm2006|  楼主 | 2015-11-3 21:54 | 只看该作者
没想到这个帖子,两年后还有人关注。

使用特权

评论回复
11
supstudent| | 2015-11-10 20:35 | 只看该作者
txm2006 发表于 2015-11-3 21:54
没想到这个帖子,两年后还有人关注。

呵呵,我也是这个问题,也是按照你的方法做的,现在好了。

使用特权

评论回复
12
crystal1987| | 2015-11-12 15:50 | 只看该作者
中断函数中为啥要两次接收数据,而且都放在同一个变量中,不明白什么用意?


中断函数改成下面就可以了:
void USART2_IRQHandler(void)
{

  if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  {
    USART_ClearFlag(USART2, USART_FLAG_ORE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }
}

使用特权

评论回复
13
crystal1987| | 2015-11-12 15:51 | 只看该作者
txm2006 发表于 2015-11-3 21:54
没想到这个帖子,两年后还有人关注。


中断函数中为啥要两次接收数据,而且都放在同一个变量中,不明白什么用意?


中断函数改成下面就可以了:
void USART2_IRQHandler(void)
{

  if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  {
    USART_ClearFlag(USART2, USART_FLAG_ORE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    UART2_temp_buff = USART_ReceiveData(USART2);
  }
}

使用特权

评论回复
14
foxglove| | 2015-11-12 15:55 | 只看该作者
STM32F051  串口接收数据多时,串口就不能读取到接收的数据。一旦出现异常即使不向串口发送数据,也会一直进中断

使用特权

评论回复
15
foxglove| | 2015-11-12 15:56 | 只看该作者
USART_GetFlagStatus USART_GetITStatus

使用特权

评论回复
16
无韵芦苇| | 2015-12-28 21:48 | 只看该作者
txm2006 发表于 2012-6-18 15:14
搞定!!!!
中断函数改成下面就可以了:
void USART2_IRQHandler(void)

明天试试  这几天脑子里都是USART几个标志位  迷迷糊糊的

使用特权

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

本版积分规则

5

主题

25

帖子

0

粉丝