1、简介
Light weight IP(LWIP)轻量化的 TCP/IP 协议,LwIP 的设计初衷是用少量的资源消耗(RAM)实现一个较为完整的 TCP/IP 协议栈, 在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
2、准备工具
准备一块带以太网RJ45网口的ST开发板,这里以NUCLEO-F429ZI为例;
家用路由器一个;
网线一根。
3、cubemx工程设置
勾选ETH外设,接口选择RMII,其他选项保持默认
NUCLEO-F429ZI的ETH外设没有集成物理层的数据转换芯片,这里使用的外部PHY模块为LAN8742,需要在Lwip平台设置中指明PHY型号。
Lwip的设置参数有很多,以下只需进行少量的参数配置完成简易驱动即可
使能DHCP模块,用于分配动态IP地址。使能ICMP模块,为后面电脑与开发板Ping通信使用,还有是设置UDP、TCP的客户端连接数量,连接数量越多则占用的资源也相应增加。
以生成MDK工程为例,同时注意调大堆栈大小
4、软件测试
lwip库自动生成了一系列变量,ipv4地址缓存、子网掩码、网关等
主要测试代码放置在main.c文件,在main文件需要声明必要变量以及导入外部变量
/* USER CODE BEGIN PV */ extern struct netif gnetif; struct dhcp *dhcp; /* USER CODE END PV */
cubemx已完成Lwip初始化
/* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ MX_LWIP_Process(); dhcp = netif_dhcp_data(&gnetif); printf("DHCP IPV4 Address: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr)); printf("DHCP SubnetMask: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask)); printf("DHCP Gateway: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr)); HAL_Delay(1200); }
实物连接图
串口输出开发板获取的IP信息
局域网Ping测试