TCP/IP 只有四个分层,分别为应用层、传输层、网络层以及网络访问层(物理层)
实际上,还有一个 TCP/IP 混合模型,分为五个层。它实际与 TCP/IP四层模型是相通的,只是把网络访问层拆成数据链路层和物理层。这种分层方法对我们学习理解更容易。
在 TCP/IP 混合参考模型中,数据链路层又被分为 LLC 层 (逻辑链路层) 和 MAC 层 (媒体介质访问层)。
目前,对于普通的接入网络终端的设备,LLC 层和 MAC 层是软、硬件的分界线。
如 PC的网卡主要负责实现参考模型中的 MAC 子层和物理层;在 PC 的软件系统中则有一套庞大程序
实现了 LLC 层及以上的所有网络层次的协议。
LLC 层:
处理传输错误;调节数据流,协调收发数据双方速度,防止发送方发送得太快而接收方丢失数据。主要使用数据链路协议。
网络层:
本层也被称为 IP 层。LLC 层负责把数据从线的一端传输到另一端,但很多时候不同的设备位于不同的网络中 (并不是简单的网线的两头)。此时就需要网络层来解决子网路由拓扑问
传输层:
由网络层处理好了网络传输的路径问题后,端到端的路径就建立起来了。传输层就负责处理端到端的通讯。在这一层中主要有 TCP、UDP 协议
应用层:
经过前面三层的处理,通讯完全建立。应用层可以通过调用传输层的接口来编写特定的应用程序。而 TCP/IP 协议一般也会包含一些简单的应用程序如 Telnet 远程登录、FTP 文件传输、SMTP 邮件传输协议。
实际上,在发送数据时,经过网络协议栈的每一层,都会给来自上层的数据添加上一个数据包的头,再传递给下一层。
在接收方收到数据时,一层层地把所在层的数据包的头去掉,向上层递交数据
以太网 (Ethernet) 是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。
以太网是指遵守 IEEE 802.3 标准组成的局域网,由 IEEE802.3 标准规定的主要是位于参考模型的
物理层 (PHY) 和数据链路层中的介质访问控制子层 (MAC)。
MAC 子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送
数据,发送的数据是否正确,对数据流进行控制等。
发送时候:它自动对来自上层的数据包加上一些控制信号,交给物理层。
接受时候:接收方得到正常数据时,自动去除 MAC 控制信号,把该数据包交给上层。
数据包中的 DA 是目标地址,SA 是源地址。
网卡:TCP/IP中的数据链路层中的MAC层与物理层(PHY)
如果该值被设置大于 0x0600(1536),不用于长度描述,而是用于类型描述功能,表示与以太网帧相关的 MAC 客户端协议的种类。
数据段
数据段是 MAC 包的核心内容,它包含的数据来自 MAC 的上层。其长度可以从0~1500 字节间变化。
填充域
由于协议要求整个 MAC 数据包的长度至少为 64 字节 (接收到的数据包如果少于64 字节会被认为发生冲突,数据包被自动丢弃),当数据段的字节少于 46 字节时,在填充域会自动填上无效数据,以使数据包符合长度要求。
校验和域
MAC 数据包的尾部是校验和域,它保存了 CRC 校验序列,用于检错。MSb
单播 MAC 地址是指第一个字节的最低位是 0 的 MAC 地址。
组播 MAC 地址是指第一个字节的最低位是 1 的 MAC 地址(第40位bit)。
广播 MAC 地址是指每个比特都是 1 的 MAC 地址。广播 MAC 地址是组播 MAC 地址的一个特例。
在物理层,由 IEEE 802.3 标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检
测机制,物理层一般是通过一个 PHY 芯片实现其功能的。
传输介质
传输介质包括同轴电缆、双绞线 (水晶头网线是一种双绞线)、光纤。根据不同的传输速度和距离要
求,基于这三类介质的信号线又衍生出很多不同的种类,超五类网线
六类网线等
传输速度
100MBPS、10MPS、1GBPS
编码方式
为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置,在传输信号
时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码,在 100BASE-T 中则采
用 4B/5B 编码。
a. 曼彻斯特编码把每一个二进制位的周期分为两个间隔,在表示“1”时,以前半个周期为高电平,
后半个周期为低电平。
采用曼彻斯特码在每个位周期都有电压变化,便于同步。但这样的编码方式效率太低,只有 50%。
b. 在 100BASE-T 采用的 4B/5B 编码是把待发送数据位流的每 4 位分为一组,以特定的 5 位编码来
表示,这些特定的 5 位编码能使数据流有足够多的跳变,达到同步的目的,而且效率也从曼彻斯
特编码的 50% 提高到了 80%。
如果多个节点同时利用同一条总线发送数据,则会产生冲突,总线上的节点可通过接收到的信号与
原始发送的信号的比较检测是否存在冲突,若存在冲突则停止发送数据,随机等待一段时间再重
传。
现在大多数局域网组建的时候很少采用总线型网络,大多是一个设备接入到一个独立的路由或交换机接口,组成星型网络,不会产生冲突。但为了兼容,新出的产品还是带有冲突检测机制。
STM32F42x 系列控制器内部集成了一个以太网外设,它实际是一个通过 DMA 控制器进行介质访问控制 (MAC),它的功能就是实现 MAC 层的任务。
借助以太网外设,STM32F42x 控制器可以通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。ETH 内部自带专用的 DMA控制器用于 MAC
ETH 支持两个工业标准接口介质独立接口 (MII) 和简化介质独立接口 (RMII)用于与外部 PHY 芯片连接。MII 和 RMII 接口用于 MAC 数据包传输
ETH 还集成了站管理接口(SMI) 接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器
ETH 有专用的 DMA 控制器,它通过 AHB 主从接口与内核和存储器相连,AHB 主接口用于控制数据传输,而 AHB 从接口用于访问STM32以太网外设“控制与状态寄存器”(CSR) 空间。
数据收发
SMI 是 MAC 内核访问 PHY 寄存器标志接口,它由两根线组成,数据线 MDIO 和时钟线 MDC。
SMI 支持访问 32 个 PHY
PHY 芯片内部一般都有 32 个 16 位的寄存器,用于配置 PHY 芯片属性、工作环境、状态指示等
MAC 内核就是通过 SMI 向 PHY 的寄存器写入数据或从 PHY 寄存器读取 PHY 状态,一次只能对一个 PHY 的其中一个寄存器进行访问。SMI 最大通信频率为 2.5MHz
SMI 是通过数据帧方式与 PHY 通信的
数据帧格式如下:
SMI写时序图
SMI读时序图
SMI时钟来源与时钟频率选择
以太网 MAC MII 地址寄存器 (ETH_MACMIIAR)的CR:时钟范围 (Clock range)位
介质独立接口 (MII) 用于连接 MAC 控制器和 PHY 芯片,提供数据传输路径。RMII 接口是 MII 接口的简化版本,
MII 需要 16 根通信线,RMII 只需 7 根通信,在功能上是相同的。
TX_CLK:数据发送时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时为25MHz。RMII 接口没有该线。
RX_CLK:数据接收时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时为25MHz。RMII 接口没有该线。
TX_EN:数据发送使能。在整个数据发送过程保存有效电平。
TXD[3:0] 或 TXD[1:0]:数据发送数据线。对于 MII 有 4 位,RMII 只有 2 位。只有在 TX_EN处于有效电平数据线才有效。
CRS:载波侦听信号,由 PHY 芯片负责驱动,当发送或接收介质处于非空闲状态时使能该信号。在全双工模式该信号线无效。
COL:冲突检测信号,由 PHY 芯片负责驱动,检测到介质上存在冲突后该线被使能,并且保持至冲突解除。在全双工模式该信号线无效。
RXD[3:0] 或 RXD[1:0]:数据接收数据线,由 PHY 芯片负责驱动。对于 MII 有 4 位,RMII只有 2 位。在 MII 模式,当 RX_DV 禁止、RX_ER 使能时,特定的 RXD[3:0] 值用于传输来自 PHY 的特定信息。
RX_DV:接收数据有效信号,功能类似 TX_EN,只不过用于数据接收,由 PHY 芯片负责驱动。对于 RMII 接口,是把 CRS 和 RX_DV 整合成 CRS_DV 信号线,当介质处于不同状态时会自切换该信号状态。
RX_ER:接收错误信号线,由 PHY 驱动,向 MAC 控制器报告在帧某处检测到错误。
REF_CLK:仅用于 RMII 接口,由外部时钟源提供 50MHz 参考时钟。
MII和RMII的时钟源
因为要达到 100Mbit/s 传输速度,MII 和 RMII 数据线数量不同,使用 MII 和 RMII 在时钟线的设计是完全不同的。
对于 MII 接口,一般是外部为 PHY 提供 25MHz 时钟源,再由 PHY 提供 TX_CLK 和 RX_CLK 时钟。
对于 RMII 接口,一般需要外部直接提供 50MHz 时钟源,同时接入 MAC 和 PHY。
MII/RMII 选择
使用 SYSCFG_PMC 寄存器中的配置位 23 MII_RMII_SEL 选择 MII 或 RMII 模式。
以太网控 制器处于复位模式或使能时钟前,应用程序必须设置 MII/RMII 模式。
MAC 数据帧发送全部由 DMA 控制,从系统存储器(RAM中)读取的以太网帧由 DMA 推入 FIFO,ETH 外设自动填充完成 MAC 数据包封装,然后将帧弹出并传输到 MAC 内核。
检测到 SOF (开始传输帧命令)时,MAC 接受数据并开始向 MII 发送。
检测到EOF(完成传输帧) 传输到 MAC 内核后,内核将完成正常的发送,然后将发送 的状态返回给 DMA。
以太网数据帧是先存在DMA FIFO中,检测到SOF事件后,将数据弹到MAC内核中,MAC内核通过MII/RMII接口将数据传输到PHY芯片,传输结束后,产生EOF事件,MAC内核通知DMA,注意:该DMA为以太网内部专用的DMA
何时产生SOF事件呢?
SOF事件来源有2个种方式,(向 MAC 内核弹出数据有两种操作模式):
DMA -FIFO手动清空,复位FIFO指针
可通过将 FTF 位(ETH_DMAOMR 寄存器 [20])置 1 来清空发送 FIFO 的所有内容。 此位自行清零,并将 FIFO 指针初始化为默认状态。如果向 MAC 内核传输帧时将 FTF 位置 1,则传输将停止,因为此时 FIFO 被视为空。
自动 CRC 和 pad 生成功能
以太网数据帧有最短长度要求,当传输的数据小于该要求则需要补足
当从应用程序接收的字节数少于 60(DA+SA+LT+数据)时,会向发送帧附加零,使数据长 度正好为 46 字节
对于半双工模式下发送以太网数据帧:
当请求发送新的帧时,MAC 将发送报头和 SFD,紧接着发送数据,如果在开始传输帧到 CRC 字段结束之间的任何时间发生冲突(冲突检测窗口为512位时间),MAC 将在 MII 上发送 0x5555 5555 的 32 位阻塞信号,如果在报头发送 阶段发生冲突,MAC 将完成报头和 SFD 的发送,然后发送阻塞信号。。阻塞信号生成仅适用于半双工模式,不适用于全双工模式。
系统使用一个 jabber 定时器,用于在传输的字节超过 2048 字节(默认值)时切断以太网帧 的发送。以太网数据帧有最短和最长数据帧长度要求
可以控制2个以太网数据帧发送之间的间隔
两个 发送帧之间的空闲期段,即配置的帧间隔(ETH_MACCR 寄存器中的 IFG 位)
发送流量控制(发送控制)
在全双工模式下,当发送流量控制使能位(ETH_MACFCR 中的 TFE 位)置 1 时,MAC 将 生成暂停帧并根据需要发送暂停帧。暂停帧:通知发送方停止发送数据,全双工模式下,假如接收FIFO满了,则发送暂停帧
可以通过 两种方式启动暂停帧的生成。
生成的帧中的暂停时间值为 ETH_MACFCR 中编程的 暂停时间值。
单数据包发送操作
发送操作的常规事件序列如下:
发送操作––缓冲区中有两个数据帧(发一个数据帧的同时,从AHB主接口接收下一个数据帧)
由于 DMA 必须先更新描述符状态才能将其释放给主机,因此一个发送 FIFO 内最多只能 有两个帧。仅当 OSF(对第二个帧起作用)位置 1 时,DMA 才会获取第二个帧并将其 置于 FIFO 中。
冲突期间的重新发送(仅在半双工模式下该功能有效)
在半双工模式下,向 MAC 传输帧时,可能在 MAC 线接口上发生冲突事件。MAC 甚至会在 接收到帧结束之前就给出状态来指示重试。然后将使能重新发送并再次将帧从 FIFO 中弹 出。当超过 96 个字节弹向 MAC 内核后,FIFO 控制器将释放该空间,使 DMA 可推入更多 数据。这意味着超过阈值后或 MAC 内核指示延迟冲突事件时,无法重新发送。
发送校验和减荷
通信协议(例如 TCP 和 UDP)将实施校验和字段,这有助于确定通过网络发送的数据的完 整性。由于以太网最广泛的用途是通过 IP 数据报封装 TCP 和 UDP,因此以太网控制器具有 发送校验和减荷功能,该功能支持校验和计算、发送路径中的校验和插入以及接收路径中的错误检测。
检验以太网数据帧中有效载荷的IP 数据报封装 TCP 和 UDP
通过完整的帧来计算 TCP、UDP 或 ICMP 的校验和,然后将其插入相应的报头字段。由于此要求,仅当发送 FIFO 配置为存储转发模式(即,ETH_ETH_DMAOMR 寄存器中的 TSF 位 置 1)时,才使能此功能。如果内核配置为阈值(直通)模式,则将绕过发送校验和减荷。
在检测到有 MAC 数据包需要接收时,ETH 外设控制数据接收,并解包MAC 数据包得到解包后的数据通过 DMA 传输到系统寄存器内。
MAC接收也有2种方式
在阈值(直通)模式下,当 FIFO 接收到 64 个字节 (使用 ETH_DMAOMR 寄存器中的 RTC 位配置) 或完整的数据包时,数据将弹出,
在 Rx FIFO 存储转发模式(通过 ETH_DMAOMR 寄存器中的 RSF 位置)下,仅在帧完全 写入接收 FIFO 后才可读出帧。
去除接收的帧的报头和 SFD。检测到 SFD 后,MAC 开始向接收 FIFO 发送以太网帧数据, 从 SFD 后面的第一个字节(目标地址)开始发送。
如果接收的帧长度/类型字段小于 0x600 并且为 MAC 编程了自动去除 CRC/pad 选项,则 MAC 将向接收 FIFO 发送帧数据(数据量不超过长度/类型字段中指定的数量),然后开始 丢弃字节(包括 FCS 字段)。如果长度/类型字段大于或等于 0x600,则不管编程的自动 CRC 去除选项的值如何,MAC 都会向 Rx FIFO 发送所有接收到的以太网帧数据
默认情况 下,使能 MAC 看门狗定时器,即,超过 2048 个字节的帧会被切断。可通过对 MAC 配置寄存器中的看门狗禁止 (WD) 位编程来禁止此功能。
接收 CRC:自动 CRC 和 pad 去除
MAC 将检查接收帧中的任何 CRC 错误。它将计算接收的帧(包括目标地址字段到 FCS 字 段)的 32 位 CRC。
接收校验和减荷
对接收的以太网帧中的 IPv4 和 IPv6 帧进行检测和处理,以确保数据完整性。可通过将 ETH_MACCR 寄存器中的 IPCO 位置 1 来使能接收校验和减荷。
接收帧控制器(过滤)
如果复位 MAC CSR 帧过滤寄存器中的 RA 位,则 MAC 将根据目标/源地址执行帧过滤
检测到过滤失败时,帧将被丢弃且不会传输到应用程序
接收流量控制(全双工模式)
MAC 将检测接收暂停帧并暂停帧发送,暂停时间为接收的暂停帧内指定的延迟(仅限全双 工模式)。
可通过 ETH_MACFCR 中的 RFCE 位使能或禁止暂停帧检测功能
使能接收流 量控制后,将开始监视接收帧的目标地址是否与控制帧的多播地址 (0x0180 C200 0001) 匹 配。
如果检测到匹配(接收的帧的目标地址与保留的控制帧的目标地址匹配),MAC 将根 据 ETH_MACFFR 中的 PCF 位来决定是否将接收的控制帧(如暂停帧)传输到应用程序
对于具有单播目标地址的暂停帧,MAC 将根据 DA 是否与 MAC 地址 0 寄存器的内容匹配以 及 ETH_MACFCR 中的 UPDF 位是否置 1(检测具有单播目标地址的暂停帧)来进行过滤。
MAC 过滤功能可以选择性的过滤设定目标地址或源地址的 MAC 帧。它将检查所有接收到的数据帧的目标地址和源地址,根据过滤选择设定情况,检测后报告过滤状态。
针对目标地址过滤可以有三种,分别是单播、多播和广播目标地址过滤;
针对源地址过滤就只有单播源地址过滤。
单播源地址过滤是将接收的 SA 字段与 SA 寄存器内容进行比较过滤。
MAC 过滤还具备反向过滤操作功能,即让过滤结构求补集。
MAC 支持对发送到其接收器的帧进行回送。默认情况下,禁止 MAC 回送功能,可通过编程 MAC ETH_MACCR 寄存器中的 Loopback 位使能该功能
官方文件stsw-stm32070.rar
在其文件目录 (…STM32F4x7_ETH_LwIP_V1.1.1LibrariesSTM32F4x7_ETH_Driver) 下可找到 stm32f4x7_eth.c、stm32f4x7_eth.h 和 stm32f4x7_eth_conf_template.h 三个文件,其中的 stm32f4x7_eth.c 和 stm32f4x7_eth.h 就是类似 stm32f4xx_adc.c 是关于 ETH 外设的驱动。
ethernetif.c 文件是无操作系统时网络接口函数,该文件在移植是只需修改相关头文件名,函数实现部分无需修改。该文件主要有三个部分函数,一个是 low_level_init,用于初始化 MAC 相关工作环境、初始化 DMA 描述符链表,并使能 MAC 和 DMA;一个是 low_level_output,它是最底层发送一帧数据函数;最后一个是 low_level_input,它是最底层接收一帧数据函数。
stm32f4x7_eth.h 和stm32f4x7_eth.c 两个文件用于 ETH 驱动函数实现,它是通过直接操作寄存器方式实现,这两个文件我们无需修改。
需要修改的文件如下
stm32f4x7_eth_conf.h头文件的修改
stm32f4x7_eth_bsp.h文件修改
stm32f4x7_eth_bsp.c文件修改
ETH_BSP_Config()函数
ETH_MACDMA_Config()函数
ETH_GPIO_Config()函数
netconf.h文件修改
/**
******************************************************************************
* @file netconf.h
* @author MCD Application Team
* @version V1.1.0
* @date 31-July-2013
* @brief This file contains all the functions prototypes for the netconf.c
* file.
******************************************************************************
* @attention
*
* © COPYRIGHT 2013 STMicroelectronics
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __NETCONF_H
#define __NETCONF_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Exported types ------------------------------------------------------------*/
#define DHCP_START 1
#define DHCP_WAIT_ADDRESS 2
#define DHCP_ADDRESS_ASSIGNED 3
#define DHCP_TIMEOUT 4
#define DHCP_LINK_DOWN 5
//#define USE_DHCP /* enable DHCP, if disabled static address is used */
/* Uncomment SERIAL_DEBUG to enables retarget of printf to serial port (COM1 on STM32 evalboard)
for debug purpose */
#define SERIAL_DEBUG
#define DEST_IP_ADDR0 192 /* 服务器IP */
#define DEST_IP_ADDR1 168
#define DEST_IP_ADDR2 1
#define DEST_IP_ADDR3 100
#define DEST_PORT 6000 /* 服务器端口 */
#define UDP_SERVER_PORT 5000 /* define the UDP local connection port */
#define UDP_CLIENT_PORT 5000 /* define the UDP remote connection port */
/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
#define MAC_ADDR0 2 /* 网卡MAC */
#define MAC_ADDR1 0
#define MAC_ADDR2 0
#define MAC_ADDR3 0
#define MAC_ADDR4 0
#define MAC_ADDR5 0
/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
#define IP_ADDR0 192 /* 本机IP */
#define IP_ADDR1 168
#define IP_ADDR2 1
#define IP_ADDR3 122
/*NETMASK*/
#define NETMASK_ADDR0 255 /* 子网掩码 */
#define NETMASK_ADDR1 255
#define NETMASK_ADDR2 255
#define NETMASK_ADDR3 0
/*Gateway Address*/
#define GW_ADDR0 192 /* 网关IP */
#define GW_ADDR1 168
#define GW_ADDR2 1
#define GW_ADDR3 1
/**
* @brief Number of milliseconds when to check for link status from PHY
*/
#ifndef LINK_TIMER_INTERVAL
#define LINK_TIMER_INTERVAL 1000
#endif
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define printf USART1Printf
/* Exported functions ------------------------------------------------------- */
void LwIP_Init(void);
void LwIP_Pkt_Handle(void);
void LwIP_Periodic_Handle(__IO uint32_t localtime);
#ifdef __cplusplus
}
#endif
#endif /* __NETCONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
netconf.c文件修改
LwIP_Init()函数
调试信息的修改
tcp_echoclient.h修改
tcp_echoclient.c修改
还有一些其他的修改,比如源代码缺少头文件,直接补上就可以了;调试信息接口的修改,使用LCD还是串口等;工作指示灯LED
lwipopts.h 文件存放一些宏定义,用于剪切 LwIP 功能,比如有无操作系统、内存空间分配、存储池分配、 TCP 功能、 DHCP 功能、 UDP 功能选择等等。
LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP 支持函数,一般在 main 函数的无限循环中调用,主要功能是为 LwIP 各个模块提供时间并查询链路状态,该函数有一个形参,用于指示当前时间,单位为 ms。
LwIP_Pkt_Handle 函数用于从以太网存储器读取一个以太网帧并将其发送给 LwIP,它在接收到以太网帧时被调用,它是直接调用 ethernetif_input 函数实现的,该函数定义在 ethernetif.c 文件中。
LwIP 为使用者提供了两种应用程序接口 (API 函数) 来实现 TCP/IP 协议栈,
使用网线连接开发板和PC,更改PC的IP使其与开发板同一的局域网下
LwIP_Periodic_Handle 函数执行 LwIP 需要周期性执行函数,该所以我们需要为该函数提高一个时间基准,这里使用 TIM 产生这个基准,初始化配置 TIM 每 10ms 中断一次,在其中断服务函数中递增 LocalTime 变量值。
主函数
调用初始化函数
设置开发板IP与服务器地址等
/**
******************************************************************************
* @file netconf.h
* @author MCD Application Team
* @version V1.1.0
* @date 31-July-2013
* @brief This file contains all the functions prototypes for the netconf.c
* file.
******************************************************************************
* @attention
*
* © COPYRIGHT 2013 STMicroelectronics
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __NETCONF_H
#define __NETCONF_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Exported types ------------------------------------------------------------*/
#define DHCP_START 1
#define DHCP_WAIT_ADDRESS 2
#define DHCP_ADDRESS_ASSIGNED 3
#define DHCP_TIMEOUT 4
#define DHCP_LINK_DOWN 5
//#define USE_DHCP /* enable DHCP, if disabled static address is used */
/* Uncomment SERIAL_DEBUG to enables retarget of printf to serial port (COM1 on STM32 evalboard)
for debug purpose */
#define SERIAL_DEBUG
#define DEST_IP_ADDR0 192 /* 服务器IP */
#define DEST_IP_ADDR1 168
#define DEST_IP_ADDR2 1
#define DEST_IP_ADDR3 100
#define DEST_PORT 6000 /* 服务器端口 */
#define UDP_SERVER_PORT 5000 /* define the UDP local connection port */
#define UDP_CLIENT_PORT 5000 /* define the UDP remote connection port */
/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
#define MAC_ADDR0 2 /* 网卡MAC */
#define MAC_ADDR1 0
#define MAC_ADDR2 0
#define MAC_ADDR3 0
#define MAC_ADDR4 0
#define MAC_ADDR5 0
/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
#define IP_ADDR0 192 /* 本机IP */
#define IP_ADDR1 168
#define IP_ADDR2 1
#define IP_ADDR3 122
/*NETMASK*/
#define NETMASK_ADDR0 255 /* 子网掩码 */
#define NETMASK_ADDR1 255
#define NETMASK_ADDR2 255
#define NETMASK_ADDR3 0
/*Gateway Address*/
#define GW_ADDR0 192 /* 网关IP */
#define GW_ADDR1 168
#define GW_ADDR2 1
#define GW_ADDR3 1
/**
* @brief Number of milliseconds when to check for link status from PHY
*/
#ifndef LINK_TIMER_INTERVAL
#define LINK_TIMER_INTERVAL 1000
#endif
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define printf USART1Printf
/* Exported functions ------------------------------------------------------- */
void LwIP_Init(void);
void LwIP_Pkt_Handle(void);
void LwIP_Periodic_Handle(__IO uint32_t localtime);
#ifdef __cplusplus
}
#endif
#endif /* __NETCONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
更改PC机IP地址
PC ping 开发板
开发板作为TCP client 连接TCP服务器
开发板有2个按键,KEY1按下则连接TCP服务器
KEY2按下则断开连接
需要2个文件
tcp_echoclient.c与tcp_echoclient.h
工程文件下载链接