LWIP初体验-修改ST官方demo

网络 网络管理
STM32的网络应用还是个复杂的外设的,拿到一个板子需要验证网络部分是否正常,硬件设计是否有问题,对于很熟悉LWIP的同学可以直接移植LWIP,验证硬件。但快速且方便的办法是修改ST的官方demo来验证硬件。

[[388412]]

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

 

责任编辑:姜华 来源: 知晓编程
相关推荐

2009-03-09 15:12:39

XenServer安装

2009-08-01 09:06:35

UbuntuOneLinux开源操作系统

2023-07-15 08:01:38

2011-05-30 15:12:10

App Invento 初体验

2010-11-22 10:31:17

Sencha touc

2011-09-15 15:03:10

2010-12-13 11:39:39

2011-08-02 10:26:59

iOS 多线程 线程

2009-11-30 10:09:02

谷歌Chrome OS

2011-11-01 10:30:36

Node.js

2013-06-08 10:15:29

Outlook 201Outlook 201

2023-07-17 08:34:03

RocketMQ消息初体验

2011-09-05 10:20:21

Sencha ToucAPP

2013-05-28 10:22:03

2017-09-05 05:55:24

AWS ES集群大数据

2009-07-21 13:08:08

iBATIS DAO

2010-05-13 21:03:42

Office 2010

2011-06-07 17:35:39

iphone 多线程

2012-06-15 09:47:48

Objective-CCategory

2011-06-20 14:58:53

QT BasicExcel
点赞
收藏

51CTO技术栈公众号