独闷闷网

 找回密码
 立即注册
搜索
查看: 2986|回复: 0
打印 上一主题 下一主题
收起左侧

[原创] M3(stm32f103)或M4的单片机为什么会在用串口的时候莫名其妙的死机?已解答。

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-20 10:15:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2017-8-20 10:18 编辑

坚鸿-深圳:
大家知道,世上有两种死机,一种是上电立即死,还有一种是上电后偶尔在某种特定的情况下才死,这种死最折磨人,因为它很有潜伏性,危害最大。我最近用一个M3的单片机跟一个M4的单片机进行串口通信,今天早上就遇到了这种莫名其妙的死机的问题。奥妙就在于串口中断这个函数,我们用的串口中断函数往往是从别人的开发板例程那里抄来,大该测试了一下没问题就误以为万事大吉,但是这个问题潜伏性很大。大家只要记住:用M3或者M4的串口中断函数,进入中断函数后,最后再离开这个中断函数的时候,一定要增加一段代码,这段代码就是及时清除中断的标志位,有了这行代码这个串口程序才有可靠性。有人会问,我们在调用读取某个字节的库函数的时候,不是已经默认可以清除某个接收中断的标志位了吗?这个是误导性最大的问题,因为,如果正常的接收数据是不会死机,但是,串口在实际应用中,在多个中断存在的情况下,容易出现硬件总线通信的错误,一旦发生了硬件总线通信的错误,某个标志位就会置位,串口就会进入到串口中断函数里,如果此时没有清除标志位的代码,这个单片机就永远频繁的进入串口中断,死机了!现在,跟大家分享M3内核的stm32f103和M4内核的LPC4357在进入串口中断时候的具体清除标志位的代码,截图如下:




白蚁-江苏:
印象中遇到过,一般我都会在中断开始的地方先清掉,不管什么原因进的中断,首先清标志。

坚鸿-深圳:
建议在最后离开的时候再清。因为有一些标志位我们未必理解它具体的含义。比如我刚才用的LPC4357那两行代码,必须在最后清,如果在刚进入的时候清,会影响串口接收数据。

白蚁-江苏:
有道理,又学到了。


乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-4-20 18:15 , Processed in 0.186451 second(s), 20 queries .

快速回复 返回顶部 返回列表