STM32F407利用RT-thread上移植LWIP

本文详细介绍了在STM32F407芯片上进行网络编程的方法,包括环境搭建、ETH和ENV配置、连接测试及TCP客户端的实现。以STM32F407开发板为基础,通过RMII接口与LAN8720A PHY芯片连接,完成以太网模块的驱动移植。文章还提供了静态IP设置、Ping测试以及与PC端的TCP通信实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:网络协议栈驱动移植

1:环境

芯片:STM32F407
开发板:正点原子探索版
PHY:LAN8720A
接口:RMII

STM32F407自带以太网模块, 与外部PHY芯片通过RMII接口连接。

在这里插入图片描述

2:配置ETH

在这里插入图片描述

3:配置ENV

首先使能以太网外设, 如果没有需要在Kconfig文件中添加。
在这里插入图片描述
启用 lwIP 与 net device
在这里插入图片描述

在这里插入图片描述
如果直接与电脑连接,不要用DHCP,把这一项去掉
在这里插入图片描述

直接连接PC,使用静态IP,可以在这里修改
在这里插入图片描述
保存,重新生成mdk5
在开发板上执行,查看注册的设备,可以得到已经注册上 e0。
在这里插入图片描述

4:连接测试

PC端设置固定IP 192.168.1.20
在PC测 ping开发板
在这里插入图片描述
在开发板测ping PC
在这里插入图片描述
这里有一个显示问题,已经把DCHP关掉了,但是这里还是显示为0。不过能正常使用,IP可以ping通就是显示不出来。目前还为解决这个问题。
在这里插入图片描述

5. 建立tcp的客户端,与PC测试

在main中添加下面的代码

#include <lwip/opt.h>
#include <lwip/init.h>
#include <lwip/mem.h>
#include <lwip/icmp.h>
#include <lwip/netif.h>
#include <lwip/sys.h>
#include <lwip/inet.h>
#include <lwip/inet_chksum.h>
#include <lwip/ip.h>
#include <lwip/netdb.h>
#include <lwip/sockets.h>

/**===================tcpclient=====================*/
#define BUFSZ 512
static void tcpclient(int argc, char **argv)
{
	int ret;
	char *recv_data;
	struct hostent *host;
	int sock, bytes_received;
	struct sockaddr_in server_addr;
	const char *url;
	int port;
	
	if(argc < 3){
		rt_kprintf("Usage:tcpclient URL PORT\n");
		rt_kprintf("Like: tcpcilent 192.168.1.20 5000");
		return;
	}
	url = argv[1];
	port = strtoul(argv[2], 0, 10);
	
	host = gethostbyname(url);
	
	recv_data = rt_malloc(BUFSZ);
	if(recv_data == RT_NULL){
		rt_kprintf("No memory\n");
		return;
	}
	
    /* 创建一个 socket,类型是 SOCKET_STREAM,TCP 类型 */
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        /* 创建 socket 失败 */
        rt_kprintf("Socket error\n");

        /* 释放接收缓冲 */
        rt_free(recv_data);
        return;
    }
	
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(port);
	server_addr.sin_addr = *((struct in_addr*)host->h_addr);
	rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
	
	if(connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){
		rt_kprintf("Connect fail\n");
		closesocket(sock);
		rt_free(recv_data);
		return;
	}
	
	while(1){
		bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
		if(bytes_received < 0){
			closesocket(sock);
			rt_kprintf("\n received error, close the socket.\r\n");
			break;
		} else if(bytes_received == 0) {
			rt_kprintf("\n received warning, recv function return 0.\r\n");
			continue;
		}
		recv_data[bytes_received] = '\0';
		
		if(strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0){
			closesocket(sock);
			rt_kprintf("\n got a 'q' or 'Q', close the socket. \r\n");
			rt_free(recv_data);
			break;
		} else {
			rt_kprintf("\n Receive data = %s", recv_data);
		}
		
		ret = send(sock, recv_data, strlen(recv_data), 0);
		if(ret < 0){
			closesocket(sock);
			rt_kprintf("\n send error, close the socket.\r\n");
			rt_free(recv_data);
			break;
		} else if(ret == 0) {
			rt_kprintf("\n Send warning, send funcion returun 0. \r\n");
		}
	}
}
MSH_CMD_EXPORT(tcpclient, tcpclient samole);

在PC端打开网络调试助手,建立TCP的server端
在这里插入图片描述
在ptshell 中输入下面命令,注意IP地址和端口号和上面的server端一致。在上面的软件里输入,就可以在这里得到输出
在这里插入图片描述

源码下载:https://download.csdn.net/download/weixin_36209467/13026529

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值