W5500是工业级以太网芯片,如果MPU单片机芯片不支持网络,可以用此芯片辅助,从而实现与上位机TCP/IP或者UDP协议的网络通讯。在我们的一个产品中,就使用了W5500,通过SPI接口与单片机连接,产品在用户处用了一年多了,总是反映一个问题,使用过程中,偶发死机问题,通过跟踪发现是网络通讯卡死了,而且与用户的一个频繁发送操作有关。
但并不是每次发送都有问题。分析发送按钮,发现有连续发的可能,也就是说,按下去一次有可能发了两次消息,导致单片机通讯解析错误。在上位机win10端的应用程序中,每20ms处理一次通讯,这个时间不能动。按键快慢可调,但害怕影响用户操作感受。怎么办?搞一个确认提示对话框,在点击发送后,先给用户提示已经发送成功,不用再重复点击发送了。
1、解决延时函数耗费单片机内部资源的问题。可以将延时函数放在中断中...进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。----这方法,适合于简单的、单任务的情况。利用定时(如10ms)中断,就可以轮流检测各个按键以及其它需要处理的任务的标志。某一个条件满足了,就执行对应处理程序。
2、单片机程序死机跑飞可能有哪些原因单片机程序死机,跑飞了可以从以下几个方面查找原因:1.意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象;2.中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。4.无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;5.看门狗没有关闭。
3、怎么解决单片机中中断的冲突在开放了中断的程序部分中,如果使用了有可能会被中断程序修改的变量(而使用一半时若被修改就会出错),以及做了某些如果被打断就可能出错的操作的时候,可以临时性的关中断,后面再重新开中断。即可,中断函数处理最少的事情尽量在中断内置标志,在中断外查询标志去处理。1,通过优先级,可让某中断优先执行,1、不知道你所使用的是什么样的单片机。