LWIP初体验-修改ST官方demo

01、硬件说明

为什么要写这篇文章?STM32的网络应用还是个复杂的外设的,拿到一个板子需要验证网络部分是否正常,硬件设计是否有问题,对于很熟悉LWIP的同学可以直接移植LWIP,验证硬件。但快速且方便的办法是修改ST的官方demo来验证硬件。(ST提供了CubeMX工具,如果使用该工具的话,也很方便,不在本文的考虑范围内)。

本文的硬件测试环境

  1. 主控:STM32F207VCT6,100管脚的封装

  2. 网络PHY芯片:RTL8201EL,48管脚封装,34和35管脚下拉,也就是芯片地址:0

  3. 使用的网络接口: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.2、屏蔽无用的东西和修改IP

在main.h中,屏蔽USE_LCD宏定义,官方开发板使用了LCD,这里我们不使用。

图片

修改IP地址(以本机IP地址为准,修改一个和自己PC在同一网段的空闲IP),再修改网关。

图片

2.3、屏蔽其他代码

在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。

图片

 

05、Keil工程的修改

主要是修改工程配置,代码修改参考上述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的初体验,并没有太多技术含量,按照这个方法可以验证新硬件是否正常,如果上述测试全部通过,说明硬件是没有问题。

 

点击查看本文所在的专辑,STM32F207网络开发

posted @ 2021-04-21 22:24  Fireflycjd  阅读(574)  评论(0编辑  收藏  举报