0
点赞
收藏
分享

微信扫一扫

【手把手】stm32用CubeMX配置LwIP+Ping+TCPclient发送信息到PC

残北 2022-03-30 阅读 171

文章目录


前言

这是我写的第一篇博客,欢迎大家给点鼓励和提出建议!
本人由于爱好,辞去土木工作,于不到一个月前入职某个科技公司,专业能力和刚毕业的大学生一样都是很薄弱的。然后被分配到了关于stm32网络方面的工作,经过两个星期的苦学,从一个对cubeMX、网络和LWIP都是零基础的新手学会了LWIP和网络的基础原理,能用CubeMX对LWIP进行相关的配置,还能相互通信。
这个过程真的花了超多时间踩坑,网上很多教程对新手不友好,至少我都没成功过,我相信很多新手也很苦恼这个,于是我希望这个手把手配置教学可以尽我一点绵薄之力帮助到广大新手!(该教程我在其他的板子上也进行过测试,也是没问题的,放心好了!)

一、实验平台

我用一块野火的F407板子进行实验,以太网卡PHY层芯片是LAN8720。(手上没DP83848的板子,抱歉没办法测试这个,应该差不多)

二、手把手全程配置步骤

1.配置电脑环境

先得配置自己的电脑的IP为固定,并且关闭防火墙。
手动配置IP关闭防火墙

2.配置cubeMX

打开CubeMX选择F407芯片。
由于没有使用系统,所以配置为systick就行了(如果有系统,就要使用定时器)
在这里插入图片描述
然后配置ETH,这里选择RMII,因为LAN8720只支持RMII,也只有24个引脚。然后引脚配置按实际的来就行。
在这里插入图片描述
然后是这里的PHY Address要根据芯片的PHYAD引脚的实际连接来配置,这块板子上LAN8720的PHYAD引脚是悬空的,由于这根引脚内部带一个弱下拉,所以我这儿就选择0。
在这里插入图片描述
然后这里的高级设置,由于cubeMX已经有了LAN8742和DP83848主流的两种芯片的默认配置,我这芯片是LAN8720,选LAN8742也能用,前半部分是通用的,后面哪些如果用的是不同的芯片,就要看手册配置了。
在这里插入图片描述
在这里插入图片描述
然后是配置LWIP。使能LWIP,为了方便,把DHCP关了,我自己配置IP、掩码和网关(我这里是网线直连,网关无所谓)
在这里插入图片描述
为了方便调试,按实际板子上的接线,打开串口。
在这里插入图片描述
由于我这块板子上LAN8720的接线是用了25M晶振然后配置LAN8720内部锁相环自己倍频 出50M的时钟,所以我时钟配置直接默认就好了,无所谓。需要注意一点,RMII必须要由50M时钟,如果没用自己的晶振,就要用MCO给它提供50M时钟。
在这里插入图片描述
然后在这里选择输出MDK代码
在这里插入图片描述
为了方便添加自己的代码,我们勾上这个,尽可能的分开这些代码。
在这里插入图片描述

3.配置MDK(Keil5)

打开代码,我们要先配置MDK(Keil5)
在这里插入图片描述
为了代码编译得快一点,我们把这两个关掉。

在这里插入图片描述
Reset and run勾上,常规操作了,主要给新手看。

在这里插入图片描述
主循环中加入这个函数,这样就可以试试能不能ping通了!
编译!下载!
在这里插入图片描述
让我们来ping一下。果然ping通了!
在这里插入图片描述
为了使用串口调试程序,打印一些信息,我们把串口重定向

在这里插入图片描述
测试一下串口,在main.h中也添加stdio.h,为了能各个程序中使用串口打印信息,再在main函数中添加一个printf,这样串口也能正常使用了!
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.配置TCPclient通信程序

接下来就要添加和TCPclinet通信的代码了!
我们新建两个文件,一个是tcpclient.c和tcpclient.h。

tcpclinet.c代码如下

#include "tcpclient.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>	
#include <string.h>
#include "main.h"

  
static struct tcp_pcb *client_pcb = NULL;

static void client_err(void *arg, err_t err)
{
  printf("connect error! closed by core!!\n");
	printf("try to connect to server again!!\n");
  
  //连接失败的时候释放TCP控制块的内存
  tcp_close(client_pcb);  
  
  //重新连接
	TCP_Client_Init();
}


static err_t client_send(void *arg, struct tcp_pcb *tpcb)
{
  uint8_t send_buf[]= "This is a TCP Client test...\n";
  
  //发送数据到服务器
  tcp_write(tpcb, send_buf, sizeof(send_buf), 1); 
  
  return ERR_OK;
}

static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
  if (p != NULL) 
  {        
    /* 接收数据*/
    tcp_recved(tpcb, p->tot_len);
      
    /* 返回接收到的数据*/  
    tcp_write(tpcb, p->payload, p->tot_len, 1);
      
    memset(p->payload, 0 , p->tot_len);
    pbuf_free(p);
  } 
  else if (err == ERR_OK) 
  {
    //服务器断开连接
    printf("server has been disconnected!\n");
    tcp_close(tpcb);
    
    //重新连接
    TCP_Client_Init();
  }
  return ERR_OK;
}

static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{
  printf("connected ok!\n");
  
  //注册一个周期性回调函数
  tcp_poll(pcb,client_send,2);
  
  //注册一个接收函数
  tcp_recv(pcb,client_recv);
  
  return ERR_OK;
}


void TCP_Client_Init(void)
{        
  ip4_addr_t server_ip;
  /* 创建一个TCP控制块  */
  client_pcb = tcp_new();	  

  IP4_ADDR(&server_ip, DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);

  printf("client start connect!\n");
  
  //开始连接
  tcp_connect(client_pcb, &server_ip, TCP_CLIENT_PORT, client_connected); 
  
  //注册异常处理
  tcp_err(client_pcb, client_err); 	     
}	

然后把tcpclient.c加入工程中。

然后是tcpclient.h的代码

#ifndef _TCPCLIENT_H_
#define _TCPCLIENT_H_

#define TCP_CLIENT_PORT 5001

void TCP_Client_Init(void);

#endif

为了在主函数中调用TCP_Client_Init();(初始化TCP客户端程序,加入这个就能通信了,不用加入其他代码到主循环里) ,所以在main.h中加入#include “tcpclient.h”
在这里插入图片描述
再把这个加入到主循环前,这样客户端发送信息的功能就配置好了
在这里插入图片描述
由于我们配置的cubeMX只配置了板子的IP,但板子作为客户端,是要去主动连接PC的,所以我们要把目标地址也放入程序,我们姑且把程序放在main.h中吧,如果你要方便管理,可以把这些东西统一放在其他地方。
在这里插入图片描述
编译!下载!然后打开串口和网络助手,端口号输入5001。
我们可以看到串口打印出信息,网络助手也不断收到消息。成功了!
在这里插入图片描述在这里插入图片描述


总结

哈哈,学习LWIP这个过程实在是艰难,希望我的努力能帮到各位!第一篇博客多有不熟练,希望各位多留言互动。
本人新手,在座各位的水平一定比我高,希望能给我指出错误,提出建议,谢谢!
如果不能配置,或者丢图丢步骤,可以评论留言。我尽力而为。

举报

相关推荐

0 条评论