STM32F407单片机编程入门(二十七)以太网接口详解及实战含源码

文章目录

    • 一.概要
    • 二.单片机以太网系统基本结构
      • 1.OSI 七层模型
      • 2.单片机实现以太网功能组成
    • 三.STM32F407VET6单片机以太网内部结构
      • 1.MII接口介绍
      • 2.RMII接口介绍
    • 四.LWIP TCP/IP协议栈介绍
    • 五.PHY收发器LAN8720介绍
      • 1.LAN8720内部框图
      • 2.LAN8720应用电路
      • 3.LAN8720以太网模块
    • 六.CubeMX配置一个LWIP的TCP/IP通讯协议实验
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

以太网(Ethernet)。指的是由Xerox公司创建并由Xerox,Intel和DEC公司联合开发的基带局域网规范。以太网络使用CSMA/CD(载波监听多路访问及冲突检测技术)技术,并以10M/S的速率运行在多种类型的电缆上。以太网与IEEE802·3系列标准相类似。 它不是一种具体的网络,是一种技术规范。 以太网是当今现有局域网采用的最通用的通信协议标准。该标准定义了在局域网(LAN)中采用的电缆类型和信号处理方法。以太网在互联设备之间以10~100Mbps的速率传送信息包,双绞线电缆10 Base T以太网由于其低成本、高可靠性以及10Mbps的速率而成为应用最为广泛的以太网技术。

以太网是一种广泛应用于各种计算机局域网技术,被普遍用于以下场景:

‌‌工业自动化‌:以太网在工业自动化领域有着广泛的应用。它能够满足工业自动化系统对大量数据传输和实时性的需求,支持多设备连接,适应高温、高湿等恶劣环境,适用于复杂的工业环境。

‌‌企业网络‌:在企业网络中,以太网用于构建高速、稳定的内部网络,支持数据、视频和语音等多业务传输。它广泛应用于大型企业和数据中心,提供高速数据传输支持。

‌‌智能交通‌:在智能交通系统中,以太网连接交通监控设备,实现交通数据的实时传输。这有助于提高交通管理的效率和安全性。

远程监控‌:在远程监控系统中,以太网用于将监控数据传输到控制中心,提高监控效率。它广泛应用于各种远程监控场景,如‌环境监测、设备监控等。

‌数据中心‌:数据中心使用以太网连接服务器和存储设备,实现高速数据交换。‌万兆以太网在数据中心的应用尤为广泛,满足高性能计算和大数据处理的需求。

‌‌超级计算中心‌:在超级计算中心,万兆以太网设备提供高密度的端口和快速的交换性能,满足高性能计算机架构和网络的需求,促进计算机科学研究的发展。

二.单片机以太网系统基本结构

1.OSI 七层模型

‌OSI七层模型‌是国际标准化组织(ISO)定义的一个网络通信框架,旨在为不同计算机系统之间的通信提供一个标准化的方法。这个模型将网络通信过程划分为七个层次,从物理层到应用层,每一层都有其特定的功能和协议。

在这里插入图片描述

2.单片机实现以太网功能组成

一般单片机组成以太网所需部件是:单片机+MAC+PHY+RJ45。

STM32F407VET6内部自带MAC,所以要组成以太网,主要部件就是
STM32F407VET6+PHY+RJ45。
我们常见的以太网PHY芯片是DP83848和LAN8720。

在这里插入图片描述

以太网MAC‌:即媒体访问控制子层协议‌,位于OSI七层协议中的数据链路层下半部分,主要负责控制与连接物理层的物理介质。MAC协议的主要功能包括在发送数据时判断是否可以发送,如果可以发送,则给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据时,MAC协议首先判断输入的信息是否发生传输错误,如果没有错误,则去掉控制信息发送至逻辑链路控制层。

以太网PHY:即物理层接口收发器,是网络通信中的一个重要组成部分,它实现了OSI模型中的物理层。IEEE-802.3标准定义了以太网PHY,包括多个子层,如MII/GMII(介质独立接口)、PCS(物理编码子层)、PMA(物理介质附加子层)、PMD(物理介质相关子层)和MDI子层。这些子层共同定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。

三.STM32F407VET6单片机以太网内部结构

在这里插入图片描述
以太网在进行数据发送时,单片机首先将数据由系统存储器以 DMA 的方式送至发送 FIFO (Tx FIFO) 进行缓冲,再通过 MAC内核发送,MAC通过RMII或者MII接口与外部PHY进行通讯。
以太网在进行数据接收时,接收 FIFO (Rx FIFO) 则存储通过线路接收的以太网帧,直到这些帧通过 DMA 传送到系统存储器。

1.MII接口介绍

介质独立接口 (MII) 定义了 10 Mbit/s 和 100 Mbit/s 的数据传输速率下 MAC 子层与 PHY 之
间的互连。

MII连接示意图
在这里插入图片描述

在这里插入图片描述

2.RMII接口介绍

精简介质独立接口 (RMII) 规范降低了 10/100 Mbit/s 下微控制器以太网外设与外部 PHY 间的引脚数。

RMII连接示意图

在这里插入图片描述

在这里插入图片描述

对比以上两种连接方式,RMII通过减少信号线数量和提高时钟频率,提供了一种在保持或提高数据传输速率的同时简化硬件设计的解决方案。这种接口在需要平衡成本、性能和复杂性的应用中特别有用‌,所以在STM32开发中,最常见的是RMII连接方式。

四.LWIP TCP/IP协议栈介绍

TCP/IP 协议栈是一系列网络协议的总和,它允许不同电子设备在因特网上进行通信。该协议采用4层结构,分别是应用层、传输层、网络层和网络接口层,每一层都依赖于其下面的层,同时为其上面的层提供服务。

TCP/IP 协议栈和传统的 OSI 模型并不完全对应。TCP/IP 协议是一个简化的模型,强调了实际的协议实现和因特网的实际运作方式。
在这里插入图片描述

Light weight IP(LWIP)是轻量化的 TCP/IP 协议,是瑞典计算机科学院(SICS)的 Adam Dunkels 开发的一个小型开源的 TCP/IP 协议栈。 LwIP 的设计初衷是:用少量的资源消耗(RAM)实现一个较为完整的 TCP/IP 协议栈, 在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。
LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。

LwIP是符合 TCP/IP 模型架构,规定了数据的格式、传输、路由和接收,以实现端到端的通信。

应用层:lwIP提供了TCP/IP协议栈的实现,包括HTTP,MQTT等协议
传输层:lwIP实现了TCP和UDP协议
网络层:lwIP实现了IP协议
网络接口层:lwIP并没有实现,这一层由硬件来实现
在这里插入图片描述

五.PHY收发器LAN8720介绍

‌LAN8720A是一款低功耗的10/100M以太网PHY芯片,符合EEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信。‌ 它内置了10-BASE-T/100BASE-TX全双工传输模块,支持10Mbps和100Mbps的传输速度。LAN8720A具有自协商功能,能够与目的主机自动选择最佳连接方式(速度和双工模式),并支持HP Auto-MDIX自动翻转功能,无需更换网线即可实现直连或交叉连接。此外,它还支持通过SMI串行管理接口和MAC接口进行配置和管理。
在这里插入图片描述

1.LAN8720内部框图

在这里插入图片描述

2.LAN8720应用电路

在这里插入图片描述

3.LAN8720以太网模块

LAN8720以太网模块是把PHY,RJ45都放在一块小板子上,只要开发板与模块通过RMII连接,就能组成以太网系统。
在这里插入图片描述

模块参考原理图
在这里插入图片描述

六.CubeMX配置一个LWIP的TCP/IP通讯协议实验

硬件准备:

STLINK接STM32F407VET6开发板,STLINK接电脑USB口。LAN8720模块接到开发板上,网线接模块的RJ45口跟电脑。
在这里插入图片描述

开发板以太网接口定义:
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

配置以太网RMII接口
在这里插入图片描述
配置中断
在这里插入图片描述
在这里插入图片描述
PHY选择DP83848
在这里插入图片描述
使能FreeRTOS
在这里插入图片描述

LWIP配置,IP地址,掩码,网关配置
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

添加代码

在这里插入图片描述

在这里插入图片描述

主要代码如下:

#define BOARD_IP  			 192,168,1,12   		//开发板ip 
#define BOARD_NETMASK   	 255,255,255,0   		//开发板子网掩码
#define BOARD_WG		   	 192,168,1,1   			//开发板子网关
#define BOARD_MAC_ADDR       0,0,0,0,0,1			//开发板MAC地址#define TCP_LOCAL_PORT     		8887 
#define TCP_SERVER_PORT    		8888
#define TCP_SERVER_IP   		192,168,1,11//服务器IP
/***********************************************************************
函数名称:void TCP_Client_Send_Data(unsigned char *buff)
功    能:TC[客户端发送数据函数
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:for(cpcb = tcp_active_pcbs;cpcb != NULL; cpcb = cpcb->next) 
***********************************************************************/
err_t TCP_Client_Send_Data(struct tcp_pcb *cpcb,unsigned char *buff,unsigned int length)
{err_t err;err = tcp_write(cpcb,buff,length,TCP_WRITE_FLAG_COPY);	//发送数据tcp_output(cpcb);//tcp_close(tcp_client_pcb);				//发送完数据关闭连接,根据具体情况选择使用	return err;					
}
extern union tcp_listen_pcbs_t tcp_listen_pcbs;
extern struct tcp_pcb *tcp_active_pcbs;  /* List of all TCP PCBs that are in a
/***********************************************************************
函数名称:Check_TCP_Connect(void)
功    能:检查连接
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:for(cpcb = tcp_active_pcbs;cpcb != NULL; cpcb = cpcb->next) 
***********************************************************************/\
struct tcp_pcb *Check_TCP_Connect(void)
{struct tcp_pcb *cpcb = 0;connect_flag = 0;for(cpcb = tcp_active_pcbs;cpcb != NULL; cpcb = cpcb->next){//	if(cpcb->local_port == TCP_LOCAL_PORT && cpcb->remote_port == TCP_SERVER_PORT)		//如果TCP_LOCAL_PORT端口指定的连接没有断开if(cpcb -> state == ESTABLISHED)  //如果得到应答,则证明已经连接上{connect_flag = 1;  						//连接标志break;							   	}}if(connect_flag == 0)  	// TCP_LOCAL_PORT指定的端口未连接或已断开{TCP_Client_Init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP); //重新连接cpcb = 0;}return cpcb;	
}
/***********************************************************************
函数名称:err_t RS232_TCP_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
功    能:完成RS232到TCP的数据发送
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:这是一个回调函数,当TCP客户端请求的连接建立时被调用
***********************************************************************/
err_t TCP_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{//tcp_client_pcb = pcb;return ERR_OK;
}
/***********************************************************************
函数名称:TCP_Client_Recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
功    能:tcp客户端接收数据回调函数
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:这是一个回调函数,当TCP服务器发来数据时调用
***********************************************************************/err_t  TCP_Client_Recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{struct pbuf *p_temp = p;if(p_temp != NULL){	tcp_recved(pcb, p_temp->tot_len);//获取数据长度 tot_len:tcp数据块的长度while(p_temp != NULL)	{				/******将数据原样返回*******************/tcp_write(pcb,p_temp->payload,p_temp->len,TCP_WRITE_FLAG_COPY); 	// payload为TCP数据块的起始位置       tcp_output(pcb);p_temp = p_temp->next;}		}else{tcp_close(pcb); 											/* 作为TCP服务器不应主动关闭这个连接? */}/* 释放该TCP段 */pbuf_free(p); 	err = ERR_OK;return err;
}
/***********************************************************************
函数名称:TCP_Client_Init(u16_t local_port,u16_t remote_port,unsigned char a,unsigned char b,unsigned char c,unsigned char d)
功    能:tcp客户端初始化
输入参数:local_port本地端口号;remote_port:目标端口号;a,b,c,d:服务器ip
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:
***********************************************************************/
void TCP_Client_Init(u16_t local_port,u16_t remote_port,unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{ip4_addr_t ipaddr,LocalAddress;err_t err;IP4_ADDR(&ipaddr,a,b,c,d);           //服务器IP地址tcp_client_pcb = tcp_new(); /* 建立通信的TCP控制块(Clipcb) */if (!tcp_client_pcb){return ;}	//IP4_ADDR(&LocalAddress,192,168,10,11);           //服务器IP地址	err = tcp_bind(tcp_client_pcb,IP_ADDR_ANY,local_port); /* 绑定本地IP地址和端口号 ,本地ip地址在LwIP_Init()中已经初始化*/if(err != ERR_OK){return ;}    tcp_connect(tcp_client_pcb,&ipaddr,remote_port,TCP_Connected);//注册回调函数tcp_recv(tcp_client_pcb,TCP_Client_Recv); 				/* 设置tcp接收回调函数 */
}unsigned char tcp_data[] = "tcp 客户端实验!\n";struct tcp_pcb *pcb;
void StartDefaultTask(void const * argument)
{/* init code for LWIP */MX_LWIP_Init();/* Infinite loop */TCP_Client_Init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP); //tcp客户端初始化/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){osDelay(1000);HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14);pcb = Check_TCP_Connect();if(pcb != 0){	TCP_Client_Send_Data(pcb,tcp_data,sizeof(tcp_data));	//该函数为主动向服务器发送函数,}/* handle periodic timers for LwIP *///	LwIP_Periodic_Handle(LocalTime);}/* USER CODE END StartDefaultTask */
}

实验效果:

禁用无线,启动以太网,打开TCP调试助手,配置为服务器监听模式,监听端口8888,板子上电不久,在TCP调试助手上就能看到192.168.1.12的IP地址的板子连接上来,并发送数据。
在这里插入图片描述

七.CubeMX工程源代码下载

通过网盘分享的文件:30.LAN8720以太网通讯实验.zip
链接: https://pan.baidu.com/s/1FIXLazqFihbv-RX8pACLMA 提取码: i6pm
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

STM32F407开发板加上LAN8720模块可以通过网络连接,实现远程控制、数据传输等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548152.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

测试的底层逻辑

写这篇文章,是希望把我的一些我认为是非常有价值的经验总结出来,能够帮助刚做测试不久的新同事,或者是测试经验丰富的老同事以共享。希望我们可爱的新同事,准备要在测试领域耕耘的伙伴,能够通过我的文章了解到测试的底…

【智慧城市】新中地GIS开发实训项目:华农优秀学生学习成果展示(3)智游江城

华农GIS开发实训项目答辩③-智游江城/一个月学习成果展示 项目名称:智游江城 项目功能 主页面展示 菜单功能 控制台 3D城市 查询 导航 游览路线推荐 测量 资讯

Node的安装和配置

1、安装Node 下载nodejs 链接:下载 | Node.js 中文网 官网下载最新版本:https://nodejs.org/en/download/ 一路点击Next,最后Finish。nodejs一般会下载在C盘里。 下载完成后,可以在cmd中查看安装的nodejs和npm版本,…

【C++】红黑树的封装——同时实现map和set

目录 红黑树的完善默认成员函数迭代器的增加 红黑树的封装红黑树模板参数的控制仿函数解决取K问题对Key的非法操作 insert的调整map的[]运算符重载 在list模拟实现一文中,介绍了如何使用同一份代码封装出list的普通迭代器和const迭代器。今天学习STL中两个关联式容器…

lime使用记录

主要是对预测结果进行可解释 import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_re…

thinkphp6调用微信商户支付-合单支付工具代码开发

合单支付基本在加盟店或是分公司或是营销系统里面常见。他的出现,打破了传统提现支付或是转账支付。他的业务原理其实很简单,就是需要优先申请非普通商户,其次是每个入驻的商户都需要申请普通商户。在这之前一定要申请好对应的场景服务&#…

大学学校用电安全远程监测预警系统

1.概述: 该系统是基于移动互联网、云计算技术,通过物联网传感终端,将办公建筑、学校、医院、工厂、体育场馆、宾馆、福利院等人员密集场所的电气安全数据,实时传输至安全用申管理服务器,为用户提供不间断的数据跟踪&a…

2024年项目经理不能错过的开源项目管理系统大盘点:全面指南

在2024年,随着项目管理领域的不断发展,开源项目管理系统成为了项目经理们提升工作效率的利器。本文将全面盘点几款备受推荐的开源项目管理系统,帮助项目经理们找到最佳选择,不容错过。 在项目管理日益复杂的今天,开源项…

鼎阳加油-IOC关键技术问题的解决记

鼎阳SDS6204示波器EPICS IOC的搭建-CSDN博客 这款示波器在labview下工作的很好,以前搭建逐束团3D系统时连续几个月不间断的工作连接从没断过线,并做过速率测试,单通道时10Hz的波形更新速率都可以达到: 鼎阳SDS6204示波器波形读取…

温州大麓青年音乐节即将开唱,37组音乐人国庆齐聚共谱华章

金秋十月,当丰收的季节与音乐的旋律相遇,温州将迎来一场前所未有的文化盛事。2024年10月1日至4日,温州大麓青年音乐节将在瓯海盛大举行。不仅是一场音乐的狂欢,更是一次多元文化的碰撞与融合。本届音乐节邀请了37组以上的知名音乐…

中级职称评审到底需要准备什么材料?

职称评审需要的材料非常非常多,其中涉及到各类表格,这些小资料,看起来简单,实则做起来复杂,不过这种资料只能当年通知出来之后进行整理,今天甘建二跟大家说一下职称评审中需要提前准备的一些重要材料&#…

酒店智能门锁SDK接口通用转换函数对接酒店收银-SAAS本地化-未来之窗行业应用跨平台架构

一、通用转换代码 public class CyberWin_LocakAPP{// public static byte[] bufCard new byte[128 1];public static string 未来之窗_美萍_getsign(byte[] bufCard){int i;string 酒店标识, s, s2;// 先读卡string 未来之窗 Encoding.ASCII.GetString(bufCard);// edt_Ca…

使用dayjs获取今天日期,星期几

<div>{{ curDate }} {{ getWeek() }}</div>import dayjs from dayjs;data(){return{curDate: dayjs(new Date()).format(YYYY年MM月DD日)} }, mounted() {this.getWeek(); }, methods: {// 获取今天星期几getWeek() {let datas dayjs().day();let week [日, 一, …

Linux 搭建与使用yolov5训练和检验自建模型的步骤

Linux 搭建与使用yolov5训练和检验自建模型的步骤 硬件设备 环境搭建(无cuda) 下载anaconda wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh bash Anaconda3-2024.06-1-Linux-x86_64.sh # 看完许可证后, yes, 后面选择安装路径, 可以按默认路…

打造高效合同管理平台,提升企业运营效率

在现代企业的日常运营中&#xff0c;合同管理扮演着至关重要的角色。无论是劳动协议、采购订单还是销售合同&#xff0c;各类合同都承载着企业的重要信息和业务节点。然而&#xff0c;面对日益复杂的商业环境和海量合同数据&#xff0c;如何有效管理和利用这些合同成为众多企业…

一些写论文必须要知道的神仙级网站!芝士AI(paperzz)

说实话&#xff0c;写论文真的是挺头疼&#xff0c;尤其到了毕业季的时候&#xff0c;没有过任何写作毕业论文的经验的毕业生而言更是如此&#xff0c;相信大家都有过这种状态&#xff0c;不知从何下笔&#xff0c;还需要面对论文进度的压力&#xff0c;并且时常需要寻找各种资…

基于Python大数据可视化的短视频推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

刘诗诗现身上海参加可隆自然而然露营节,户外风活力清新生图绝美!

9月26日&#xff0c;刘诗诗现身上海可隆自然而然露营节&#xff0c;活动现场&#xff0c;刘诗诗身着可隆OBLI-K露营冲锋衣外套&#xff0c;经典石库门配色既高级又具有质感&#xff0c;内里搭配简单白T与浅灰色短裙&#xff0c;户外运动风完美拿捏&#xff0c;所穿的鞋子是可隆…

vue单点登录异步执行请求https://xxx.com获取并处理数据

一、请求一个加密地址获取access_token再拼接字符串再次请求 接口返回数据 异步执行请求该地址获取数据并处理 二、请求代码第二步使用 access_token 获取 auth_key // 第二步&#xff1a;使用 access_token 获取 auth_keyconst access_token tokenData.access_token;const …

通配符与Powershell

通配符与正则表达式 通配符 通配符是一种特殊的语句&#xff0c;主要有*、?和[]&#xff0c;用来模糊搜索文件。 通配符表达意思举例说明*星号、匹配任何字符*.cpp匹配.cpp文件?问号、匹配任意一个字符*.?d匹配具有特定格式的文件[]中括号、匹配括号中的一个字符.[a-z]d代…