当前位置: 首页 > news >正文

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 常见应用

TCP/UDP 通信

远程控制设备

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

Modbus-TCP、MQTT 等协议实现

2 代码初始化流程

2.1 配置 GPIO 引脚

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

void ETH_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;/* Enable clocks */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |RCC_AHB1Periph_GPIOB |RCC_AHB1Periph_GPIOC, ENABLE);/* Configure RMII pins */// PA1 - REF_CLKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);// PA2 - MDIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);// PC1 - MDCGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);// 其余 RMII 引脚同理设置:PA7、PC4、PC5、PB11、PB12、PB13// ...
}

2.2 配置以太网 MAC 控制器(ETH_InitTypeDef)

void ETH_MAC_Config(void) {ETH_InitTypeDef ETH_InitStructure;/* Enable ETH clocks */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |RCC_AHB1Periph_ETH_MAC_Tx |RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);/* Software reset */ETH_DeInit();ETH_SoftwareReset();while (ETH_GetSoftwareResetStatus() == SET);/* Config */ETH_StructInit(&ETH_InitStructure);ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;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_ChecksumOffload = ETH_ChecksumOffload_Disable;ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;if (ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS) == ETH_SUCCESS) {ETH_Start(); // 启动 ETH MAC}
}

2.3 时钟输出(MCO 输出 50MHz)

RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);  // 假设 PLL 为 100MHz,则除2输出 50MHz

3 加载tcp/ip协议栈

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

3.2 配置 IP 地址、MAC 地址

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

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

4 简单主函数框架

相关文章:

  • 当 DeepSeek 遇见区块链:一场颠覆式的应用革命
  • 学习黑客蓝牙技术详解
  • SAP Fiori Elements Object Page
  • rocketmq 拉取消息
  • AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
  • 输入一个正整数,将其各位数字倒序输出(如输入123,输出321)
  • 【行为型之模板方法模式】游戏开发实战——Unity标准化流程与可扩展架构的核心实现
  • Prometheus 的介绍与部署(入门)
  • 第二章 变量和运算符
  • git push 报错:send-pack: unexpected disconnect while reading sideband packet
  • c#队列及其操作
  • vscode调试c/c++
  • 在linux中,如何使用malloc()函数向操作系统申请堆内存,使用free()函数释放内存。
  • python打包exe报错:处理文件时错误:Excel xlsx file; not supported
  • Python常见问题
  • 深入理解 Dijkstra 算法:原理、实现与优化
  • openfeign与dubbo调用下载excel实践
  • 如何获得sqoop-1.4.6.2.3.99.0-195.jar
  • 保持视频二维码不变,更新视频的内容
  • GMT之Bash语言使用
  • 绿景中国地产:洛杉矶酒店出售事项未能及时披露纯属疏忽,已采取补救措施
  • 第1现场 | 美国称将取消制裁,对叙利亚意味着什么
  • 高适配算力、行业大模型与智能体平台重塑工业城市
  • 英国首相斯塔默一处房产发生火灾
  • 万科:存续债券均正常付息兑付
  • 2024年度全国秋粮收购达3.45亿吨