STM32F407利用RT-thread上移植LWIP

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

1:环境

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

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

STM32F407利用RT-thread上移植LWIP_第1张图片

2:配置ETH

STM32F407利用RT-thread上移植LWIP_第2张图片

3:配置ENV

首先使能以太网外设, 如果没有需要在Kconfig文件中添加。
STM32F407利用RT-thread上移植LWIP_第3张图片
启用 lwIP 与 net device
STM32F407利用RT-thread上移植LWIP_第4张图片

STM32F407利用RT-thread上移植LWIP_第5张图片
如果直接与电脑连接,不要用DHCP,把这一项去掉
STM32F407利用RT-thread上移植LWIP_第6张图片

直接连接PC,使用静态IP,可以在这里修改
STM32F407利用RT-thread上移植LWIP_第7张图片
保存,重新生成mdk5
在开发板上执行,查看注册的设备,可以得到已经注册上 e0。
STM32F407利用RT-thread上移植LWIP_第8张图片

4:连接测试

PC端设置固定IP 192.168.1.20
在PC测 ping开发板
STM32F407利用RT-thread上移植LWIP_第9张图片
在开发板测ping PC
STM32F407利用RT-thread上移植LWIP_第10张图片
这里有一个显示问题,已经把DCHP关掉了,但是这里还是显示为0。不过能正常使用,IP可以ping通就是显示不出来。目前还为解决这个问题。
STM32F407利用RT-thread上移植LWIP_第11张图片

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

在main中添加下面的代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/**===================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端
STM32F407利用RT-thread上移植LWIP_第12张图片
在ptshell 中输入下面命令,注意IP地址和端口号和上面的server端一致。在上面的软件里输入,就可以在这里得到输出
STM32F407利用RT-thread上移植LWIP_第13张图片

你可能感兴趣的:(RT-thread)