2014
年
5
月
DocID025731 Rev 1 1/44
UM1713
用户手册
使用
LwIP TCP/IP
栈,在
STM32Cube
上开发应用
前言
STM32F4x7/9xx
和
STM32F2x7xx
微控制器配有高质量
10/100 Mbit/s
以太网外设,支持媒
体独立接口 (
MII
)和缩减的媒体独立接口 (
RMII
),以便与物理层 (
PHY
)接口。
当使用以太网通信接口时,会使用
TCP/IP
软件协议栈以实现局域网或者广域网中的通信。
本用户手册说明了怎样使用
STM32CubeF2
和
STM32CubeF4 HAL
驱动程序,将一个免费中
间件
TCP/IP
栈分别集成到基于
STM32F2x7xx
和
STM32F4x7/9xx
微控制器的嵌入式应用
(请参考
第
1
章节
以获得
STM32Cube
的详细信息)。该中间件
TCP/IP
栈为
LwIP
(轻量级
IP
),专为嵌入式应用开发的开源协议栈。
对于每款评估 板,此包都包含了九个运行于
LwIP
栈之上的应用:
•
基于
Raw API
,运行于独立模式 (没有
RTOS
)的应用:
– Web
服务器
– TFTP
服务器
– TCP
回响客户端应用
– TCP
回响服务器应用
– UDP
回响客户端应用
– UDP
回响服务器应用
•
运行于
FreeRTOS
操作系统的应用:
–
基于
netconn API
的
Web
服务器
–
基于
socket API
的
Web
服务器
–
基于
netconn API
的
TCP/UDP
回响服务器应用。
注
:
在本文中,
STM32Cube
™
指的是
STM32CubeF2
和
STM32CubeF4
,
STM32F4xx
指的是
STM32F4x7xx
和
STM32F4x9xx
微控制器,
STM322xx-EVAL
和
STM324xx-EVAL
指的是
STM3221x-EVAL
、
STM324xG-EVAL
和
STM324x9I-EVAL
评估板。
本文提供的截屏和文件名对应的是运行于
STM32F4
微控制器上的应用样例。然而,它们也
适用于
STM32F2x7xx
。
www.st.com
目录
2/44 DocID025731 Rev 1
目录
1 STM32Cube™
概述
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 LwIP TCP/IP
栈描述
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1
栈特性
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2
授权
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 LwIP
架构
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 LwIP
栈的目录组织
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 LwIP API
概述
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.1 Raw API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.2 Netconn API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5.3 Socket API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6 LwIP
缓冲管理
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6.1
包缓冲结构
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6.2 pbuf
管理
API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 LwIP
与
STM32Cube
以太网
HAL
驱动之间的接口
. . . . . . . . . . . . . . . . . 15
4 LwIP
配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1
模块支持
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2
存储器配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5
使用
LwIP
栈开发应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1
使用
Raw API
在独立模式中开发
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1.1
工作模型
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1.2 TCP
回响服务器演示举例
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2
使用
Netconn
或
Socket API
基于
RTOS
开发
. . . . . . . . . . . . . . . . . . . . . 23
5.2.1
工作模型
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.2.2
使用
Netconn API
的
TCP
回响服务器演示举例
. . . . . . . . . . . . . . . . . . . 24
6 LwIP
包描述
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.1 LwIP
包目录
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2
应用设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2.1 PHY
接口配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
DocID025731 Rev 1 3/44
目录
3
6.2.2 MAC
和
IP
地址设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2.3
固件特性
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3
评估板设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3.1 STM324x9I-EVAL
设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3.2 STM324xG-EVAL
设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3.3 STM3222xG-EVAL
设置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7
使用
LwIP
应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.1
入门级应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.1.1 TCP
回响客户端
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.1.2 TCP
回响服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.1.3 UDP
回响客户端
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.1.4 UDP
回响服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.1.5
基于
netconn API
的
UDP TCP
回响服务器
. . . . . . . . . . . . . . . . . . . . . . 34
7.2
特性级应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.2.1
基于
raw API
的
Web
服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.2.2
基于
netconn API
的
Web
服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.2.3
基于
socket API
的
Web
服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.3
集成级应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.3.1 TFTP
服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
8
结论
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
附录
A FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
A.1
我怎样选择静态或动态 (
DHCP
)
IP
地址分配?
. . . . . . . . . . . . . . . . . . . 42
A.2
当以太网网线断开时,应用如何处理?
. . . . . . . . . . . . . . . . . . . . . . . . . . . 42
A.3
怎样将应用移植到不同的硬件上?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
9
修订历史
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
表格索引
4/44 DocID025731 Rev 1
表格索引
表
1. TCP Raw API
函数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
表
2. UDP Raw API
函数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
表
3. Netconn API
函数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
表
4. Socket API
函数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
表
5. Pbuf API
函数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
表
6.
以太网接口函数说明
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
表
7. LwIP
内存配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
表
8. STM324x9I-EVAL
跳线配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
表
9. STM324xG-EVAL
跳线配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
表
10. STM322xG-EVAL
跳线配置
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
表
11. LwIP
应用分类
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
表
12.
文档修订历史
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
DocID025731 Rev 1 5/44
图片索引
5
图片索引
图
1. STM32Cube
框图
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
图
2. LwIP
架构
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
图
3.
图
2 LwIP
目录结构
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
图
4. Pbuf
结构
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
图
5.
独立工作模型
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
图
6.
使用
RTOS
时的
lwIP
工作模型
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
图
7. TCP
回响客户端
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
图
8. TCP
回响服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
图
9. UDP
回响客户端
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
图
10. UDP
回响服务器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
图
11. Web
服务器主页
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
图
12. HTTP
服务器中的
SSI
使用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
图
13.
任务页面的
Web
服务器列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
图
14. TFTP
工具 (
tftpd32
)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
STM32Cube™
概述
6/44 DocID025731 Rev 1
1 STM32Cube™
概述
STM32Cube
™
计划源自意法半导体,旨在通过减少开发的工作量、时间与成本,使开发者受
益。
STM32Cube
涵盖
STM32
产品组合。
STM32Cube 1.x
版包括:
•
图形软件配置工具
STM32CubeMX
,可通过图形向导生成初始化
C
代码。
•
针对每个系列提供综合的嵌入式软件平台 (例如
STM32CubeF2
用于
STM32F2
系列,
STM32CubeF4
用于
STM32F4
系列)
– STM32
抽象层嵌入式软件
STM32Cube HAL
,确保在
STM32
各个产品之间实现
最大限度的可移植性
–
一套一致的中间件,比如
RTOS
、
USB
、
TCP/IP
、图形
–
所有嵌入式软件实用工具均配备一套完整的示例。
图
1. STM32Cube
框图
DocID025731 Rev 1 7/44
LwIP TCP/IP
栈描述
43
2 LwIP TCP/IP
栈描述
2.1
栈特性
LwIP
为免费
TCP/IP
栈,由
Adam Dunkels
在瑞典计算机科学院 (
SICS
)开发,由修正的
BSD
许可授权。
LwIP TCP/IP
实现的侧重点为在全面保持
TCP/IP
栈的同时,尽可能的减少
RAM
的使用。这
使得
LwIP
特别适合在嵌入式系统中使用。
LwIP
具有下列协议:
•
IPv4
和
IPv6
(网际协议
v4
和
v6
)
•
ICMP
(互联网控制消息协议),用于网络维护和调试
•
IGMP
(互联网组管理协议),用于多播流量的管理
•
UDP
(用户数据报协议)
•
TCP
(传输控制协议)
•
DNS
(域名服务器)
•
SNMP
(简单网络管理协议)
•
DHCP
(动态主机配置协议)
•
PPP
(点到点协议)
•
ARP
(地址解析协议)
LwIP
具有三种应用编程接口 (
API
):
•
Raw API
为原始的
LwIP API
。它通过事件回调机制进行应用开发。该
API
提供了最好的
性能和优化的代码长度,但增加了应用开发的复杂性。
•
Netconn API
为高层有序
API
,需要实时操作系统 (
RTOS
)的支持 (提供进程间通讯
的方法)。
Netconn API
支持多线程工作。
•
BSD Socket API
:类似
Berkeley
的套接字
API
(开发于
Netconn API
之上)
LwIP
栈的源代码可从
http://savannah.nongnu.org
下载。
2.2
授权
LwIP
由
BSD
许可证完成。下面是
LwIP
授权文档副本,它也包括在源代码中:
/*
*
瑞典计算机科学院版权所有 (
c
)
2001-2004
。
*
保留所有权利。
*
*
若要以源代码或二进制形式对其或使用,不管修改与否,
*
都必须满足下述条件:
*
* 1.
对源代码重新发布时必须保留以上版权说明、
*
此条件列表及下述免责声明。
LwIP TCP/IP
栈描述
8/44 DocID025731 Rev 1
* 2.
以二进制形式重新发布时必须将以上版权说明、
*
此条件列表及下述免责声明复制到文档
*
和
/
或其它一同发布的材料中。