欢迎使用CSDN-markdown编辑器

来源:互联网 发布:数据分析功能 编辑:程序博客网 时间:2024/06/14 00:08

前几天做了机器人平衡模块,串口出现异常。


现象描述

   在和上位机联调时,Debuge时发现上位机的命令发过来时,如果在在串口中断中打个断点,那么程序就莫名其妙进去异常状态了。上位机所发数据我定义好的一串字符协议。每条指令十几个字节。而不打断点时,机器却会正常运转。找了些方法查找问题。

查找问题

   因为是进入了HardFault_Handler的异常处理函数,所以就先查查是否某处指针啊什么的溢出,细节我就不描述了,正好以前的一片文章讲的不错,我就直接拿过来吧http://www.51hei.com/bbs/dpj-39846-1.html,你可以这样夸我:真懒!!!   通过对栈顶指针状态等信息,找到中断前执行的最后一条指令,确实是用到了指针函数,不过并没有溢出什么的错误,通过查看Call Stack窗口的show-CallerCode的方式也没找到问题所在。   没办法,只能去翻看寄存器手册去了。想到以前也碰到过串口不接收消息的问题。跟这个有些类似,于是直接奔串口的CMD寄存器去了。找到了这么一句话。Writing 1 to this bit clears the RBNE flag to discard    the received data without reading it. 。然后我就在串口中断函数末尾加上一句USART2->CMD |= 0x0008; 试了一下,问题居然消失了。

解决办法

   就如上面写的USART2->CMD |= 0x0008;就是我的办法了。再来理解一下。怎么清了一下可读数据标志位就好了呢?我的理解就是在串口中断到来时,我确实把里面的字节读走了,但是因为是调试状态,后面还有其他字节,导致不能被及时读走。这样串口就想了:我该不该保留这个字节去或舍弃这个没被读走的字节去接收下一个字节呢?一直拿不定主意,所以就串口就乱掉了。USART2->CMD |= 0x0008;就是串口(肢体)发出请求,mcu(大脑)你没读走的字节我就不要了,我要去读下一个字节给你行不行。当然cpu回答是默认的:行。

今天是个mark的日子,毕业一年了,花了很多精力在arm-cotex M 上,纯粹的垒代码和产品的需求比起来简直是小巫见大巫,代码改了又改的日子终于暂告一段落。终于可以将精力放在驱动开发上,CSDN的账号都快放发毛了。感谢CSDN不删,此时的我是个混血儿,骨子里有满满的鸡血。

原创粉丝点击