STM32 之网口资源

1 网口资源介绍

STM32F407 是 STMicroelectronics 推出的高性能 ARM Cortex-M4 微控制器,具备多种外设接口,其中包括一个 Ethernet MAC 控制器(带 IEEE 1588 支持)。这意味着你可以使用 STM32F407 实现网络通信功能(通过网口,即以太网口)。

1.1 STM32F407 的以太网特性

MAC 层支持:集成的以太网 MAC(ENET),支持 10/100 Mbps 全双工/半双工通信。

需要外部 PHY 芯片:STM32F407 只提供 MAC 控制器,需要通过 RMII 或 MII 接口 连接外部 PHY 芯片(如 LAN8720、DP83848 等)来实现物理层通信。

支持 DMA:支持以太网 DMA,提高数据吞吐效率。

支持 LWIP 协议栈:可以使用 LWIP(轻量级 IP 协议栈)来实现 TCP/IP 协议通信。

1.2 连接方式

硬件连接

PHY 芯片(如 LAN8720):通过 RMII 接口与 STM32F407 连接。

晶振要求:通常 PHY 需要 50MHz 时钟,STM32F407 可通过 MCO 输出时钟。

RJ45 接口:连接外部网络,部分模块集成了变压器和 PHY。

接口引脚(RMII 模式),常用引脚如下:

在这里插入图片描述
对应电路图

在这里插入图片描述

1.3 常见应用

  1. TCP/UDP 通信

  2. 远程控制设备

  3. 嵌入式 Web 服务器(通过 LWIP + HTTPD)

  4. Modbus-TCP、MQTT 等协议实现

2 代码初始化流程

2.1 配置 GPIO 引脚

使用 GPIO_InitTypeDef,设置 RMII 所需引脚为 复用功能 + 高速 + 无上下拉。

void ETH_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIOs clocks */RCC_AHB1PeriphClockCmd(ETH_MDIO_GPIO_CLK            | ETH_MDC_GPIO_CLK          |ETH_RMII_REF_CLK_GPIO_CLK    | ETH_RMII_CRS_DV_GPIO_CLK  |ETH_RMII_RXD0_GPIO_CLK       | ETH_RMII_RXD1_GPIO_CLK    |ETH_RMII_TX_EN_GPIO_CLK      | ETH_RMII_TXD0_GPIO_CLK    |ETH_RMII_TXD1_GPIO_CLK       | ETH_NRST_GPIO_CLK         , ENABLE);/* Enable SYSCFG clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  /* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM324xx-EVAL  */#ifdef PHY_CLOCK_MCO/* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);#endif /* PHY_CLOCK_MCO */SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE  /* Mode RMII with STM324xx-EVAL */SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif/* Ethernet pins configuration ************************************************//*ETH_MDIO -------------------------> PA2ETH_MDC --------------------------> PC1ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14ETH_NRST -------------------------> PI1*/GPIO_InitStructure.GPIO_Pin = ETH_NRST_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;  GPIO_Init(ETH_NRST_PORT, &GPIO_InitStructure);ETH_NRST_PIN_LOW();_eth_delay_(LAN8720A_RESET_DELAY);ETH_NRST_PIN_HIGH();_eth_delay_(LAN8720A_RESET_DELAY);/* Configure ETH_MDIO */GPIO_InitStructure.GPIO_Pin = ETH_MDIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(ETH_MDIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_MDIO_PORT, ETH_MDIO_SOURCE, ETH_MDIO_AF);/* Configure ETH_MDC */GPIO_InitStructure.GPIO_Pin = ETH_MDC_PIN;GPIO_Init(ETH_MDC_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_MDC_PORT, ETH_MDC_SOURCE, ETH_MDC_AF);/* Configure ETH_RMII_REF_CLK */GPIO_InitStructure.GPIO_Pin = ETH_RMII_REF_CLK_PIN;GPIO_Init(ETH_RMII_REF_CLK_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_REF_CLK_PORT, ETH_RMII_REF_CLK_SOURCE, ETH_RMII_REF_CLK_AF);/* Configure ETH_RMII_CRS_DV */GPIO_InitStructure.GPIO_Pin = ETH_RMII_CRS_DV_PIN;GPIO_Init(ETH_RMII_CRS_DV_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_CRS_DV_PORT, ETH_RMII_CRS_DV_SOURCE, ETH_RMII_CRS_DV_AF);/* Configure ETH_RMII_RXD0 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_RXD0_PIN;GPIO_Init(ETH_RMII_RXD0_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_RXD0_PORT, ETH_RMII_RXD0_SOURCE, ETH_RMII_RXD0_AF);/* Configure ETH_RMII_RXD1 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_RXD1_PIN;GPIO_Init(ETH_RMII_RXD1_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_RXD1_PORT, ETH_RMII_RXD1_SOURCE, ETH_RMII_RXD1_AF);/* Configure ETH_RMII_TX_EN */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TX_EN_PIN;GPIO_Init(ETH_RMII_TX_EN_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TX_EN_PORT, ETH_RMII_TX_EN_SOURCE, ETH_RMII_TX_EN_AF);/* Configure ETH_RMII_TXD0 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TXD0_PIN;GPIO_Init(ETH_RMII_TXD0_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TXD0_PORT, ETH_RMII_TXD0_SOURCE, ETH_RMII_TXD0_AF);/* Configure ETH_RMII_TXD1 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TXD1_PIN;GPIO_Init(ETH_RMII_TXD1_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TXD1_PORT, ETH_RMII_TXD1_SOURCE, ETH_RMII_TXD1_AF);	
}

2.2 MAC 寄存器配置

static void ETH_MACDMA_Config(void)
{/* Enable ETHERNET clock  */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);/* Reset ETHERNET on AHB Bus */ETH_DeInit();/* Software reset */ETH_SoftwareReset();/* Wait for software reset */while (ETH_GetSoftwareResetStatus() == SET);/* ETHERNET Configuration --------------------------------------------------*//* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ETH_StructInit(&ETH_InitStructure);/* Fill ETH_InitStructure parametrs *//*------------------------   MAC   -----------------------------------*//* 开启网络自适应功能 */ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
//  ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; 
//  ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
//  ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;   /* 关闭反馈 */ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;/* 关闭重传功能 */ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;/* 关闭自动去除PDA/CRC功能  */ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;/* 关闭接收所有的帧 */ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;/* 允许接收所有广播帧 */ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;/* 关闭混合模式的地址过滤  */ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;/* 对于组播地址使用完美地址过滤    */ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;/* 对单播地址使用完美地址过滤  */ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#ifdef CHECKSUM_BY_HARDWARE/* 开启ipv4和TCP/UDP/ICMP的帧校验和卸载   */ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
#endif/*------------------------   DMA   -----------------------------------*/  /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, if the checksum is OK the DMA can handle the frame otherwise the frame is dropped *//*当我们使用帧校验和卸载功能的时候,一定要使能存储转发模式,存储转发模式中要保证整个帧存储在FIFO中,这样MAC能插入/识别出帧校验值,当真校验正确的时候DMA就可以处理帧,否则就丢弃掉该帧*//* 开启丢弃TCP/IP错误帧 */ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;/* 开启接收数据的存储转发模式  */ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;/* 开启发送数据的存储转发模式   */ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;/* 禁止转发错误帧 */ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;/* 不转发过小的好帧 */ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;/* 打开处理第二帧功能 */ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;/* 开启DMA传输的地址对齐功能 */ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;/* 开启固定突发功能 */ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;/* DMA发送的最大突发长度为32个节拍 */ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;/*DMA接收的最大突发长度为32个节拍 */ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;/* Configure Ethernet *//* 配置ETH */EthStatus = ETH_Init(&ETH_InitStructure, ETHERNET_PHY_ADDRESS);
}

3 加载tcp/ip协议栈

3.1 初始化 LWIP 协议栈 (lwip/init.c)

3.2 配置 IP 地址、MAC 地址

3.3 通过 ethernetif.c 与 HAL 底层对接

3.4 在主循环中调用 sys_check_timeouts(),维护超时机制

4 简单主函数框架

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Almalinux中出现ens33 ethernet 未托管 -- lo loopback 未托管 --如何处理:

解决 AlmaLinux 中网络接口 ens33 和 lo 显示为“未托管”的问题 当 AlmaLinux 系统中的网络接口(如 ens33 和 lo)显示为“未托管”时,这意味着这些接口没有被 NetworkManager 正常管理。以下是详细的分析和解决方案: 1. 检查 N…

数据库中关于查询选课问题的解法

前言 今天上午起来复习了老师上课讲的选课问题。我总结了三个解法以及一点注意事项。 选课问题介绍 简单来说就是查询某某同学没有选或者选了什么课。然后查询出该同学的姓名,学号,课程号,课程名之类的。 sql文件我上传了。大家可以尝试练…

Qt图表库推荐指南与分析

目录 一、核心图表库横向对比1. Qt Charts2. QCustomPlot3. QWT (Qt Widgets for Technical Applications)4. KD Chart 二、性能与功能对比矩阵三、选型策略与组合方案1. 通用型需求:2. 技术型场景:3. 企业级开发: 四、未来趋势与避坑指南1. …

LangGraph 2 - 智能体开发、流式传输、模型调用、工具、MCP、上下文、内存、人机协同、部署、UI

文章目录 使用LangGraph进行智能体开发什么是智能体?核心特性高层构建模块包生态系统 运行代理基础用法输入与输出输入格式使用自定义 Agent 状态 输出格式流式输出最大迭代次数其他资源 流式传输代理进度监控LLM 令牌工具更新流式多模态传输禁用流式传输其他资源 L…

Android同屏采集并推送RTMP和启动轻量级RTSP服务技术实践

随着视频直播需求的不断提升,如何实现高效的实时视频采集和推流,成为了开发者们关注的重点。本文将结合大牛直播SDK,介绍如何在 Android 平台实现 同屏采集、推送 RTMP 流,以及如何启动轻量级 RTSP 服务,让开发者快速搭…

如何自定义 Spring MVC 的配置?

我们可以通过实现 WebMvcConfigurer 接口来自定义 Spring MVC (尤其是在 Spring Boot 环境中) 的配置。 以下是通过实现 WebMvcConfigurer 接口的配置方法: 核心:创建一个 Configuration 类并实现 WebMvcConfigurer import org.springframework.conte…

如何提升新加坡SAP实施成功率?解答中企出海的“税务合规密码” | 工博科技SAP金牌服务商

目录 中新双边经贸合作概况 ​编辑 新加坡数字化实施核心挑战 一、财税合规体系适配 税务申报差异 会计准则协同 二、人力资源合规管理 薪酬体系配置 数据安全规范 企业实施建议方案 一、系统建设策略 选择具备以下资质的实施服务商: 构建标准化功能模块…

人工智能视角下的安全:可视化如何塑造恶意软件检测

摘要 恶意软件是一种持续存在的网络安全威胁,它越来越多地通过复杂的攻击向量,瞄准互连的数字系统,如桌面、移动和物联网平台。通过利用这些漏洞,攻击者会损害现代数字生态系统的完整性和弹性。为了应对这一风险,安全…

游戏引擎学习第293天:移动Familiars

回顾并为今天的内容定下基调 我们正在做一款完整的游戏,今天的重点是“移动模式”的正式化处理。目前虽然移动机制大致能运作,但写法相对粗糙,不够严谨,我们希望将其清理得更规范,更可靠一点。 目前脑逻辑&#xff0…

golang -- 如何让main goroutine等一等

目录 引言一、sync.WaitGroup二、channel创建channle操作缓冲多返回值模式单向通道 引言 在不做修饰的程序中,代码是串行执行的 串行、并发与并行串行:事物按照一定的发展顺序并发:同一时间段执行多个任务(一边吃饭一边看电视&am…

第31讲 循环缓冲区与命令解析

串口在持续接收数据时容易发生数据黏包(先接收的数据尚未被处理,后面的数据已经将内存覆盖)的情况,循环缓冲区的本质就是将串口接受到的数据马上拷贝到另外一块内存之中。为了避免新来的数据覆盖掉尚未处理的数据,一方…

UE 材质基础 第一天

课程:虚幻引擎【UE5】材质宝典【初学者材质基础入门系列】-北冥没有鱼啊_-稍后再看-哔哩哔哩视频 随便记录一些 黑色是0到负无穷,白色是1到无穷 各向异性 有点类似于高光,可以配合切线来使用,R G B 相当于 X Y Z轴,切…

编译原理--期末复习

本文是我学习以下博主视频所作的笔记,写的不够清晰,建议大家直接去看这些博主的视频,他/她们讲得非常好: 基础知识概念: 1.【【编译原理】期末复习 零基础自学】,资料 2.【编译原理—混子速成期末保过】&…

【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】7. DeepSeek 的发展历程与关键技术 【DeepSeek论文精读】11. 洞察 DeepSeek-V3&#xff…

宝塔面板部署前后端项目SpringBoot+Vue2

这篇博客主要用来记录宝塔部署前端后端项目的过程。因为宝塔部署有点麻烦,至少在我看来挺麻烦的。我还是喜欢原始的ssh连接服务器进行操作。但是公司有项目用到了宝塔,没办法啊,只能摸索记录一下。 我们需要提前准备好后端项目的jar包和前端项…

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备,其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大,对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…

LangGraph 7 - Platform - Agentic RAG、监督、SQL代理、追踪、私密对话、认证、RemoteGraph、LangSmith

文章目录 代理式检索增强生成(Agentic RAG)安装 1、预处理文档2、创建检索器工具3、生成查询4、文档分级5、问题重写6、生成答案7、构建流程图8、运行智能RAG代理 多智能体监督系统安装配置1、创建工作代理研究代理数学代理工具 2、使用 langgraph-super…

生命之树--树形dp

1.树形dp--在dfs遍历树的同时dp&#xff0c;从上到下递归&#xff0c;到叶子是边界条件 https://www.luogu.com.cn/problem/P8625 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int> pii; int n,c; ll …

10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析

LangChain Community 项目:Model I/O, Retrieval, Agent Tooling 关键词:LangChain Model I/O, 检索增强生成, Agent 工具链, 多路召回策略, 工具调用协议 1. Model I/O 模块:大模型交互标准化接口 Model I/O 是 LangChain 生态中连接大模型的核心模块,定义了统一的输入输…

鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp

UniApp 实现图片上传与压缩功能 前言 在移动应用开发中&#xff0c;图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片&#xff0c;都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大&#xff0c;直接上传会导致流量消耗过大、上传时间过长&#x…