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

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

[复制链接]
netlhx 发布时间:2015-8-30 11:39
本帖最后由 netlhx 于 2015-8-30 11:44 编辑
* d! R; r% r  a9 k) d
1 C5 C; \; ]4 u6 i  I, EETH折腾得最久,足足两个星期,终于搞清楚了一点皮毛。
& N, p' x) X# Q% ]
) x- j4 B7 u  D% Q# @主要原因,一是LWIP结构有点复杂,看例程及源码足足一个星期,算是简单入门。毕竟这个牵涉到网络结构。二是顺带看了一下HTTP的通信过程,什么GET, POST等数据通信方法,现在还是迷迷糊糊的。不过程序总算跑起来了,再慢慢研究。
2 h5 A% x) X# v3 W
6 _( E# ^* `+ n& U$ L下面先说几点体会,供菜鸟们一起学习参考,老鸟们请路过并指导!" o% b" {  W$ Y9 b* u' {8 X5 ~

# K' \$ v+ X) f2 k- I$ c1 关于IEEE的七层网络模型,这个要了解一下,大致了解通信过程。重点是TCP/IP的四层模型。这些知识会具体体现在LWIP提供的各API中。8 n2 |; k& z; {7 r7 X
2 LWIP提供了几种类型的API,一种是所谓的RAW API,就是原生的TCP/IP通信,这种通信效率最高,写起来也最难,我是直接不管它。二是NETCONN模型,通过对RAW API进行封装,API更抽象,用起来相对简单;但是这个需要RTOS的支持,所以其副作用就是需要额外的了解RTOS,好在前面也花了一段时间研究FREERTOS。第三种就是BSD类型的API,这种类型的API使用SOCKET来进行网络通信,适合那些曾经接触过SOCKET编程的老鸟们,再慢慢研究吧。
2 ^( g- w: y2 I2 t* ^+ b3 底层驱动,也就是所谓的ETHERNETIF,这个就是以太网接口。它是上层的IP与底层的硬件之间的接口,也就是通常意义上的网卡驱动。这个过程包括GPIO初始化,ETH控制器及PHY的初始化。F7-DISCO使用的是内置的ETH控制器,外置的PHY接口。这个地方坑爹的地方在于,我们要设置PHY的地址,这个值为0,但我查看原理图的时候硬是没找着。一直按的是1来初始化,结果是导致了DHCP不能获取到正确的IP地址。这一个地方就折腾了3天!
" e+ x0 {9 u0 v* Z& E& y4 如果要自动获取IP地址的话,还需要了解一下DHCP的原理及初始化过程,这里需要注意的地方就是通过全局的NETIF中的DHCP变量来查看初始化过程中的返回状态,直到得到DHCP_BOUND的返回值。才表明正确得到了DHCP IP地址。! _5 r1 s) k9 [1 q
5 关于调试,建议初学者不要打开LWIP自带的DEBUG输出功能,否则你会被那些输出信息淹死的。就算要开,也是一个一个的打开。充分利用串口输出来查看代码的执行情况,效果也许会更好。
" l- l! k0 e3 X3 p% ^5 ~7 a. T4 _
- H3 C8 K9 {/ G! q' l% L上面都是自己的一点个人体会,也许老鸟们会有更好的做法,欢迎指出。
' G* ?9 {; w+ r3 V
7 W  |- V; E! V# p) R一、生成LWIP代码框架. ]2 [' I7 b8 w* R; P
由于LWIP结构有点复杂,建议新手们还是使用STM32CUBEMX来生成框架,需要注意的是,要想得到更好的性能,对于LWIP中的一些内存大小的分配要仔细考虑,只是刚开始的时候,这个度也不是很好把握,慢慢来吧。
+ Y' v! w) e& F4 z8 Q) H2 z. i$ X6 R: d
我使用的是NETCONN API,所以还要启用FREERTOS的支持,如果使用其它的RTOS,需要调整一些相应的代码。0 l& m: r# E* ^# |0 F* S
% b: m" K( J0 z6 d
二、代码简单分析
5 F5 H/ e. d! I  O8 v' H' I3 W8 e0 m7 c
正如TCP/IP分层模型一样,LWIP也将代码结构按层次组织,简单点来说,工程里面将代码按层次分为LWIP层及底层的ETHETNET层来处理。LWIP实现TCP/IP通信,ETHERNETIF实现物理层通信。这里特别要注意的是数据链路层实际被分开为数据链路层LL及MAC子层,但LL层被划分到了LWIP里,而MAC则是在ETHERNETIF层。
2 r" L' U. w8 U2 o! c  B" U  _7 u( b+ \8 f
下面是初始化框架
$ [( G0 G: n4 d2 V) F
5 j  _9 F3 b" m; } QQ截图20150830112404.png 5 L5 ?; A5 ~; ~! V  L- N

% w8 v9 g4 ]6 Z: d: T" \: _1 Netif_add函数的倒数两个参数,这两个参数是两个函数,分别负责ETHERNET的初始化和输入数据的处理。
. x* }) j5 v8 l8 f- |2 dhcp_start负责获取IP地址,需要一个DHCP服务器,使用一个与电脑相连的DHCP服务器即可。4 V5 m1 l5 q+ M
, `6 X. B; W3 H' A
如果配置正确的话,应该可以获取到正确的IP地址。: `! Y5 C5 D  y$ c# |9 E6 F
) W' o2 c0 y3 M1 o" Y% H) N+ {
QQ截图20150830112813.png
* w1 s/ {1 |7 K: ^0 ^7 a. @
* b; K3 s* z# Z% yHTTP服务器配置
  g& U+ H, W% V- w. x9 k# x  i$ Z4 {$ t9 S; |
打开LWIP源代码的CONTRIB目录下的APPS,里面有一个示例代码,如果使用的是FREERTOS的话,基本不需要修改就可以照用了,如果使用其它的RTOS,需要修改LWIP里的sys_arch.c文件里的实现,这实际上就是在实现LWIP的移植!
" p; y+ p) w% y6 W; q& y! j
/ B+ @( L( F+ p& ]/ ~ QQ截图20150830112952.png
+ [3 F6 E1 n5 N$ _. b实际上这里就是把HTTP服务器以一个任务的形式实现,代码如下
- ~+ Z1 n7 j5 F
1 u2 M* Z. k2 \8 O% E* w" z* V QQ截图20150830113538.png
, x, U! r3 [- S( u
% @9 f% D. o* F' v
& ^3 E# e' {5 ^) P, ~6 l( Y运行的效果- N: o; ?6 u5 x! I! L4 {- [* _

: v% M0 p! X3 i( C7 j% [) G QQ截图20150830113608.png
1 A+ j' o2 l( A3 w
8 B3 ^9 |# }4 `0 b; e: o: C  a. H4 t9 [" B  ?0 ~) h, s
虽然代码跑起来了,还有很多事情要做,接下来准备做一个WEB控制界面,来实现通过WEB控制一些简单外设如LED灯的控制。+ e: ~. G# w- {3 K

7 q# S9 V: o( m* t0 Q* O最后再说一句,新手学习LWIP的话,最好先拿一个例程开刀,把它吃透了,也就弄明白了。虽然这个过程不是一下就能搞清楚的,中间肯定要查找很多的资料,但物有所值啊!还有一点,网络模型这个东西不要太陷进去了,免得到时出不来,够用就行了!" r* `9 t; T" q5 N, H6 o0 `1 l0 O

, f; ]) Z/ U7 n3 _! B+ N) T" c1 A' ^$ U6 X% K- v& W1 g

( ?; b$ V2 E$ Z# P
, n3 D! y0 K7 x

评分

参与人数 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; x# v" {! p% R! B/ S. `( U  g
不错,这快就把lwip移植好了,前两天还在研究的。。。。

4 q9 W" w/ w. F+ x+ O一起研究,我了解一点皮毛而已
netlhx 回答时间:2015-8-31 15:52:01
JackieLaura 发表于 2015-8-31 11:02
; N" ^; X9 n9 @4 |不错,这快就把lwip移植好了,前两天还在研究的。。。。

$ r  ]! S8 m) L+ O$ x一起研究,我了解一点皮毛而已
风子 回答时间:2015-8-30 13:09:00
楼主又出新教程,顶
netlhx 回答时间:2015-8-30 13:16:46
风子 发表于 2015-8-30 13:09$ ?1 Y6 c; M/ g8 W7 b: z8 L  }! _
楼主又出新教程,顶

0 Z' D3 ^; F0 v8 V% r汗,这不是教程,写给自己看的笔记
netlhx 回答时间:2015-8-30 13:16:49
风子 发表于 2015-8-30 13:09
4 e" H, Y9 \- p楼主又出新教程,顶
/ p1 m: {3 V- M+ `
汗,这不是教程,写给自己看的笔记
风子 回答时间:2015-8-30 13:45:08
netlhx 发表于 2015-8-30 13:16
  t* L" b! A9 V3 k汗,这不是教程,写给自己看的笔记

9 g% ?( y% M5 K+ }* a/ C+ B2 b( ?哈哈,差不多啦
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+ Q+ u$ d* q% I$ v2 ?
这个网页是用啥编辑的

( T+ k/ X9 P2 q8 l8 }/ g0 N直接HTML,
netlhx 回答时间:2015-8-31 15:53:14
党国特派员 发表于 2015-8-31 15:50
4 t9 Y/ W% d, Y# `有钱淫,我们做朋友吧

8 d1 M0 Y: R% R; ^) P! a做个朋友吧,壕
netlhx 回答时间:2015-8-31 15:54:27
苏柚 发表于 2015-8-31 09:18
" k- Q/ n$ h. j- f3 Y笔记也相当于半个教程的
3 \4 y6 l* f5 h/ V; ~1 N
嗯,确实
bleukey 回答时间:2015-8-31 16:17:35
这个以后要用到,mark下
JackieLaura 回答时间:2015-9-1 12:02:10
netlhx 发表于 2015-8-31 15:52' Y) u+ G. X2 ^7 H* p; m9 f( Z" t
一起研究,我了解一点皮毛而已
7 k4 C: n, ]4 J1 o6 i' H3 S
还没有研究过呢,也要去研究研究,以后备用。。
stmcu.org.png
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版