stm32 串口接收数据量大 异常

[复制链接]
14280|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
寄存器.jpg
寄存器2.jpg

中断程序中已经清除了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 | 显示全部楼层
必须顶  我也是遇到啦  以前用就没有问题  这次做东西结果在串口上出了这么大问题~哎
watch186 发表于 2012-10-24 11:00 | 显示全部楼层
忍不住啦  果然可以  再顶一下
zxm19820916 发表于 2013-3-6 17:50 | 显示全部楼层
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
这个能编译通过吗?
我的芯片是STM32F051C8,查看这个函数,参数USART_IT_RXNE是非法的。
pilihuo 发表于 2013-10-10 09:18 | 显示全部楼层
我也遇到类似问题,实验一下看结果如何
Euphorix 发表于 2014-6-12 21:42 | 显示全部楼层
在做双串口和485通信时出现大量丢包问题,明天用这个方法试试。
jeffshuai 发表于 2014-11-13 18:32 | 显示全部楼层
谢谢,我也是这问题
 楼主| txm2006 发表于 2015-11-3 21:54 | 显示全部楼层
没想到这个帖子,两年后还有人关注。
supstudent 发表于 2015-11-10 20:35 | 显示全部楼层
txm2006 发表于 2015-11-3 21:54
没想到这个帖子,两年后还有人关注。

呵呵,我也是这个问题,也是按照你的方法做的,现在好了。
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);
  }
}
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);
  }
}
foxglove 发表于 2015-11-12 15:55 | 显示全部楼层
STM32F051  串口接收数据多时,串口就不能读取到接收的数据。一旦出现异常即使不向串口发送数据,也会一直进中断
foxglove 发表于 2015-11-12 15:56 | 显示全部楼层
USART_GetFlagStatus USART_GetITStatus
无韵芦苇 发表于 2015-12-28 21:48 | 显示全部楼层
txm2006 发表于 2012-6-18 15:14
搞定!!!!
中断函数改成下面就可以了:
void USART2_IRQHandler(void)

明天试试  这几天脑子里都是USART几个标志位  迷迷糊糊的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部