jianhong_wu 发表于 2017-8-20 10:15:12

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

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

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




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

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

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


页: [1]
查看完整版本: M3(stm32f103)或M4的单片机为什么会在用串口的时候莫名其妙的死机?已解答。