参考:网络协议栈驱动移植
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端一致。在上面的软件里输入,就可以在这里得到输出