【LWIP】stm32用CubeMX(6.4版)配置LwIP+Ping+TCPclient+TCPserver发送信息到PC(操作部分)

article/2025/9/23 11:14:13

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 零、更新(2022.08.07)
  • 一、实验平台
  • 二、手把手全程配置步骤
    • 1.配置电脑环境
    • 2.配置cubeMX
    • 3.配置MDK(Keil5)
    • 4.配置TCPclient通信程序
    • 5.配置TCPserver通信程序
  • 三、总结


前言

这是我写的第一篇博客,欢迎大家给点鼓励和提出建议!
本人由于理想和爱好,辞去土木工作,于不到一个月前入职某科技公司开始从事嵌入式,专业能力和刚毕业的大学生一样都是很薄弱的。然后被分配到了关于stm32网络方面的工作,经过两个星期的苦学,从一个对cubeMX、网络和LWIP都是零基础的新手学会了LWIP和网络的基础原理,能用CubeMX对LWIP进行相关的配置,还能相互通信。
这个过程真的花了超多时间踩坑!! 必须感叹一下网上很多教程对LWIP和网络的新手真的不友好,至少我都没成功过,我相信很多新手也很苦恼这个,于是我希望这个手把手配置教学可以尽我一点绵薄之力帮助到广大新手!(该教程我在其他的板子上也进行过测试,也是没问题的,放心好了!)
本章是操作部分,让和我一样的新手们先把东西搞出来,毕竟实践是检验真理的唯一标准,只要能搞出效果,之后的研究都好说!理论部分等我整理出来会陆陆续续开始上传,希望和广大爱好者一同进步!
本篇博客我也录制了操作视频,欢迎观看和提出建议!【三】STM32+LWIP 0基础 小白90分钟快速入门 (初次实战)

零、更新(2022.08.07)

1、已更新测试F207+DP83848也能使用该方法
2、已更新STM32配置为服务器端的办法
3、本程序适用于CubeMX6.4!!!
本程序适用于CubeMX6.4!!!
本程序适用于CubeMX6.4!!!
有人反馈6.5配置不一样,确实不一样,请暂时使用6.4配合我的博客!!!
4、补加PHY芯片复位步骤

一、实验平台

我用一块野火的F407板子进行实验,以太网卡PHY层芯片是LAN8720。(已测试DP83848芯片也能使用该方法)

二、手把手全程配置步骤

1.配置电脑环境

先得配置自己的电脑的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、掩码和网关(我这里是网线直连,网关无所谓),这里用的是TCP,就把UDP关掉。
在这里插入图片描述

为了方便调试,按实际板子上的接线,打开串口。
在这里插入图片描述

由于我这块板子上LAN8720的接线是用了25M晶振然后配置LAN8720内部锁相环自己倍频 出50M的时钟,所以我时钟配置直接默认就好了,无所谓。需要注意一点,RMII必须要由50M时钟,如果没用自己的晶振,就要用MCO给它提供50M时钟。
在这里插入图片描述

然后在这里选择输出MDK代码
在这里插入图片描述

为了方便添加自己的代码,我们勾上这个,尽可能的分开这些代码。
在这里插入图片描述

3.配置MDK(Keil5)

打开代码,我们要先配置MDK(Keil5)
这个C库一定要勾选!
在这里插入图片描述

为了代码编译得快一点,我们把这两个关掉。

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

在这里插入图片描述
主循环中加入这个函数,这样就可以试试能不能ping通了!
编译!下载!
在这里插入图片描述

在PHY层芯片初始化(GPIO、CLOCK、NVIC和传输模式配置)之前加入一个复位!其实就是连接PHY芯片复位引脚的那个GPIO拉低拉高一下。
在这里插入图片描述

让我们来ping一下。果然ping通了!
在这里插入图片描述

为了使用串口调试程序,打印一些信息,我们把串口重定向(这里很奇怪,如果不进行重定向,就算你无意使用串口,也无法用网络发送信息)

在这里插入图片描述

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

在这里插入图片描述

4.配置TCPclient通信程序

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

tcpclinet.c代码如下

#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 void client_err(void *arg, err_t err)       //出现错误时调用这个函数,打印错误信息,并尝试重新连接
{printf("连接错误!!\n");printf("尝试重连!!\n");//连接失败的时候释放TCP控制块的内存printf("关闭连接,释放TCP控制块内存\n");//tcp_close(client_pcb);//重新连接printf("重新初始化客户端\n");TCP_Client_Init();}static err_t client_send(void *arg, struct tcp_pcb *tpcb)   //发送函数,调用了tcp_write函数
{uint8_t send_buf[]= "我是客户端,是你的好哥哥\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("服务器断开连接!\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)
{        struct tcp_pcb *client_pcb = NULL;   //这一句一定要放在里面,否则会没用ip4_addr_t server_ip;     //因为客户端要主动去连接服务器,所以要知道服务器的IP地址/* 创建一个TCP控制块  */client_pcb = tcp_new();	  IP4_ADDR(&server_ip, DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);//合并IP地址printf("客户端开始连接!\n");//开始连接tcp_connect(client_pcb, &server_ip, TCP_CLIENT_PORT, client_connected);ip_set_option(client_pcb, SOF_KEEPALIVE);	printf("已经调用了tcp_connect函数\n");//注册异常处理tcp_err(client_pcb, client_err);printf("已经注册异常处理函数\n");	
}

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

然后是tcpclient.h的代码

#ifndef _TCPCLIENT_H_
#define _TCPCLIENT_H_#define TCP_CLIENT_PORT 5001void TCP_Client_Init(void);#endif

为了在主函数中调用TCP_Client_Init();(初始化TCP客户端程序,加入这个就能通信了,不用加入其他代码到主循环里) ,所以在main.h中加入#include “tcpclient.h”
在这里插入图片描述

再把这个加入到主循环前,这样客户端发送信息的功能就配置好了
在这里插入图片描述

由于我们配置的cubeMX只配置了板子的IP,但板子作为客户端,是要去主动连接PC的,所以我们要把目标地址也放入程序,我们姑且把程序放在main.h中吧,如果你要方便管理,可以把这些东西统一放在其他地方。
在这里插入图片描述

编译!下载!然后打开串口和网络助手,端口号输入5001。
我们可以看到串口打印出信息,网络助手也不断收到消息。成功了!

在这里插入图片描述
在这里插入图片描述

5.配置TCPserver通信程序

接着步骤3,我们创建两个文件。一个是tcpserver.c,另一个是tcpserver.h。

tcpserver.c代码如下

#include "tcpserver.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>static err_t tcpecho_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{                                   //对应接收数据连接的控制块   接收到的数据   if (p != NULL) {        //int a = 666;/* 更新窗口*/tcp_recved(tpcb, p->tot_len);     //读取数据的控制块   得到所有数据的长度   /* 返回接收到的数据*/  //tcp_write(tpcb, p->payload, p->tot_len, 1);uint8_t send_buf1[]= "我收到了你的信息!是";uint8_t send_buf2[]= "吗?\n";	tcp_write(tpcb, send_buf1, sizeof(send_buf1), 1);tcp_write(tpcb, p->payload, p->tot_len, 1);	tcp_write(tpcb, send_buf2, sizeof(send_buf2), 1);	memset(p->payload, 0 , p->tot_len);pbuf_free(p);} else if (err == ERR_OK)    //检测到对方主动关闭连接时,也会调用recv函数,此时p为空{return tcp_close(tpcb);}return ERR_OK;
}static err_t tcpecho_accept(void *arg, struct tcp_pcb *newpcb, err_t err) //由于这个函数是*tcp_accept_fn类型的//形参的数量和类型必须一致
{     tcp_recv(newpcb, tcpecho_recv);    //当收到数据时,回调用户自己写的tcpecho_recvreturn ERR_OK;
}void TCP_Echo_Init(void)
{struct tcp_pcb *server_pcb = NULL;	            		/* 创建一个TCP控制块  */server_pcb = tcp_new();	printf("创建了一个控制块\n");/* 绑定TCP控制块 */tcp_bind(server_pcb, IP_ADDR_ANY, TCP_ECHO_PORT);       printf("已经绑定一个控制块\n");/* 进入监听状态 */server_pcb = tcp_listen(server_pcb);printf("进入监听状态\n");	/* 处理连接 注册函数,侦听到连接时被注册的函数被回调 */	tcp_accept(server_pcb, tcpecho_accept);  //侦听到连接后,回调用户编写的tcpecho_accept //这个函数是*tcp_accept_fn类型的
}

然后把文件添加入工程

tcpserverc.h代码如下

#ifndef _TCPECHO_H_
#define _TCPECHO_H_#define TCP_ECHO_PORT 5001void TCP_Echo_Init(void);#endif

接下来只要用类似步骤4一样添加头文件,再在主循环上方加一条 TCP_Echo_Init();
编译下载后,电脑上的网络助手配置为客户端,填入板子IP和端口号,连接成功,发送信息后会发现板子会返回相同的数据给网络助手。

当我们把客户端代码和服务器端代码都配置好时,STM32可以同时接收数据,也可以发送数据。
在这里插入图片描述


三、总结

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


http://chatgpt.dhexx.cn/article/ZVlANYcT.shtml

相关文章

minicap介绍

从WEB 端批量移动设备管理控制工具 STF 的环境搭建和运行文章了解到STF这个工具&#xff0c;然后试用了一下。最近在做一个测试工具&#xff0c;发现Android原生的截图工具截图非常缓慢&#xff0c;然后想起了stf工具中截图非常快&#xff0c;甚至连执行monkey的动作都能在web端…

​ MinIO​使用

引言&#xff1a;为什么要使用minio MinIO是对象存储服务,它基于Apache License 开源协议&#xff0c;兼容Amazon S3云存储接口。适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。类似于腾讯的oss或者阿…

MiniApp Dev

小程序开发 MiniApp Dev 2_WinkeyTseng_YongTai的博客-CSDN博客 MiniApp Dev 3_WinkeyTseng_YongTai的博客-CSDN博客 MiniApp Dev 4_spencer_tseng的博客-CSDN博客

MinIO的简单实用(一)

一、什么是MinIO MinIO是在GNU Affero 通用公共许可证v3.0下发布的高性能对象存储。它与AmazonS3云存储服务API兼容。使用MinIO为机器学习、分析和应用程序工作负载构建高性能基础架构。 MinIO是高性能对象存储&#xff0c;什么是对象存储&#xff08;Object Storage Service&…

取代奶瓶Minidwep-gtk破解WPA 全攻略

原文地址为&#xff1a; 取代奶瓶Minidwep-gtk破解WPA 全攻略 取代奶瓶Minidwep-gtk 破 WPA 全攻略 目录 1、 CDlinux 下使用 minidwepgtk 获取握手包并使用自带的字典破解 2、 自带的字典破解不出密码时使用 U 盘外挂字典继续暴力破解密码 3、 将握手包拷贝到 Windows 系统下…

Minidwep-gtk字典 破 WPA

取代奶瓶Minidwep-gtk 破 WPA 全攻略 目录 1、 CDlinux 下使用 minidwepgtk 获取握手包并使用自带的字典破解 2、 自带的字典破解不出密码时使用 U 盘外挂字典继续暴力破解密码 3、 将握手包拷贝到 Windows 系统下使用 ewsa 工具高速破解密码 4、破解 WPA 加密“握手包”字典的…

无线密码破解----minidwep-gtk的PIN破解方法

原文地址为&#xff1a; 无线密码破解----minidwep-gtk的PIN破解方法 使用虚拟机对minidwep-gtk进行PIN破解 用CDLINUX支持8187和3070_30211版.iso系统PJpin码 1.用虚拟机的好处是方便&#xff0c;可以一边破解&#xff0c;一边上网做其他事情。 虚拟机的安装非常简单&#xf…

完整安装minidwep-gtk教程

完整安装minidwep-gtk教程 一&#xff1a;安装Aircrack-ng 安装依赖软件包 sudo apt-get install build-essential libssl-dev iw 下载软件包并解压缩 wget http://download.aircrack-ng.org/aircrack-ng-1.1.tar.gz tar-zxvf aircrack-ng-1.1.tar.gz cd aircrack-ng-1.1 …

移动网优大神VoLTE学习笔记(五):被叫信令流程

文/张阳&#xff0c;本文来源于微信公众号&#xff1a;网优小谈&#xff08;wireless_talk&#xff09; VoLTE的被叫信令流程相比主叫信令流程要复杂一点&#xff0c;一般通信系统的被叫信令流程相比主叫信令流程都要复杂一点&#xff0c;因为往往不知道用户的位置需要进行相应…

对SDP的理解

一、SDP 是什么 SDP&#xff08;Session Description Protocal&#xff09;会话描述协议 主要用于两个会话开始之前的媒体协商&#xff0c;用于建立会话的。 这里要分清会话&#xff1a;SIP协议也是只是用来建立会话的&#xff0c;真正的会话说白了是媒体传输&#xff0c;而在…

RTSP服务器:RTP传输AAC流

工作流程&#xff1a; 1&#xff09;读取ADTS头&#xff08;7字节&#xff09;&#xff0c;解析得到aac帧的信息&#xff08;频率&#xff0c;声道&#xff0c;帧长度&#xff09; 2&#xff09;读取aac原始数据块&#xff0c;使用RTP打包aac原始数据 RTP打包h264码流时&…

webrtc会话建立

WebRTC SDP 解析 还我漂漂拳哒哒哒关注 0.5032019.03.06 13:01:21字数 1,954阅读 3,150 sdp&#xff08;Session Description Protocol&#xff09;是一种会话描述协议&#xff0c;属于文本协议&#xff0c;即WebRTC中常说的信令&#xff08;Signalling&#xff09;&#xff…

H.264视频的RTP有效负载格式 (RFC-3984)

RFC文档链接 本备忘录的状态 略 摘要 本备忘录描述了ITU-T建议的H.264视频编解码器和技术上相同的ISO/IEC国际标准14496-10视频编解码器的RTP有效载荷格式。RTP有效载荷格式允许在每个RTP有效载荷中对H.264视频编码器产生的一个或多个网络抽象层单元&#xff08;NALU&#…

音视频协议-RTP协议打包

目录 H264打包RTP的方法 RTP打包AAC 1. H264打包RTP的方法 RTP的特点不仅仅支持承载在UDP上&#xff0c;这样利于低延迟音视频数据的传输&#xff0c;另外一个特点是它允许通过其它协议接收端和发送端协商音视频数据的封装和编解码格式&#xff0c;这样固定头的playload typ…

webRTC原理及信令简介

WebRtc基本概念及协议介绍 术语 Signaling channel(信令通道) a) 一种资源&#xff0c;使应用程序可以通过交换信令消息来发现&#xff0c;建立&#xff0c;控制和终止对等连接 b) 信令消息是两个应用程序相互交换以建立对等连接的元数据。该元数据包括本地媒体信息&#xff0…

国网B接口调阅实时视频(INVITE)接口描述和消息示例

前面三篇blog分别介绍国网B接口注册、资源上报和资源信息获取&#xff0c;今天过一下国网B接口调阅实时视频相关的接口描述和消息示例&#xff0c;做过GB28181设备接入的都知道&#xff0c;国网B接口调阅实时视频流程和GB28181的基本一致的&#xff0c;区别在于SDP的一些参数描…

SIP协议之PRACK机制

SIP PRACK&#xff08;Provisional Response ACKnowledgement&#xff09;是由SIP的扩展协议RFC3262定义的&#xff0c;旨在为SIP的临时应答提供传输的可靠性。扩展机制使用选项100rel和临时应答方法PRACK实现。该机制同SIP协议中的2xx对INVITE应答的可靠机制类似。 流程图&am…

HackTheBox: Arctic靶场

废话不多说直接开始&#xff1a; 第一步是在计算机上运行NMAP&#xff1a; # Nmap 7.80 scan initiated Sat Sep 19 14:54:46 2020 as: nmap -sV -O -sC -p- -oN scan 10.10.10.11 Nmap scan report for 10.10.10.11 Host is up (0.021s latency). Not shown: 65532 filtered…

webrtc sdp详解

SDP&#xff08;Session Description Protocol&#xff09;是一种通用的会话描述协议&#xff0c;主要用来描述多媒体会话&#xff0c;用途包括会话声明、会话邀请、会话初始化等。 WebRTC主要在连接建立阶段用到SDP&#xff0c;连接双方通过信令服务交换会话信息&#xff0c;…

SIP协议之呼叫流程

SIP呼呼叫是SIP协议最基本的功能。一个用户呼叫另外一个用户最终完成多媒体通话。此处以常见的B2BUA的服务器模式进行介绍。 环境说明&#xff1a; 主叫&#xff1a;1006 192.168.1.131 被叫&#xff1a;1012 192.168.0.24 SIP服务器&#xff08;以下简称服务器&#xff09;…