zoukankan      html  css  js  c++  java
  • LWIP

                                          LWIP

      今天要谈的不是LWIP协议栈的内容,只是简单谈谈关于STM32F407快速使用LWIP做网络通讯的一些经历。

      我是一个网络小白,对网络知识一窍不通,仅仅是知道有IP地址、网关这玩意,也从来没有做过嵌入式网络这块内容,那么要如何在2周内实现网络通讯呢,我要实现的功能很简单,只有几十字节的数据量,而且发送不频繁,但是要做到随时拔插网线,随时连接网络,网络中断能尽快连接。

      首先,LWIP已经被广泛应用,在网上有很多教程,我个人偏爱上淘宝找,因为在淘宝找对应的开发板,可以快速地验证驱动程序是否能用。我使用的是原子哥的探索者开发板,正点原子的配套教程资料非常齐全,我学stm32也是一路跟着他们的教程走过来的,真心感谢正点原子对嵌入式教育的贡献。这次的实验是把开发板作为TCP的客户端,直接把例程烧到对应的开发板上,非常完美地与服务器通讯了,验证完毕,接下来不要急着去看程序,先去看人家录制的教学视频。第一次看视频的时候,不急于求成,快速浏览一边,知道个大致的框架,如果仔细的看每一个知识点,保证你中途就睡着了。看了第一遍视频后,了解了整个硬件流程,就是STM32F407自带了一个MAC介质层,具体是什么,我也不知道暂时也不用知道,只需要知道LWIP协议栈需要通过MAC层来读取数据,而MAC层的数据是通过几根线,用MII或者RMII协议来从PHY层读取数据,PHY又是什么?同样,不理会它,只要知道这次用的PHY芯片型号叫做LAN8720,听起来这么牛逼的芯片当然要配置一下,这个芯片是通过2根线叫SMI接口与STM32通讯。再然后这个PHY层的数据就是从水晶头(带变压器)那里得来的了。大致流程就是这样。

      整理了数据流向后,开始分模块去学习,最开始程序是通过LWIP协议栈读取,这个协议栈是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,驱动呢就是去人家官网下。然后LWIP怎么操作MAC层,这个是STM32的东西,自然是去ST官网下载MAC的驱动,而操作PHY是通过SMI接口的,这个国际通用的接口ST给出来的驱动有了。到这里用到的文件大致就清楚了。

      接下来可以去看程序了,认真的再回去看视频,仔细分析怎么移植这两个驱动文件,不需要明白文件的内容,但必须得知道哪些文件是属于哪个驱动的,这个可以慢慢品味两三天了。了解驱动移植之后就从main函数开始跟踪,去查看怎么实现LWIP和各种硬件的初始化,还有怎么发数据接收数据。

      最后开始改造工程,原子哥的例程里,如果上电没有插网线,程序就会死掉,先解决这个最大的问题,如图1-1,这是源程序,初始化一直在死循环,所以把死循环去掉就好。

    图1-1

      程序是不死了,但是初始化的过程好久啊,那得改一下官方驱动了,如图1-2,把LAN8720初始化等待时间改小了,如图1-3,把LWIP的DHCP等待时间改小了。

    图1-2

    图1-3

      现在速度快了,但是还是不能上电后随时插网线随时上网,后来发现网上说的读取LAN8720的BSR寄存器中的bit2位或者bit4位可以检测网线,那都是鬼扯,我每个位都试过了,发现是bit1位叫jabber检测才有用。通过检测这个可以实现网线拔插的监控,如图1-4是jabber位读取函数。

    图1-4

      可以正常检测了,但发现连不上网,这个就一言难尽了,需要注意的是原子哥使用的是动态内存管理,有申请就要有释放,可以把动态内存换为静态的,但是要改的地方有点多,也就不想去搞它了,如图1-5,把一直需要用的两个内存申请放外面,不再释放和申请,LWIP内核就初始化一次,因为重复初始化鬼知道它会闹出什么事来,因为LWIP里面也有使用动态内存。

    图1-5

      最后,tcp_client_open函数就是初始化成功后进去申请一个PCB块的,断网就要释放PCB块太麻烦了,所以我这里把这部分改成了静态的。断网之后其实只要重新申请一个PCB块就能连接上,但是考虑到拔网线很长时间或者重置了路由器,PCB块可能连接不上,所以断网后直接退出tcp_client_open函数,重新进行初始化和DHCP获取。因为我不懂DHCP和LWIP内核,所以经常重连失败,最后瞎摸出几个函数,如图1-6。断网后要断开PCB块的连接,停止DHCP,移除lwip_netif网卡。我也不知道是否正确,这是试出来没有问题的,缺乏理论依据,治标不治本,到最后的最后要去学习一下网络知识,深入学习LWIP内核才能把网络通讯这块灵活运用。

    图1-6

      以上就是快速上手STM32F407的LWIP网络通讯,首先能粗糙地运用,后面才会有信心去优化,去做得更好,不要一次就最求完美。有空的话就去图书馆看看原子哥推荐的那本书《嵌入式网络那些事:LWIP协议深度剖析与实战演练》作者朱升林。

  • 相关阅读:
    Linux防火墙--iptables学习
    LVS持久化
    LVS管理工具--ipvsadm
    Linux负载均衡--LVS(IPVS)
    一步步学习python
    驱动工程师需要的技能
    红外图像盲元补偿matlab实现源码与效果验证
    红外图像非均匀矫正——两点矫正
    夏日炎炎 python写个天气预报
    解决OV系列摄像头寄存器读数据无法收到的问题
  • 原文地址:https://www.cnblogs.com/wcw12580/p/10573821.html
Copyright © 2011-2022 走看看