LWIP初体验-修改ST官方demo
为什么要写这篇文章?STM32的网络应用还是个复杂的外设的,拿到一个板子需要验证网络部分是否正常,硬件设计是否有问题,对于很熟悉LWIP的同学可以直接移植LWIP,验证硬件。但快速且方便的办法是修改ST的官方demo来验证硬件。(ST提供了CubeMX工具,如果使用该工具的话,也很方便,不在本文的考虑范围内)。
本文的硬件测试环境
主控:STM32F207VCT6,100管脚的封装
网络PHY芯片:RTL8201EL,48管脚封装,34和35管脚下拉,也就是芯片地址:0
使用的网络接口:MII接口
提取码:7uqj
(提示:公众号不支持外链接,请复制链接到浏览器下载)
本文目的:本文不会详细讲解LWIP相关内容,只是LWIP的初体验,如果你有一块板子带有网络PHY,需要你测试硬件是否有问题,本文或许对你有帮助。
ST官方提供了很多demo,UDP,tftp,http,TCP等等,我们修改最常用的TCPSever的demo,代码路径如下:
①是IAR的工程代码,②是Keil的工程代码。
2.1、修改IAR配置文件
硬件使用的是SWD模式,如果你使用的硬件是JTAG模式,不需要修改。
2.2、修改网络PHY地址
2.3、修改硬件IO
在stm32f2x7_eth_bsp.c中,这部分主要是根据具体硬件修改的,因为ST官方demo使用的是144脚芯片,我们使用100脚芯片,对应的GPIO需要修改。
2.2、屏蔽无用的东西和修改IP
在main.h中,屏蔽USE_LCD宏定义,官方开发板使用了LCD,这里我们不使用。
修改IP地址(以本机IP地址为准,修改一个和自己PC在同一网段的空闲IP),再修改网关。
2.3、屏蔽其他代码
屏蔽这一项是因为这是跟芯片相关的,该函数功能:配置物理层产生一个中断的链路状态变化
PHY_MICR宏定义如下
该函数操作的是DP83848的17寄存器,改寄存器属于厂商自定义部分寄存器。
3.1、电脑能ping通
3.2、客户端能够连接收发数据
通过上述修改,已经简单将LWIP简单跑起来了,并且建立了TCPSever,但demo中使用的是查询的方式,实际项目中是需要使用中断的,以便快速接收到网络数据。
添加网口中断配置,在stm32f2x7_eth.c中增加ETH_IRQ的中断配置。
在stm32f2xx_it.c中添加中断服务函数,添加的函数就是刚刚main函数屏蔽的内容。
注意,这里采用时候if判断语句,这里其实是有隐患的,如果一次数据大于1500字节,也就是说需要IP分片就是丢包,IP分片内容请看文章《IP协议详解》。我们将if修改成while即可。
测试结果,使用ping命令测试
PC端使用TCP客户端工具测试STM32建立的TCPsever。
修改调试工具,ST官方代码当然使用STlink了,我使用Jlink。
使用Jlink的SWD模式。
demo的代码在中断函数中,TCP作为客户端主动连接服务器的代码在中断函数中,在ST的demo中,中断触发STM32作为客户端去链接服务器。
移植完毕,为了方便,把所有函数移植到main.c中,不再放置到中断函数中。
分别拷贝tcp_echoclient_connect()、tcp_echoclient_connected()、tcp_echoclient_recv()、tcp_echoclient_connection_close()、tcp_echoclient_send()函数复制过来。
下面的这些变量也要复制过来
复制到main.c中
为防止和tcpsever代码变量冲突,把tcp_echoserver.c所有代码全部屏蔽掉,后者将其从工程目录中删除。
把原来main.h的IP信息复制过来
把tcp_echoclient_connected函数中一下屏蔽
这个时候编译会出错,原因是有些函数调用的错误,
方法1:调整函数位置
方法2:添加函数说明
修改IP(以实际IP为为主)
编译代码,下载到STM32,进行测试:
在PC端使用网络调试助手新建TCP服务器,进行客户端测试,有新的客户端上线。
为将接收到的数据返回PC,我们在tcp_echoclient_recv函数中加入以下代码
收到的数据成功返回
本文简单进行了LWIP的初体验,并没有太多技术含量,按照这个方法可以验证新硬件是否正常,如果上述测试全部通过,说明硬件是没有问题。
☛STM32 触摸按键 必读
☛5000字我"肝"了这篇IP协议 必读