01硬件说明
为什么要写这篇文章?STM32的网络应用还是个复杂的外设的,拿到一个板子需要验证网络部分是否正常,硬件设计是否有问题,对于很熟悉LWIP的同学可以直接移植LWIP,验证硬件。但快速且方便的办法是修改ST的官方demo来验证硬件。(ST提供了CubeMX工具,如果使用该工具的话,也很方便,不在本文的考虑范围内)。
本文的硬件测试环境
- 主控:STM32F207VCT6,100管脚的封装
- 网络PHY芯片:RTL8201EL,48管脚封装,34和35管脚下拉,也就是芯片地址:0
- 使用的网络接口:MII接口
涉及到的硬件原理图和PCB开源,开源地址https://github.com/strongercjd/STM32F207VCT6本文涉及到的修改前代码和修改后代码下载地址链接:https://pan.baidu.com/s/1dr9MzX_pga2SYWOft4lniw
提取码:7uqj
(提示:公众号不支持外链接,请复制链接到浏览器下载)
本文目的:本文不会详细讲解LWIP相关内容,只是LWIP的初体验,如果你有一块板子带有网络PHY,需要你测试硬件是否有问题,本文或许对你有帮助。
02修改步骤
ST官方提供了很多demo,UDP,tftp,http,TCP等等,我们修改最常用的TCPSever的demo,代码路径如下:
①是IAR的工程代码,②是Keil的工程代码。
2.1、修改IAR配置文件
修改芯片设置(其实不用修改)
硬件使用的是SWD模式,如果你使用的硬件是JTAG模式,不需要修改。
2.2、修改网络PHY地址
在stm32f2x7_eth_bsp.h文件中,将DP83848的PHY地址修改为0。
2.3、修改硬件IO
在stm32f2x7_eth_bsp.c中,这部分主要是根据具体硬件修改的,因为ST官方demo使用的是144脚芯片,我们使用100脚芯片,对应的GPIO需要修改。
2.4、屏蔽无用的东西和修改IP
在main.h中,屏蔽USE_LCD宏定义,官方开发板使用了LCD,这里我们不使用。
修改IP地址(以本机IP地址为准,修改一个和自己PC在同一网段的空闲IP),再修改网关。
2.5、屏蔽其他代码
在stm32f2x7_eth_bsp.c中
屏蔽这一项是因为这是跟芯片相关的,该函数功能:配置物理层产生一个中断的链路状态变化
demo使用的是DP83848,我们的硬件使用的是RTL8201
该函数定义
PHY_MICR宏定义如下
该函数操作的是DP83848的17寄存器,改寄存器属于厂商自定义部分寄存器。
重点是RTL8201芯片没有该寄存器。这部分内容详见《RTL8201网络芯片讲解》,里面讲解到了这个问题。
03效果显示
3.1、电脑能ping通
3.2、客户端能够连接收发数据
使用PC的TCP客户端,可以连接上STM32F207建立的TCPSever,端口是7。STM32收到数据后,把所有数据返回。
04使用中断方式
通过上述修改,已经简单将LWIP简单跑起来了,并且建立了TCPSever,但demo中使用的是查询的方式,实际项目中是需要使用中断的,以便快速接收到网络数据。
首先屏蔽掉main.c中轮询函数。
添加网口中断配置,在stm32f2x7_eth.c中增加ETH_IRQ的中断配置。
在stm32f2xx_it.c中添加中断服务函数,添加的函数就是刚刚main函数屏蔽的内容。
注意,这里采用时候if判断语句,这里其实是有隐患的,如果一次数据大于1500字节,也就是说需要IP分片就是丢包,IP分片内容请看文章《IP协议详解》。
我们将if修改成while即可。
测试结果,使用ping命令测试
PC端使用TCP客户端工具测试STM32建立的TCPsever。
05Keil工程的修改
主要是修改工程配置,代码修改参考上述IAR修改过程即可。
修改芯片类型
修改调试工具,ST官方代码当然使用STlink了,我使用Jlink。
使用Jlink的SWD模式。
06移植TCP客户机代码
上文我们修改了TCPSever的demo,在很多情况STM32作为TCP客户端连接服务器,下面我们将TCP客户端代码移植到刚才修改好的TCPSever工程中。为了体验一下,在移植好LWIP的基础上,如果要实现TCP客户端,需要哪些函数接口。
TCP客户端demo代码在ST官方库中位置。
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,进行测试:
ping测试
在PC端使用网络调试助手新建TCP服务器,进行客户端测试,有新的客户端上线。
为将接收到的数据返回PC,我们在tcp_echoclient_recv函数中加入以下代码
收到的数据成功返回
本文简单进行了LWIP的初体验,并没有太多技术含量,按照这个方法可以验证新硬件是否正常,如果上述测试全部通过,说明硬件是没有问题。