OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21946|回复: 15

STM32F407+DP83848+LWIP 移植步骤

[复制链接]

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-2-10
在线时间
10 小时
发表于 2015-7-4 10:57:47 | 显示全部楼层 |阅读模式

修改官方udp_echo_client演示代码步骤:

本文作者:武汉普创科技--易宇--转载请注明出处

本人的项目配置:STM32F407VET6 + DP83848C
前段时间做项目用到百兆网通信,用到了LWIP,一开始是参照原子的例程做移植,因为原子的例程中使用的是LAN8720,为了改成83848,改寄存器地址,改位定义,改速度计算公式,折腾了好多天也没成功,最后
只好听从网友的建议,修改ST官方的一个例程,几天下来,竟然成功了,现在将步骤分享给大家,感觉实际工程中用83848的还是大多数..其实本文并不是移植LWIP,只是将ST官方的例程改成我们项目所需要的,
然后我们再在这个基础上完成自己的项目即可,这对新接触LWIP又急着做项目的人比较适合,没必要去了解LWIP的具体实现,会用就行了..

1、从官方网站http://www.stmcu.org/document/list/index/category-523下载STSW-STM32070  面向STM32F4x7微控制器的LwIP TCP/IP协议栈的演示代码 的英文文档DM00036052.pdf和软件包stsw-stm32070.zip。stsw-stm32070.zip是面向STM32F4x7微控制器的LwIP TCP/IP协议栈的基于官方EVAL开发板的演示代码,显然,我们直接修改这个演示代码要比我们去移植LWIP简单得多。DM00036052.pdf是演示代码的说明文档。

2、将stsw-stm32070.zip解压得到STM32F4x7_ETH_LwIP_V1.1.0文件夹,下面是STM32F4x7_ETH_LwIP_V1.1.0文件夹架构

3删除_htmresc文件夹,这个文件夹是STCMSIS公司logo,没什么用。

4、打开project文件夹,这个文件夹包括两个文件夹:FreeRTOSStandalone

FreeRTOS文件夹里的程序示例是基于FreeRTOS系统的LWIP移植示例,这里我们不需要,直接删除。

Standalone文件夹里是一些无操作系统LWIP移植示例程序,在这里我们工程需要的是普通的数据传输,所以只使用到UDP,所以我们只保留udp_echo_client文件夹,其他的都删除掉。在udp_echo_client文件夹中EWARM文件夹是IAR EWARM建立的工程,MDK-ARMkeil MDK建立的工程。在这里我们选择MDK工程,IAR建立的工程可以保留也可以删除。还有一个文件夹RIDE,打开看了看,应该是用另一款编译软件建立的工程空间,这里我们不需要,直接删除。

5Utilities->Third_Party文件夹下面有三个文件夹FatFs_vR0、FreeRTOSV7.3 、lwip-1.4.1。FatFs_vR0一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统,FreeRTOSV7.3一个迷你操作系统内核的小型嵌入式系统,在这里我们都用不上,直接删除。lwip-1.4.1文件夹是LWIP源码,是我们所需要的。

6打开MDK-ARM文件夹里面的MDK工程,我们先编译一下,可以看到有0个错误,三个警告,其中两个警告是定义了变量但是没有使用,我们不去管它,另一个警告是..\..\..\..\Utilities\Third_Party\lwip-1.4.1\port\STM32F4x7\Standalone

\ethernetif.c(366): warning:  #1-D: last line of file ends without a newline 提示ethernetif.c文件的最后一行(也就是366行)没有换行,MDK里面每个文件的最后一行必须换行,不然会提示一个警告,这里366行后面换行再编译,这个警告就消失了。

7、打开 main.h 文件,因为我们电路板上使用的是RMII接口,所以将#define MII_MOD注释掉,将//#define RMII_MODE取消注释,如下图所示:

在这里要注意RMII的时钟为50MHz,在电路板上直接焊接一个50MHz的有源晶振就可以了。

取消//#define USE_DHCP的注释,启用动态地址分配,当地址分配不成功则使用静态IP地址。如图:

注释掉或删除 USE_LCDserial_debug,本项目没有用到这两项,如下图:

    本项目中直接删除掉,因为删除掉了SERIAL_DEBUG,所以我们可以将serial_debug.c文件从项目中移除。

点击红色的叉号删除serial_debug.c,然后点击OK就可以了。

将GroupsSTM324xG_EVAL中的stm324x7i_eval.cstm324x7i_eval_lcd.c删除,将MDK_ARM中的启动文件startup_stm32f427x.s删除,将Project Targets分栏中的项目名STM324x7I_EVAL删除,将STM324xG_EVAL中的stm324xg_eval_lcd.c删除,这都是和本项目无关的东西。这时候编译会提示错误,我们将stm32f4x7_eth_bsp.h文件里关于包含LCD函数的头文件删除,如下图。


将stm32f4x7_eth_bsp.c文件里面关于LCD的部分删除掉,如下图,将这些行删除。

将netconf.c141-148行关于LCD的函数删掉

    /* Set the LCD Text Color */

    LCD_SetTextColor(Red);


    /* Display message on the LCD */

    LCD_DisplayStringLine(Line5, (uint8_t*)"  Network Cable is  ");

    LCD_DisplayStringLine(Line6, (uint8_t*)"    not connected   ");


    /* Set the LCD Text Color */

    LCD_SetTextColor(White);

再编译就没有问题了。

8、按电路图修改时钟,修改 stm32f4xx.h中宏定义标识符HSE_VALUE 的值为我们的外部时钟20MHz

 

设置主 PLL 时钟在 System_stm32f4xx.c 文件开头的地方配置

 

 

所以我们的主 PLL 时钟为:
    LL = 20MHz * N/ (M*P) = 20MHz* 336 /(20*2) = 168MHz

SystemInit()函数中设置的系统时钟大小:
SYSCLK(系统时钟)                =  168MHz
AHB   总线时钟 (HCLK=SYSCLK)      =  168MHz
APB1  总线时钟 (PCLK1=SYSCLK/4)   =  42MHz
APB2  总线时钟 (PCLK2=SYSCLK/2)   =  84MHz
PLL    主时钟                     =  168MHz

9、这个例程默认的是STM324xG_EVAL开发板,它使用的主芯片是STM32F407IG,而我们项目所使用的主芯片是STM32F407VE,要更改芯片配置。

点击弹出如下窗口

选择 Device 将下面的主芯片改为

10、下面我们进入main.c函数看一下程序:

首先的注释是说明系统时钟已经配置完成,如果修改的话可以参考第8条。接下来就是配置中断优先级分组NVIC_PriorityGroupConfig,这个很重要,只要定义了中断,就必须配置中断优先级分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。这里分配的是组44位抢占优先级, 0位响应优先级。

接下来的是条件编译和LCD初始化,在前面我们已经删除SERIAL_DEBUG 串口调试和LCD头文件,这里我们直接将这段程序删除。如下图,将这几行代码删除掉。

删除mian.c下面关于LCD的信息:

 

删除128行以后的所有数据

打开stm324xg_eval.h,注释掉第39#include "stm32_eval_legacy.h",这个头文件是关于开发板上LCD及按键的声明,本项目中没有用到LCD和按键。

    打开stm32f4x7_eth_bsp.c文件,删除关于LCD的一些程序,删除447行至472行的程序和485行到495行的程序,这里的程序是在LCD屏上显示一些语句及本机的IP。删除如下图所示程序。

打开netconf.c文件,删除关于LCD的程序,删除第219223行程序,删除239255行程序,删除274290行程序。这是关于LCD显示分配动态IP的信息的程序。

11、下面是stm32f4x7_eth_bsp.c ; 配置以太网 (GPIOs, clocks, MAC, DMA),对于GPIO的配置,我们选用的是RMII接口,而且芯片是STM32F407VE,STM324xG_EVAL开发板上有些引脚定义有些差别,所以我们要对网口的GPIO接口修改:

修改结果如上图所示 , 注意以太网配置那段注释里面,双斜线的是我们RMII没有用到的引脚,还有就是要PG11/PG13/PG14修改为PB11/PB12/PB13

12、接下来就是修改关于LED和按键的程序了,删除netconf.c里面第179行、第234行和252,有些行数可能不对,但代码不会变,找到相应代码并修改

stm324xg_eval.c文件除了#include "stm324xg_eval.h"其他全部删除,如图所示

stm324xg_eval.h文件除了下图所示程序其他全部删除:

我们项目电路板上所用到的功能就可以在这两个文件夹定义和声明了。

13、在官方UDP客户端这个例程中是利用按键中断来发送数据包的,本人开发的项目是当收到下位机的数据后就将数据转发给PC,所以在这里用不到按键中断。之前我们删除了LCD_LED_BUTTON_Init();这个函数,这个函数就是配置LEDLCD以及按键初始化及按键中断的函数。所以在这里这个按键中断已经没有作用了,我们可以将UDP客户端发送数据包的函数直接复制到主函数中,然后将按键中断函数清空。按键中断函数在stm32f4xx_it.c函数中,如下图,将udp_echoclient_connect();复制到主函数中以便使用,等我们改写主函数时会用到这个函数。这个函数是基于EVAL开发板写的一个数据收发函数,我们自己实现收发功能都可以参照这个函数来写 复制完之后直接将这个中断函数内容清空就可以了。在main.c中还要添加udp_echoclient_connect()函数所在文件对应的头文件#include "udp_echoclient.h"。


14、至此,编译下载,修改电脑IP,连接我们的板子,因为是板子和电脑直接连接而不使用路由器,所以DHCP不会成功,会使用我们分配的静态IP,在main.h里面。这时候应该就可以ping通了,说明LWIP已经运行在我们的板子上了,之后我们就可以参照udp_echoclient_connect()实现我们想要的功能,具体的大家就可以自己去分析了……

关于LWIP的接口函数使用,大家可以参考周立功的<<LWIP接口与编程指南>>,对一般应用足够了,在百度文库上有免费下载,附件会贴上来

LwIP编程指南.pdf

755.8 KB, 下载次数: 2085

STM32还是有搞头的..
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-2-10
在线时间
10 小时
 楼主| 发表于 2015-7-4 11:04:14 | 显示全部楼层
STM32还是有搞头的..
回复 支持 反对

使用道具 举报

16

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-5-4
在线时间
2 小时
发表于 2015-8-19 14:25:43 | 显示全部楼层

大师 能否把你的程序贴过来看看 谢谢!

回复 支持 反对

使用道具 举报

16

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-5-4
在线时间
2 小时
发表于 2015-8-19 14:26:08 | 显示全部楼层
上面的图片全部都看不到,麻烦了
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-2-10
在线时间
10 小时
 楼主| 发表于 2015-8-19 14:41:23 | 显示全部楼层
http://wenku.baidu.com/view/893d349a6c175f0e7dd1373e
在这里
STM32还是有搞头的..
回复 支持 反对

使用道具 举报

16

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-5-4
在线时间
2 小时
发表于 2015-8-25 18:40:13 | 显示全部楼层
回复【5楼】sharon:
---------------------------------
回复【5楼】sharon:
---------------------------------
谢谢 谢谢阿
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-7-13
在线时间
15 小时
发表于 2015-8-27 08:57:22 | 显示全部楼层
回复【2楼】sharon:
---------------------------------
求代码共享
工业4.0的节奏
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2012-10-4
在线时间
2 小时
发表于 2015-11-12 23:00:18 | 显示全部楼层
很久后,路过 谢谢 分享;~~

多多思考,再接再厉
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-17
在线时间
12 小时
发表于 2015-11-22 13:32:42 | 显示全部楼层
回复【5楼】sharon:
---------------------------------
您好,能不能加您个qq啊最近在搞STM32F407VGT6+dp83848按您说的修改后,初始化过不了,搞了两个星期了,是在没办法了,能不能帮小弟分析一下,qq502142105
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-9-18
在线时间
29 小时
发表于 2015-12-3 09:05:55 | 显示全部楼层
正在按文中的步骤尝试,还没加UCOSIII,暂时还很顺利,感谢楼主分享!
回复 支持 反对

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2015-12-4 13:51:03 | 显示全部楼层
多谢分享,已经为前辈的百度文库添加两积分。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复 支持 反对

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2016-3-4
在线时间
35 小时
发表于 2016-4-20 10:52:18 | 显示全部楼层
求助啊,按照上述方法改了之后,请问怎么样才能实现回送程序,就是将本地接收到的UDP数据原样返回给原主机????
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2014-8-15
在线时间
89 小时
发表于 2016-5-10 12:19:19 | 显示全部楼层
。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-7-6 20:42:31 | 显示全部楼层
很久后的参考者。我的项目是使用B50610外部PHY,试了好久不通,可以接受广播包,不知道大师能不能指点一二
回复 支持 反对

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2016-9-14 21:48:07 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-2-10
在线时间
10 小时
 楼主| 发表于 2017-4-9 20:51:39 | 显示全部楼层
时隔两年又看到此贴,能帮到大家,非常高兴
STM32还是有搞头的..
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表