你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】从零开始使用 CubeMX 创建以太网工程  

[复制链接]
zero99 发布时间:2016-12-19 13:28
前言
) i6 {) i, l, ^6 y" L在前面一篇文章中,介绍了如何使用CubeMX来建立一个简单的TCPEchoserver工程。但是在新建CubeMX项目时,是通过直接选择ST的开发板的方式实现的。对于大多数实际的开发场景,可能并不是在ST的开发板上进行的,所以在这篇文章中,我将介绍如何从零开始建立一个以太网工程。
4 h9 a3 Y. C) F9 `) |" M今年ST推出的Nucleo-144板子上集成了以太网接口,所以在本文中,将以STM32F746-Nucelo板为例,通过CubeMXv4.18来新建一个TCPEchoserver的程序。
1 U0 |$ F" O( h% R0 ?) y7 b

. g5 z8 P7 F6 P2 U/ u; N  \
用CubeMX建立基于STM32F746-Nucleo的工程
. d- P+ {6 L* c: d4 t  t7 _用CubeMX进行初始化配置
' @& S8 G6 b9 R( |: {这回我们直接选择STM32F746-Nucleo板上对应的芯片STM32F746ZGT6U,而不是选择STM32F746-Nucleo板。
1 n8 O! ]: c9 U) W- ?1. 新建一个Project,在向导中选择STM32F746ZGT6U。
31.jpg - g; k7 v& Y2 m6 x: ]- W+ i
这个时候我们看到的还是一个空的工程。如下图:
32.jpg 3 B# n9 @) T7 [8 A* T' U" K
2.外设使能,引脚配置$ c7 O& ~6 |  n4 y5 J: ~7 `
2.1以太网外设引脚配置
- m3 Z' e1 o7 D- FNucleo-144板上用的PHY LAN8742A,RMII接口。在Cubemx中使能ETH外设,选择RMII接口。Cubemx会自动配置对应的以太网接口。如下图:
33.jpg ' a: C  r5 x4 f8 b7 y, O/ E! X
STM32的很多引脚都有复用功能,同一个功能也可以remap到不同的引脚。所以这里要记得将CubeMX自动配置的引脚和实际电路中使用的引脚进行对比,保证是一致的。: H# M9 l8 L# |0 K7 ~
从UM1974中可以找到Nucleo-144板上以太网引脚分配表。对比这张表格和CubeMX的默认配置,会发现PB11,PB12引脚在STM32F746-Nucleo板中没有用做以太网的接口,而是用作其他用途了。) `; i% K2 l3 D7 d, B& e, F
STM32F746-Nucleo上的引脚分配:
34.jpg
9 e8 R$ t' a+ NCubeMX的默认分配:
35.jpg # |* A4 x) d; ]( ]+ S* s6 h
在Cubemx中修改引脚配置:
修改方法见下图,用同样的方法配置PG11和PG13。配置PG11和PG13后,对应PB11和PB12会自动清除之前的配置,以免冲突。
36.jpg
/ A5 e; D# f6 H) a到现在位置,已经将所有的GPIO口都配置好了。
8 X8 m( R/ }7 i; l在Configuration页面中,还可以看到所有配置的GPIO。并可以做进一步的配置,这里就先用默认的设置。
37.jpg
5 q3 r- ^: @' i2 U) g3 d- g2.2使能LwIP协议栈
' B& u# ^6 K5 u7 t3 t在这个工程内,我们会用到LwIP协议栈,所以还需要在这一页的Middlewares部分将LWIP勾选上。之后就可以在Configuration页面对LWIP协议栈进行配置了。
38.jpg $ Z# E1 Z6 F( ^' H" h* g' q! M4 L4 F
3 M' w9 O7 X0 z6 K9 Q2 c: ^7 ]; X
3.时钟配置
. V5 {! c& L4 w2 X接下来进行时钟配置。CubeMX默认系统时钟16MHz,但以太网外设需要至少25MHz的系统时钟,所以这里会看到Clock Configuration页面显示
38.1.jpg % N  P5 _( Z$ p6 o' p) u
打开Clock Configuration页面会自动跳出一个提示框,可以选择让CubeMX来帮你自动调整时钟配置,也可以自己手动进行调整。这里,我选择让CubeMX自动配置,CubeMX会自动将时钟配成216MHz。
39.jpg
# n' m7 ?* I" @( P# K: [2 k4. 配置以太网参数

. V8 ?( [- D( m- l( Y+ t, _' v在Parameter Settings页面,可以配置MAC地址,PHY的地址,是否进行自动协商等。9 q& U  Q+ ?; }- s7 ?  F
这里,我们设置了MAC地址为本地地址02 :00 :0 :00 :00 :00。LAN8742a的PHY地址由上电时PHYAD0的状态决定。根据STM32F746-Nucleo板的原理图,设置PHY地址为0。
5 c' @( B1 q8 B, [8 c
41.jpg ) [% Y! r5 U, l. f: q, P; {
接收数据的模式有轮询和中断两种方式,中断方式需要和操作系统一起使用,这里我们没有使用任何操作系统,所以在RX Mode这一项只能选择Polling Mode。$ N( @2 l8 g" ?, O$ ~$ J
最后一项是”TX IP Header Checksum Computation”,STM32的MAC控制器可以在发送数据时自动添加IP数据报的checksum,如果需要这项功能,就将这一项设置为“By hardware”1 c8 t1 X! A( ~1 p7 [
在Advanced Parameters页,可以根据所用的PHY修改寄存器的地址和一些MASK的设置。因为STM32F746的两款开发板上用的都是PHY LAN8742A,所以CubeMX中默认的配置是以LAN8742A为例进行设置的。所以这里,我们不需要做任何修改就可以直接用。但如果是其他的PHY,可以在PHY这一项选择“user PHY”,然后根据所用PHY的数据手册,配置下面的参数,对于部分无法通过CubeMX进行配置的参数,需要手动的修改代码。将有冲突的地方删除,或者添加某个功能。
8 o. ]$ [- \+ w6 C- l" [4 m* cAdvanced Parameters页分为三个部分:2 [6 E6 n1 }' i4 x. D( ]8 W% D7 V& ?* [
· External PHY Configuration 。复位延时,读/写超时的参数设置
, F% T; N6 U6 x8 S6 a; ?! }· Common :External PHY Configuration。PHY的基础寄存器配置,这部分寄存器对于大部分PHY都是相同或类似的。
# m1 ^) h6 N. s+ H$ H1 |· Extended :External PHY Configuration。 PHY的扩展寄存器配置,这部分对于每个PHY都是不一样的。如果是使用非CubeMX默认的PHY,这部分内容需要特别注意。
42.jpg
8 ?- L9 H. y; _% V9 K. ?4. 修改LWIP的参数
: U" F; {. d# ?/ x; J8 Q7 ?- C# h% ~配置好以太网的参数后,点击OK,回到CubeMX的配置界面。选择LWIP继续进行参数配置。
43.jpg
% z7 a9 q8 x( I' H- @4 W0 B2 Y' t$ f首先是GeneralSettings页面,在这里我们可以看到LWIP的版本号。配置IP地址信息,可以选择通过DHCP的方式动态分配IP,也可以分配一个静态的IP地址。这里,我们选择配置静态的IP地址192.168.0.10,子网掩码255.255.255.0,网关192.168.0.1。ICMP协议打开,因为我们用的是TCP协议,所以把UDP协议关掉。
0 g0 c* Y4 O2 M2 [+ j2 Y不用担心不知道每项参数是做什么用的,选择每一项参数后都会在窗口的底部显示该项参数的解释。
44.png , x3 t' L1 Q' R5 y8 ]% K
在Key Options这一页里,有更多的参数可以配置。关于接收/发送内存的配置也是在这里。选择右上方的“Show Advanced Parameters”后,还有更多的参数配置项。这里,我们也可以不做修改,使用默认值。CubeMX中每个参数项的名称和代码中的名称相同,这样也方便了在代码中进行查找。
45.jpg
/ ^/ V5 \3 c" H; c, {到此为止,我们在CubeMX中需要做的配置就全部完成了。选择Project——>Generate Code,生成初始的工程。
46.jpg

) v8 K( ]5 r9 V" N$ g/ B添加用户代码
0 g; Z: f1 V$ w, p8 L. V用IAR打开前面已经生成好的工程。我们还需要两步就可以完成一个简单的TCP EchoServer程序了。
5 R& m4 B4 A) V1.新建tcp_echoserver.c文件,在tcp_echoserver.c里要做下面这几件事情:
" V  \/ p$ j+ @1)新建一个tcp_echoserver_pcb(调用tcp_new函数);
. m+ ?1 f" w7 n2 v6 t# H3 v2)将新建的tcp_echoserver_pcb与要监听的端口绑定(调用tcp_bind函数); l  g% O7 V; k- p2 I7 n8 K" R
3)转成监听状态(调用tcp_listen函数)! o2 M( s4 I% W, w: q$ u
4)注册回调函数tcp_echoserver_accept,当有新连接建立后会调用该函数(调用tcp_accept函数)
  t" M4 n  r% I, _* m5)注册回调函数tcp_echoserver_recv,当该连接接收到数据后会调用该函数(调用tcp_recv函数)8 {2 K' K4 `- c
6)完成tcp_echoserver_recv函数,在该函数内,将收到的数据再发出去。
# N( r4 k% j9 S8 w% A. g+ ^; U需要注意,本文的目的是示例如何用CubeMX建立一个简单的TCP EchoServer程序,所以考虑的都是最基本简单的情况。比如,在回发数据部分,我们假设Client发来的数据都在一个Pbuf的大小以内。
9 w3 d$ Z( l3 o* T完成tcp_echoserver.c后,将其加入到工程项目中。
47.png

! q2 o$ @+ f0 {2. 在main函数中添加tcp_echoserver_init(),在while(1)中添加MX_LWIP_Process()查询接收数据。记得要将代码加在/*USER CODE BEGIN*/和/*USER CODE END*/之间,这样才不会在下次用CubeMX生成代码时被覆盖掉。
48.jpg 3 j" F$ E/ _7 D+ v! q& W
一个简单的TCP Echoserver程序就完成了。

* G7 @) B% ?7 i3 V2 }# n- ~测试结果# o" G% N6 _) T& B
我们来看一看ping测试和TCP测试工具的结果, C, E7 y( y1 m4 [
1. 通过电脑(192.168.0.11)ping STM32F746-Nucleo板(192.168.0.10)
49.jpg
. Z6 `& P1 @0 n! F+ E4 ~( u% K2.通过TCP测试工具模拟客户端,向STM32F746-Nucleo板发一串数据。
50.jpg ) k8 p7 D9 K9 z5 t

; M4 u" i6 z  l: D, F4 B7 V; X) i6 u5 z+ g% x
% y* E+ [, I, T0 T7 r. f/ y0 _& l/ L
测试结果说明我们刚刚建立的TCP EchoServer程序已经能正常工作了。
3 X1 P# m0 j( }! _! N8 ^

' ?) \* }& \- [% Y. E
STM32CubeMX下载地址:
STM8CubeMX下载地址:
9 x) r* H( s+ x% P: r( K- z
  d: o% G. S; J  Z* p4 p

+ l4 t& o9 J  A" }) ]! \8 ]

5 g# j, q5 ~  D3 {1 M! v

评分

参与人数 1 ST金币 +1 收起 理由
sqmonkey-139632 + 1 赞一个!

查看全部评分

1 收藏 11 评论26 发布时间:2016-12-19 13:28

举报

26个回答
群星闪烁 回答时间:2017-7-22 17:33:54
抱歉,问题解决掉了,按照您上面的步骤生成的代码是没有问题的,至于PHY的寄存器偏移值及MASK,在此次这样配置下是无所谓的,用默认值即可。这些寄存器的值是用于检测连接参数及连接状态的,此次没有用到这些功能。
% }& G9 B( [7 Q0 r之前的问题,是我没有配置PD3,这儿引脚为PHY的引脚复位,现在一切正常。谢谢

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5 谢谢支持

查看全部评分

群星闪烁 回答时间:2017-7-22 12:39:19
您好楼主,根据您的这个帖子及近期的以太网培训,在学习以太网。用您上面的步骤发现在现在的cubemx版本V4.21.0中有一些配置页面不同,我用的是原子的F407的板子,PHY是LAN8720A,比对LAN8742A与LAN8720A两者的数据手册,发现寄存器是完全兼容的,按照上面的流程配置CUBEMX生成工程后,能得到IP地址,但是无法PING通。且CUBEMX 在PHY status register Offset 中有错误,数据手册上的寄存器偏移值为31,但是Cubemx给出的是0X10,且掩码也错误。 QQ截图20170722123726.png 6 S7 n7 f! U, ]$ w- q5 }+ D4 ]
而且 Rx mode  只能选择 Polling mode  不能选择中断,原子的例子里面是采用中断的。5 Y+ _7 |" _8 d! z, j
想请问下我是什么地方没注意?或者最新Cubemx哪里需要配置?  谢谢
8 Z7 v# G$ H4 v5 `0 k
sqmonkey-139632 回答时间:2017-12-27 16:06:26
我用的F207,PHY用的RTL8201BL,MII接口,按照楼主的顺序一直弄下来,只发现PHY的100MLED灯亮了,ping不通。想问下,这种方式是不是不需要自己去修改定时器相关的代码了,LWIP在MX的配置下就应该把相关的定时器配置好了吧。
8 s* k; `+ e/ |  Z6 m1 v9 i" h/ S6 i7 M4 \# Q
另外,楼主所用的PHY和我用的在寄存器上没啥大的区别,因为在PHY configuration配置界面里面,能改的寄存器就是0x00,0x01,0x10,其他参数不是寄存器相关的吧?所以这个配置界面里面只有PHY地址不一样,我的地址是0X1F,其他都一样,但就是ping不通。
2 [% \) H* _3 C) w3 N% R% u$ v7 l# a. o
麻烦楼主指点一二啊。
jackten 回答时间:2016-12-19 14:38:35
谢谢分享                                 
Paderboy 回答时间:2016-12-19 15:26:23
学习。。学习;;;
霹雳之火 回答时间:2016-12-19 16:31:04
cubeMX配置功能真的好强大
datouren 回答时间:2017-2-15 10:10:02
不赖  不赖
netlhx 回答时间:2017-6-8 19:23:53
小破出品,必属精品!
斜阳 回答时间:2017-6-8 19:24:30
我来学习lwip了
epochal 回答时间:2017-6-9 07:17:08
学习学习,谢谢版主!
队长shiwo 回答时间:2017-7-20 09:36:41
破总,有LAN8742A手册的吗
zero99 回答时间:2017-7-20 18:01:59
队长shiwo 发表于 2017-7-20 09:36
& `7 i0 V8 x) G) F4 @$ `! G破总,有LAN8742A手册的吗
- Q% ]  `( x$ a% w/ |) D7 i
是ST MCU吗  怎么没听过
zero99 回答时间:2017-7-20 18:02:24
netlhx 发表于 2017-6-8 19:23
- R9 M- m7 M( K2 O* _1 ~7 ?小破出品,必属精品!

' v: Z9 U% T: |; E9 n" n4 E岂敢岂敢,特别是在N神面前
队长shiwo 回答时间:2017-7-20 20:25:03
zero99 发表于 2017-7-20 18:01: c: x6 v1 I' A& `$ l  J
是ST MCU吗  怎么没听过
% U/ c; @6 e1 @3 L8 z
不是,是stm32nucleo板的PHY,我搜到的都是微芯的,不知道是不是,IC上的丝印不是微芯的商标的
epochal 回答时间:2017-7-20 20:37:42
学习了!
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版