毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

stm32检测不到RXNE标志

更新时间:2012-8-19:  来源:毕业论文

程序是这样的:
void   getonebyte()
{
        while(USART_GetFlagStatus(usart1,USART_FLAG_RXNE)==RESET)
        {
        }
        ReceiveData();//从串口接收字节
}
现在我用上位机通过串口1向STM32发数据包,每隔一秒发送128字节的数据包。波特率用的115200,结果每当收到第三个包的时候就进入上面的while死循环出不来了。换了波特率9600还是不行。
        纠结了几天了,招架不住了。请各位有经验大侠,指教下,帮忙分析下可能什么情况造成
既然前面都接成功了,后面的问题可能是硬件状态错误所致,也可能是软件处理错误所致,但归根结底还是软件问题。

硬件状态包括USART1的RX使能、GPIO的AFIO模式这些,也就是维持USART1正常的全部充分条件。你的程序里有enable,自然应该有disable的地方。断点查一下有没有误入,在原本需要接受的时候关闭了某些关键功能。

调试开始时打开外设监视窗口,把相关硬件模块的监视窗口都打开。当程序刚刚走完初始化,完全准备好接收第一个字节的时候,截图保存一下各外设监视窗口的实时状态。当程序死在while里的时候,暂停,再次观察外设窗口的状态,看跟截图保存的窗口内容有哪些不同。肯定有不同的,不然就灵异了。依照这个线索再去找。

有时候也可能是不经意间质性了clear flag或者读了DR寄存器,清掉了RXNE标志位,这属于典型的软件错误。可以通过断点、单步、控制PC端发送数据的时间等方式来排查。

最后,你的串口接收函数效率有点低。一方面不启用DMA硬件,造成反复执行ReceiveData();函数所产生的额外开销。另一方面用while死等标志位,不仅浪费CPU时间,而且没有容错性。一旦出点意外整个程序就永远死在这里了。至少要加入超时计数和异常处理机制。 死循环的时候检测下USART_GetFlagStatus(usart1,USART_FLAG_RXNE)返回的值
这个是在中断中做的接收处理么?

如果不是,请换成中断方式

 你把while(USART_GetFlagStatus(usart1,USART_FLAG_RXNE)==RESET) 换成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);试试呢,我的程序是这样接受处理的没遇到你那样的问题。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。