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 所需引脚为 复用功能 + 高速 + 无上下拉。

c 复制代码
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_CLK
    GPIO_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 - MDIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);

    // PC1 - MDC
    GPIO_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)

c 复制代码
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)

c 复制代码
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 简单主函数框架

相关推荐
广药门徒4 小时前
最小硬件系统概念及其组成
单片机·嵌入式硬件
GXSC6 小时前
国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717
嵌入式硬件
啵啵学习7 小时前
Linux 里 su 和 sudo 命令这两个有什么不一样?
linux·运维·服务器·单片机·ubuntu·centos·嵌入式
可乐鸡翅好好吃8 小时前
通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB
c语言·stm32·单片机·嵌入式硬件·bug·keil
才鲸嵌入式9 小时前
01 Ubuntu20.04下编译QEMU8.2.4,交叉编译32位ARM程序,运行ARM程序的方法
linux·c语言·单片机·嵌入式·arm·qemu·虚拟机
广药门徒11 小时前
我认为STM32输入只分为模拟输入 与 数字输入
stm32·单片机·嵌入式硬件
早睡的叶子11 小时前
proteus8安装教程
stm32·嵌入式硬件
天月风沙14 小时前
PX4 | 无人机关闭磁力计罗盘飞行(yaw estimate error报错解决方法)
单片机·嵌入式硬件·mcu·无人机
计蒙不吃鱼17 小时前
星闪开发之Server-Client 指令交互控制红灯亮灭案例解析(SLE_LED详解)
嵌入式硬件·物联网·iot·星闪·星闪开发
想搞嵌入式的小白17 小时前
STM32 NVIC中断控制器
stm32·单片机·嵌入式硬件·nvic