欧意交易所-欧意app官方下载平台_数字货币交易所

欧意交易所-欧意app官方下载平台_数字

欧易交易所ETH接口+LwIP协议栈使用(DHCP)

时间:2024-10-11 15:49来源: 作者:admin 点击: 13 次
文章浏览阅读1.4w次,点赞22次,收藏133次。LwIP是LightWeightInternetProtocol的缩写,是由瑞士计算机科学院AdamDunkels等开发的适用于嵌入式领域的开源轻量级TCP/IP协议栈。它可以移植到含有操作系统的平台中,也可以在无操作系统的平台下运行。由于它开源、占

STM32F4xx 系列控制器内部集成了一个以太网外设,它实际是一个通过 DMA 控制器进行介质访问控制(MAC),它的功能就是实现 MAC 层的任务。借助以太网外设,STM32F4xx 控制器可以通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。ETH 内部自带专用的 DMA 控制器用于 MAC,ETH 支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII)用于与外部 PHY 芯片连接。MII 和 RMII 接口用于 MAC 数据包传输,ETH 还集成了站管理接口(SMI)接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器。

物理层定义了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,PHY 芯片是物理层功能实现的实体,生活中常用水晶头网线+水晶头插座+PHY 组合构成了物理层。

ETH 有专用的 DMA 控制器,它通过 AHB 主从接口与内核和存储器相连,AHB 主接口用于控制数据传输,而 AHB 从接口用于访问“控制与状态寄存器”(CSR)空间。在进行数据发送是,先将数据有存储器以 DMA 传输到发送 TX FIFO 进行缓冲,然后由 MAC 内核发送;接收数据时,RX FIFO 先接收以太网数据帧,再由 DMA 传输至存储器。ETH 系统功能框图见下图。

二、LwIP简介

LwIP 是 Light Weight Internet Protocol 的缩写,是由瑞士计算机科学院 Adam Dunkels等开发的适用于嵌入式领域的开源轻量级 TCP/IP 协议栈。它可以移植到含有操作系统的平台中,也可以在无操作系统的平台下运行。由于它开源、占用的 RAM 和 ROM 比较少、支持较为完整的 TCP/IP 协议、且十分便于裁剪、调试,被广泛应用在中低端的 32 位控制器平台。

针对 LwIP 应用开发了测试平台,其中有一个是在 STM32F4x7 系列控制器运行的
(文件编号为:STSW-STM32070)。

2.1 DHCP

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动。当DHCP服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置。DHCP具有以下功能:

保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。

DHCP应当可以给用户分配永久固定的IP地址。

DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。

DHCP服务器应当向现有的BOOTP客户端提供服务。

DHCP有三种机制分配IP地址:

自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。

动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。

手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。

三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

DHCP消息的格式是基于BOOTP(Bootstrap Protocol)消息格式的,这就要求设备具有BOOTP中继代理的功能,并能够与BOOTP客户端和DHCP服务器实现交互。BOOTP中继代理的功能,使得没有必要在每个物理网络都部署一个DHCP服务器。RFC 951和RFC 1542对BOOTP协议进行了详细描述。

三、LAN8720A简介

LAN8720A 是 SMSC 公司(已被 Microchip 公司收购)设计的一个体积小、功耗低、全能型 10/100Mbps 的以太网物理层(PHY)收发器。LAN8720A 总共只有 24Pin,仅支持 RMII 接口。

由它组成的网络结构见下图


LAN8720A 通过 RMII 与 MAC 连接。RJ45 是网络插座,在与 LAN8720A 连接之间还需要一个变压器,所以一般使用带电压转换和 LED 指示灯的 HY911105A 型号的插座。一般来说,必须为使用 RMII 接口的 PHY 提供 50MHz 的时钟源输入到 REF_CLK 引脚,不过 LAN8720A 内部集成 PLL,可以将 25MHz 的时钟源陪频到 50MHz 并在指定引脚输出该时钟,所以我们可以直接使其与 REF_CLK 连接达到提供 50MHz 时钟的效果。

PHY 芯片地址设置
LAN8720A 可以通过 PHYAD0 引脚来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。

nINT/REFCLKO 引脚功能配置
nINT/REFCLKO 引脚用于 RMII 接口中 REF_CLK 信号线

当 nINTSEL 引脚为低电平时,它也可以被设置成 50MHz 时钟输出,这样可以直接与 STM32F4xx 的 REF_CLK 引脚连接为其提供 50MHz 时钟源,这种模式要求为 XTAL1 与 XTAL2 之间或为 XTAL1/CLKIN 提供 25MHz 时钟,由 LAN8720A 内部 PLL 电路陪频得到 50MHz 时钟,此时 nIN/REFCLKO 引脚的中断功能不可用,用于 50MHz 时钟输出。

当 nINTSEL 引脚为高电平时,LAN8720A 被设置为时钟输入,即外部时钟源直接提供 50MHz 时钟接入 STM32F4xx 的 REF_CLK 引脚和 LAN8720A 的 XTAL1/CLKIN 引脚,此时 nINT/REFCLKO 可用于中断功能。

nINTSEL 与 LED2 引脚共用,一般使用下拉,LAN8720A 外接 25MHz 石英晶振,通过内部陪频到 50MHz,然后通过 REFCLKO 引脚,输出 50MHz 参考时钟给 MAC 控制器。这种方式,可以降低 BOM 成本。

如果不外接晶振,需要通过板子的MCO1或者MCO2通过分频倍频操作来输出50Mhz来驱动网口。


四、引脚分布

ETH 相关硬件在 STM32F4xx 控制器分布情况如下:

接口ETHGPIO
MII   MII_TX_CLK   PC3  
  MII_TXD0   PB12/PG13  
  MII_TXD1   PB13/PG14  
  MII_TXD2   PC2  
  MII_TXD3   PB8/PE2  
  MII_TX_EN   PB11/PG11  
  MII_RX_CLK   PA1  
  MII_RXD0   PC4  
  MII_RXD1   PC5  
  MII_RXD2   PB0  
  MII_RXD3   PB1  
  MII_RX_ER   PB10  
  MII_RX_DV   PA7  
  MII_CRS   PA0  
  MII_COL   PA3  
RMII   RMII_TXD0   PB12/PG13  
  RMII_TXD1   PB13/PG14  
  RMII_TX_EN   PG11  
  RMII_RXD0   PC4  
  RMII_RXD1   PC5  
  RMII_CRS_DV   PA7  
  RMII_REF_CLK   PA1  
SMI   MDIO   PA1  
  MDC   PC1  
其他   PPS_OUT   PB5/PG8  
五、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”

2. 选择 MCU 和封装

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)


选择 Clock Configuration,配置系统时钟 SYSCLK 为 168MHz
修改 HCLK 的值为 168 后,输入回车,软件会自动修改所有配置

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire

六、ETH 6.1 参数配置

在 Connectivity 中选择 ETH 设置,模式选择 RMII 使用简化版MII(介质独立接口)。

MII: Medium Independent Interface(介质独立接口),用于连接介质访问控制层(MAC)子层和物理层(PHY)之间的标准以太网接口,提供数据传输路径。由于 MII 需要多达16根信号线,由此产生的 I/O 口需求及功耗较大。对于 MII 接口,一般是外部为 PHY 提供 25MHz 时钟源,再由 PHY 提供 TX_CLK 和 RX_CLK 时钟,不需要与 MAC 层时钟一致。

RMII: Reduced Medium Independent Interface,RMII 接口是 MII 接口的简化版本,MII 需要 16 根通信线,RMII 只需 7 根通信,在功能上是相同的。对于 RMII 接口,一般需要外部直接提供 50MHz 时钟源,同时接入 MAC 和 PHY。需与MAC层时钟一致,通常从 MAC 层获取该时钟源。现在一般都用RMII模式。

在 Parameter Settings 进行具体参数配置。

Advanced : Ethernet Media Configuration(以太网媒体配置):

Auto Negotiation(自适应功能): 选择 Enabled ,一般选择使能自适应功能,系统会自动寻找最优工作方式,包括选择 10MBit/s 或者 100MBit/s 的以太网速度以及全双工模式或半双工模式。LAN8720A支持自适应功能

Speed(以太网速度): 可选 10MBit/s 或 100MBit/s,它设定 ETH_MACCR 寄存器的 FES 位的值,一般设置 100MBit/s,但在使能自适应功能之后该位设置无效。

Duplex Mode(以太网工作模式): 可选全双工模式或半双工模式,它设定 ETH_MACCR 寄存器 DM 位的值。一般选择全双工模式,在使能了自适应功能后该成员设置无效。

General : Ethernet Configuration(以太网配置):

Ethernet MAC Address(以太网MAC地址): 默认即可

PHY Address(PHY芯片地址): 0

注意:LAN8720A 可以通过 PHYAD0 引脚(如PHY芯片引脚10)来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。本硬件 RXER 引脚浮空,其 PHY 芯片地址为 0。

Ethernet Basic Configuration(以太网基本配置):

Rx Mode(接收模式): 选择 Polling Mode 轮询方法。ST 官方例程文件包含了中断引脚的相关配置,主要用于指示接收到以太网帧,我们这里不需要使用。

TX IP Header Checksum Computation(发送数据校验和): 选择 By hardware 使能发送数据硬件校验和。这个需要硬件支持,STM32F4xx 控制器是支持的。

在 Advanced Parameters 进行高级参数配置。

PHY: 选择 user PHY,因为没有我的 PHY 芯片型号 LAN8720A

PHY name: 可改为 PHY 芯片型号 LAN8720A

PHY special control/status register Offset(特殊控制/状态寄存器): 按照芯片手册填写,0x1F

PHY Speed mask(以太网速度状态位): 按照芯片手册填写,0x0004

PHY Speed mask(以太网工作模式状态位): 按照芯片手册填写,0x0010

其他保持默认

6.2 引脚配置

GPIO 设置,在右边图中找到 ETH 对应引脚,将引脚配置成跟原理图上的一致



七、LwIP 7.1 参数配置

在 Middleware 中选择 LWIP 设置,勾选 Enabled 使能协议栈。

在 General Settings 进行通用参数配置。

IPv4 - DHCP Options:

LWIP_DHCP(DHCP Module): 选择 Enabled。如果使用开发板连接带 DHCP 服务功能的路由器,可以使能。否则开发板直接连接电脑,电脑是没办法提供 DHCP 服务功能的。

Protocols Options:

LWIP_ICMP(ICMP Module Activation)控制报文协议: 选择 Enabled。主要用于网络的调试与维护,ping 的时候用。

LWIP_IGMP(IGMP Module)互联网组管理协议: 选择 Disabled。可以实现多播数据的接收。

LWIP_DNS(DNS Module)域名解析: 选择 Disabled。通过域名解析用户就可以在知道服务器域名的情况下,获得该服务器的 IP 地址。

LWIP_UDP(UDP Module)用户数据报协议: 选择 Enabled。看需求,一般选择用 TCP 协议。

MEMP_NUM_UDP_PCB(Number of UDP Connections): UDP协议控制块数量,决定 UDP 协议控制块需要的 POOL 资源。

LWIP_TCP(TCP Module)传输控制协议: 选择 Enabled。

MEMP_NUM_TCP_PCB(Number of TDP Connections): 同时活动的TCP连接数。

在 Key Options 进行关键选项配置。
Infrastructure - OS Awarness Option:

NO_SYS(OS Awarness): OS Not Used 表示无操作系统模拟层,这个宏非常重要,因为无操作系统与有操作系统的移植和编写是完全不一样的,我们现在是无操作系统移植。

Infrastructure - Timers Options:

LWIP_TIMERS(Use Support For sys_timeout): 默认 Enabled。使用 LwIP 提供的定时器,用于超时机制。

Infrastructure - Core Locking and MPU Options:

SYS_LIGHTWEIGHT_PROT(Memory Functions Protection): 默认 Disabled。平台锁,保护关键区域内缓存的分配与释放。

Infrastructure - Heap and Memory Pools Options:

MEM_SIZE(Heap Memory Size): 默认 1600 Byte(s)。堆内存的大小。如果应用程序将发送很多需要复制的数据应该设置得大一点。

Infrastructure - Internal Memory Pool Sizes:

MEMP_NUM_PBUF(Number of Memory Pool struct Pbufs): 默认 16。memp 结构的 pbuf 数量,如果应用从 ROM 或者静态存储区发送大量数据时,这个值应该设置大一点。

MEMP_NUM_RAW_PCB(Number of Raw Protocol Control Blocks): 默认 4。 原始连接(就是应用程不经过传输层直接到IP层获取数据)PCB 的数目,该项依赖 LWIP_RAW 项的开启。

MEMP_NUM_TCP_PCB(Number of Listening TCP Connections): 默认 8。 同时建立激活的 TCP 连接的数目(要求参数 LWIP_TCP 使能)。

MEMP_NUM_TCP_SEG(Number of TCP Segments simultaneously queued): 默认 16。 最多同时在队列的 TCP_SEG 的数目。

Pbuf Options:

PBUF_POOL_SIZE(Number of Buffers in the Pbuf Pool): 默认 16。 内存池大小。

PBUF_POOL_BUFSIZE(Size of each pbuf in the pbuf pool): 默认 592 Byte(s)。 每个 pbuf 内存池大小。

IPv4 - ARP Options:

LWIP_ARP(ARP Functionality): 选择 Enabled。 地址解析协议,通过目标设备的 IP 地址,查询目标设备的 MAC 地址,以保证通信的
顺利进行。

Callback - TCP Options:

TCP_TTL(Number of Time-To-Live Used by TCP Packets): 默认 255 Node(s)。TCP TTL时间。

TCP_WND(TCP Receive Window Maximum Size): 默认 2144 Byte(s)。TCP 窗口长度。

TCP_QUEUE_OOSEQ(Allow Out-Of-Order Incoming Packets): 默认 Enabled。TCP队列到达顺序。如果设备内存不足,则定义为0。

TCP_MSS(Maximum Segment Size): 默认 536 Byte(s)。最大 TCP 报文段,TCP_MSS = MTU - IP 报头大小 - TCP 报头大小。

TCP_SND_BUF(TCP Sender Buffer Space): 默认 1072 Byte(s)。TCP 发送缓冲区大小(字节)。

TCP_SND_QUEUELEN(TCP Sender Buffer Space): 默认 1072 Byte(s)。TCP 发送缓冲区队列的最大长度。

Network Interfaces Options:

LWIP_NETIF_STATUS_CALLBACK(Callback Function on Interface Status Changes): 默认 Disabled。当 netif 状态设置为 up 或 down 时调用此函数。

LWIP_NETIF_LINK_CALLBACK(Callback Function on Interface Link Changes): 默认 Enabled。当 netif 链接设置为 up 或 down 时,将调用此函数。

NETIF - Loopback Interface Options:

LWIP_NETIF_LOOPBACK(NETIF Loopback): 默认 Disabled。支持发送数据包的目的地 IP。

Thread Safe APIs - Socket Options:

LWIP_SOCKET(Socket API): 默认 Disabled。Socket API。

八、生成代码

输入项目名和项目路径


选择应用的 IDE 开发环境 MDK-ARM V5


每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。


点击 GENERATE CODE 生成代码

九、修改main.c

在 main() 的死循环中添加 MX_LWIP_Process() 函数。

然后加入以下代码不断获取 DHCP 动态分配到的 IP 地址。

extern struct netif gnetif; struct dhcp *dhcp; int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_LWIP_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf("lwip test\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { MX_LWIP_Process(); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ dhcp = netif_dhcp_data(&gnetif); printf("DHCP IP address: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr)); printf("DHCP Subnet mask: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask)); printf("DHCP Default gateway: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr)); HAL_Delay(1000); } /* USER CODE END 3 */ }

查看效果:


使用电脑ping上面的ip:

十、工程代码

链接: 提取码:ukl8

十一、相关API说明 11.1 MX_LWIP_Init

初始化LwIP的内存管理和各个协议层。
按顺序执行了:

网络接口的添加 netif_add()

初始化底层 ethernetif_init()

DHCP dhcp_start()

然后LwIP就可以用了。

收包用的是调用 low_level_input 把数据包接回来,给 netif->input 处理。
发包则是由 netif->output 交由 etharp_output 制作数据包,调用 low_level_output 发出去。

void MX_LWIP_Init(void) { /* Initilialize the LwIP stack without RTOS */ lwip_init(); /* IP addresses initialization with DHCP (IPv4) */ ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; /* add the network interface (IPv4/IPv6) without RTOS */ // 如果有多个接口则需多次调用 // 需要提供一个init函数指针,这个指针指向我们自己的硬件接口初始化函数,一般来说就是ethernetif.c中的ethernetif_init() netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input); /* Registers the default network interface */ // 将网络接口设置为默认的网络接口 netif_set_default(&gnetif); // 查看是否有链接 if (netif_is_link_up(&gnetif)) { /* When the netif is fully configured this function must be called */ // 使能网络接口 netif_set_up(&gnetif); } else { /* When the netif link is down this function must be called */ // 关闭网络接口 netif_set_down(&gnetif); } /* Set the link callback function, this function is called on change of link status*/ netif_set_link_callback(&gnetif, ethernetif_update_config); /* Create the Ethernet link handler thread */ /* Start DHCP negotiation for a network interface (IPv4) */ dhcp_start(&gnetif); /* USER CODE BEGIN 3 */ /* USER CODE END 3 */ } 11.2 MX_LWIP_Process

不断地接收来自接口的信息,并检查是否延时

/** * ---------------------------------------------------------------------- * Function given to help user to continue LwIP Initialization * Up to user to complete or change this function ... * Up to user to call this function in main.c in while (1) of main(void) *----------------------------------------------------------------------- * Read a received packet from the Ethernet buffers * Send it to the lwIP stack for handling * Handle timeouts if LWIP_TIMERS is set and without RTOS * Handle the llink status if LWIP_NETIF_LINK_CALLBACK is set and without RTOS */ void MX_LWIP_Process(void) { /* USER CODE BEGIN 4_1 */ /* USER CODE END 4_1 */ ethernetif_input(&gnetif); /* USER CODE BEGIN 4_2 */ /* USER CODE END 4_2 */ /* Handle timeouts */ sys_check_timeouts(); /* USER CODE BEGIN 4_3 */ /* USER CODE END 4_3 */ } 十二、注意事项

用户代码要加在 USER CODE BEGIN N 和 USER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。

• 由 Leung 写于 2022 年 7 月 22 日

• 参考:
    
    LwIP的配置

(责任编辑:)
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2024-10-18 22:10 最后登录:2024-10-18 22:10
栏目列表
推荐内容