前言
|
|
测试环境为Keil 5.20 && STM32F407ZET6 && FreeRtos 10.0.0 && Lwip 2.0.3 && DP83848;晶振频率为8Mhz。
请根据实际情况修改后进行测试。
原创,转载请注明出处。
介绍
主要介绍Lwip 2.0.3 的移植过程。
作者对Lwip的认识一点也不深刻,只能简单的记录移植过程中主要的修改位置。方便其他需要使用此协议栈的小伙伴。
在移植开始之前需要下载Lwip最新源码包,以及STM32官方提供的基于STM32F407 && FreeRTOS && lwip 1.4.1 && DP83848 的例程源码。
获取方式如下:
1、Lwip 直接百度,下载需要的版本。
2、百度STSW—STM32070,下载此源码包。
FIRST
将上述两个源码包解压。
Lwip目录下主要包括doc、src、test
三个文件夹,以及一些其他文件(不重要)。所有源文件都在src
文件夹下。
可以直接将lwip整个文件夹直接放到工程目录下。
然后是ST官方的移植例程。
解压后在目录:STM32F4x7_ETH_LwIP_V1.1.1\Libraries
下,请把STM32F4x7_ETH_Driver
文件夹移到工程相关目录下。
然后在STM32F4x7_ETH_Driver\inc
目录下存在stm32f4x7_eth.h
和stm32f4x7_eth_conf_template.h
两个文件,打开stm32f4x7_eth.h
可以看到有包含头文件#include "stm32f4x7_eth_conf.h"
,此处我选择直接将另一个.h文件直接重命名为stm32f4x7_eth_conf.h
。
此时目录下存在stm32f4x7_eth.h
和stm32f4x7_eth_conf.h
两个文件。
对stm32f4x7_eth_conf.h
文件进行如下修改:
|
|
SECOND
在工程目录下的lwip文件夹下创建arch
文件夹,用来存放其他文件。
ST官方例程目录STM32F4x7_ETH_LwIP_V1.1.1\Utilities\Third_Party\lwip-1.4.1\port
下,是针对于f4x7系列写的相关程序(具体作用还未详细了解)。
接下来把部分源文件复制到新建的arch
文件夹中,因为使用了FreeRTOS系统,所以需要注意选择FreeRTOS
目录下的文件:
1、把STM32F4x7_ETH_LwIP_V1.1.1\Utilities\Third_Party\lwip-1.4.1\port\STM32F4x7\arch
目录下cc.h cpu.h perf.h
三个文件。
2、把STM32F4x7_ETH_LwIP_V1.1.1\Utilities\Third_Party\lwip-1.4.1\port\STM32F4x7\FreeRTOS
目录下全部四个文件。
3、把STM32F4x7_ETH_LwIP_V1.1.1\Project\FreeRTOS\httpserver_socketi\inc
目录下lwipopts.h
一个文件。
总共8个文件复制到新建arch
目录下。
还需要将目录STM32F4x7_ETH_LwIP_V1.1.1\Project\FreeRTOS\httpserver_socket\src
下stm32f4x7_eth_bsp.c
以及目录STM32F4x7_ETH_LwIP_V1.1.1\Project\FreeRTOS\httpserver_socket\inc
下stm32f4x7_eth_bsp.h
复制到工程相关目录下。作如下修改:
|
|
THIRD
按下图将文件相应文件添加到工程中(这里需要注意:源文件ethernetif.c
、sys_arch.c
在前面创建的文件夹arch
下):
此时如果进行编译的话,会出现较多警告和错误,下面进行一一处理(情况不一定完全一样,这里解决我出现的现象):
|
|
FOURTH
理论上应该没有什么编译警告和错误了。
然后因为ST官方例程中使用的网络的DMA进行收发控制,所以还需构造网络中断函数,实际上在例程的stm32f4xx_it.c
文件中有。为了不进行信号量的外部声明,我把中断函数直接放到了ethernetif.c
中。
|
|
FIFTH
到此整个工程文件移植完成,接下来构造进行初始化函数。如下:
把network_init()
添加到初始化中去。进行调测。
可以通过ping IP 地址简单验证网络是否连通。然后在建立TCP SERVER,可以用SecureCRT连接,验证数据收发。
NOTICE
1、我在调试过程中,出现了初始化一切正常,但ping IP 地址始终ping不通。后来调试发现初始化过程中有bug:
在`stm32f4x7_eth.c`文件`ETH_Init`函数中,以下代码
|
|
函数 ETH_ReadPHYRegister(PHYAddress, PHY_BSR)前几次获取的值为0x0000ffff,导致此处初始化通过,实际该值并不正确(可以通过打印该值看现象)。
所以我把此处修改为(总共有三处,只修改可第一处位置):
|
|
但此处还存在一个bug,就是如果网线未插,这一直会停在此处,所以请务必注意,进行优化处理。