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

F7-DISCO笔记之五:ETH及简单的HTTP服务器  

[复制链接]
netlhx 发布时间:2015-8-30 11:39
本帖最后由 netlhx 于 2015-8-30 11:44 编辑 ( t' n% w7 l- |7 L1 s
: C: N% n# E9 H
ETH折腾得最久,足足两个星期,终于搞清楚了一点皮毛。% C+ U' b, G6 J  [: {  e* X$ t/ D

1 {6 Y  H  ]9 ?主要原因,一是LWIP结构有点复杂,看例程及源码足足一个星期,算是简单入门。毕竟这个牵涉到网络结构。二是顺带看了一下HTTP的通信过程,什么GET, POST等数据通信方法,现在还是迷迷糊糊的。不过程序总算跑起来了,再慢慢研究。, [. ]% p3 ~5 [- n  `% C; q
1 W  _6 h  y& y6 U
下面先说几点体会,供菜鸟们一起学习参考,老鸟们请路过并指导!5 e0 G+ m% @0 p
3 K, k( p9 h& u0 G
1 关于IEEE的七层网络模型,这个要了解一下,大致了解通信过程。重点是TCP/IP的四层模型。这些知识会具体体现在LWIP提供的各API中。
) R2 ?: @" G! @3 N: ~: G' ?0 i2 LWIP提供了几种类型的API,一种是所谓的RAW API,就是原生的TCP/IP通信,这种通信效率最高,写起来也最难,我是直接不管它。二是NETCONN模型,通过对RAW API进行封装,API更抽象,用起来相对简单;但是这个需要RTOS的支持,所以其副作用就是需要额外的了解RTOS,好在前面也花了一段时间研究FREERTOS。第三种就是BSD类型的API,这种类型的API使用SOCKET来进行网络通信,适合那些曾经接触过SOCKET编程的老鸟们,再慢慢研究吧。
+ e' U' {& v9 s' `/ E3 底层驱动,也就是所谓的ETHERNETIF,这个就是以太网接口。它是上层的IP与底层的硬件之间的接口,也就是通常意义上的网卡驱动。这个过程包括GPIO初始化,ETH控制器及PHY的初始化。F7-DISCO使用的是内置的ETH控制器,外置的PHY接口。这个地方坑爹的地方在于,我们要设置PHY的地址,这个值为0,但我查看原理图的时候硬是没找着。一直按的是1来初始化,结果是导致了DHCP不能获取到正确的IP地址。这一个地方就折腾了3天!+ R% l* v+ r: ^1 f; q
4 如果要自动获取IP地址的话,还需要了解一下DHCP的原理及初始化过程,这里需要注意的地方就是通过全局的NETIF中的DHCP变量来查看初始化过程中的返回状态,直到得到DHCP_BOUND的返回值。才表明正确得到了DHCP IP地址。
. s' W3 u1 R) Y# H3 r0 a1 Y4 L5 关于调试,建议初学者不要打开LWIP自带的DEBUG输出功能,否则你会被那些输出信息淹死的。就算要开,也是一个一个的打开。充分利用串口输出来查看代码的执行情况,效果也许会更好。
1 h. L4 K9 N' m8 W3 l* U( V' k
上面都是自己的一点个人体会,也许老鸟们会有更好的做法,欢迎指出。: J/ ]# L1 a$ v9 o
- W& W1 {( [  ^( b' D/ |5 H: S
一、生成LWIP代码框架
$ [/ I) O  l2 f0 Y0 Q) K6 ]$ O由于LWIP结构有点复杂,建议新手们还是使用STM32CUBEMX来生成框架,需要注意的是,要想得到更好的性能,对于LWIP中的一些内存大小的分配要仔细考虑,只是刚开始的时候,这个度也不是很好把握,慢慢来吧。+ o) ~+ A$ d4 ]8 \! d" Z

* V0 X; u" L5 V5 Z3 ]* R9 h/ }  A我使用的是NETCONN API,所以还要启用FREERTOS的支持,如果使用其它的RTOS,需要调整一些相应的代码。+ r# W% Y$ e0 Z( g! H/ f* E
3 N9 q# [; n. M' B" N$ |7 E
二、代码简单分析$ L& y0 F7 e' I' p1 D' p  G

( }; X8 G: ?* {% H2 o正如TCP/IP分层模型一样,LWIP也将代码结构按层次组织,简单点来说,工程里面将代码按层次分为LWIP层及底层的ETHETNET层来处理。LWIP实现TCP/IP通信,ETHERNETIF实现物理层通信。这里特别要注意的是数据链路层实际被分开为数据链路层LL及MAC子层,但LL层被划分到了LWIP里,而MAC则是在ETHERNETIF层。4 K; U# e' t/ `  ]
. m4 X0 z  ~5 t; U/ ]* H
下面是初始化框架  f- D  \7 F- S* i
8 Y& W( Z2 g9 E/ f# j& `' `
QQ截图20150830112404.png
6 ?+ a3 R& b: n7 l
( v9 W- v! w5 Y9 v" Q. U! x: x8 h1 Netif_add函数的倒数两个参数,这两个参数是两个函数,分别负责ETHERNET的初始化和输入数据的处理。
* w$ _4 l: t; _7 F2 dhcp_start负责获取IP地址,需要一个DHCP服务器,使用一个与电脑相连的DHCP服务器即可。
! b7 V' O2 M3 U  @1 P* T7 A. L1 [5 u2 A5 M/ T6 [
如果配置正确的话,应该可以获取到正确的IP地址。
/ U" F" D" ~) K" Z0 z3 b
7 f3 r1 |, s/ L4 L8 p4 z' Z. } QQ截图20150830112813.png
, g0 ?9 O9 F, ?5 G( V) U6 `% x; c& |9 Y+ ?3 I0 r: G; d
HTTP服务器配置- }. S% Z+ v: [3 C; N6 P* j

2 j' ~1 s! {9 H打开LWIP源代码的CONTRIB目录下的APPS,里面有一个示例代码,如果使用的是FREERTOS的话,基本不需要修改就可以照用了,如果使用其它的RTOS,需要修改LWIP里的sys_arch.c文件里的实现,这实际上就是在实现LWIP的移植!8 d: m5 f' N' R. N' s% I& ^) _
# J2 o& ?* U# t( u
QQ截图20150830112952.png ' o6 n9 l. B1 q8 j( ?- T3 w& p
实际上这里就是把HTTP服务器以一个任务的形式实现,代码如下
$ U7 _8 n2 O/ Y! n+ [- v7 y; l+ U' o7 e4 p, c% _7 h" E
QQ截图20150830113538.png
7 W( D% n: l" |
. ]% Y- P7 U4 W4 T
# n7 X: H0 ^6 s5 D/ O; w/ w8 d运行的效果
! p) k9 }5 x) L  [  A
$ i1 M! y) u( P/ t6 X- A& l% h QQ截图20150830113608.png 3 L$ `, e3 L& ?2 f! c

" N  d5 D( p* w' }: _7 [# b6 F" i. Z5 v. [
虽然代码跑起来了,还有很多事情要做,接下来准备做一个WEB控制界面,来实现通过WEB控制一些简单外设如LED灯的控制。
& |0 N3 Y4 @# M( m% h* Y% k& ~+ \! R: j9 G' @! @& }
最后再说一句,新手学习LWIP的话,最好先拿一个例程开刀,把它吃透了,也就弄明白了。虽然这个过程不是一下就能搞清楚的,中间肯定要查找很多的资料,但物有所值啊!还有一点,网络模型这个东西不要太陷进去了,免得到时出不来,够用就行了!
$ R1 [9 ~, q+ R" Y; z6 L# }
: f% X( J, A. p7 D2 w  l4 t! W
3 J) K. M' a5 o: [) x+ m$ ?0 d; w, D: }) o# x% e
3 I. S6 H3 B3 R* f( a, r

评分

参与人数 1 ST金币 +30 收起 理由
沐紫 + 30

查看全部评分

赞 收藏 6 评论27 发布时间:2015-8-30 11:39

举报

27个回答
DLGG-308046 回答时间:2016-5-30 17:14:10
楼主您用cubeMX生成的工程是带DHCP的吗?我不带DHCP和带的都不会,能发个您的工程学习一下吗?我也用F7discovery
netlhx 回答时间:2015-8-31 15:52:10
JackieLaura 发表于 2015-8-31 11:02
9 P/ b" a5 I) X3 x. F! P7 E; Y不错,这快就把lwip移植好了,前两天还在研究的。。。。
2 v0 e' ]& X/ J( o2 E5 U8 r
一起研究,我了解一点皮毛而已
netlhx 回答时间:2015-8-31 15:52:01
JackieLaura 发表于 2015-8-31 11:029 n, A$ B' |2 ^/ L+ i
不错,这快就把lwip移植好了,前两天还在研究的。。。。
5 ?8 }1 O7 q* c7 K. \" i
一起研究,我了解一点皮毛而已
风子 回答时间:2015-8-30 13:09:00
楼主又出新教程,顶
netlhx 回答时间:2015-8-30 13:16:46
风子 发表于 2015-8-30 13:09
6 V  g0 P2 _* Y" p- ^% }& G- n, q8 r楼主又出新教程,顶
# C5 S' _' N1 i* h
汗,这不是教程,写给自己看的笔记
netlhx 回答时间:2015-8-30 13:16:49
风子 发表于 2015-8-30 13:09
+ |, [' t# A. B# g6 N1 n8 m楼主又出新教程,顶
5 ^+ m7 r% B# [
汗,这不是教程,写给自己看的笔记
风子 回答时间:2015-8-30 13:45:08
netlhx 发表于 2015-8-30 13:16
& Q- J; {9 C+ }汗,这不是教程,写给自己看的笔记
: \+ u- ?# N2 d6 e
哈哈,差不多啦
JackieLaura 回答时间:2015-8-31 11:02:00
不错,这快就把lwip移植好了,前两天还在研究的。。。。
stmcu.org.png
shanji 回答时间:2015-8-31 15:28:20
这个网页是用啥编辑的
党国特派员 回答时间:2015-8-31 15:50:49
有钱淫,我们做朋友吧
netlhx 回答时间:2015-8-31 15:52:57
shanji 发表于 2015-8-31 15:28
) @; @2 m; D0 p- V0 s; ?5 v0 H0 K这个网页是用啥编辑的
3 S9 z! e& t, C
直接HTML,
netlhx 回答时间:2015-8-31 15:53:14
党国特派员 发表于 2015-8-31 15:50
4 {3 w9 \1 h- I$ z- x: P有钱淫,我们做朋友吧
% N- [$ t/ j6 X
做个朋友吧,壕
netlhx 回答时间:2015-8-31 15:54:27
苏柚 发表于 2015-8-31 09:18
, I2 e: ~' P4 c; Q; U+ c$ I/ n" e笔记也相当于半个教程的

& U! J' V* C: [$ p0 L& D# ?# W) O嗯,确实
bleukey 回答时间:2015-8-31 16:17:35
这个以后要用到,mark下
JackieLaura 回答时间:2015-9-1 12:02:10
netlhx 发表于 2015-8-31 15:52' J1 M9 z5 X0 U: M$ z4 l  O: y% ?
一起研究,我了解一点皮毛而已
% [5 L! r% V+ a# V# b/ T* H
还没有研究过呢,也要去研究研究,以后备用。。
stmcu.org.png
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版