1. 环境准备与CubeMX基础配置折腾了一周终于把STM32H743的以太网调通发现网上大多数教程都存在配置遗漏。这里分享我的完整配置流程从CubeMX安装到最终Ping通每个步骤都经过实测验证。首先确保安装STM32CubeMX 6.8.0和对应的HAL库。我遇到过因为版本不匹配导致ETH初始化失败的情况建议通过Help - Check for Updates进行升级。创建新工程时直接在搜索框输入STM32H743VI根据实际芯片型号选择双击进入配置界面。注意CubeMX默认生成的代码会覆盖用户修改建议先在Project Manager选项卡勾选Generate peripheral initialization as a pair of .c/.h files。2. Cache与MPU的关键配置2.1 Cortex-M7缓存设置H743的Cache配置是第一个大坑。在System Core - CORTEX_M7中必须配置两个MPU区域第一个区域设置为Device类型起始地址0x30040000ETH DMA描述符地址Size设256B关闭所有Cache第二个区域设置为Normal类型起始地址0x30000000SRAM3Size设64KB开启Write-back Cache// 生成的MPU配置代码示例 MPU_Region_InitTypeDef MPU_InitStruct {0}; MPU_InitStruct.Enable MPU_REGION_ENABLE; MPU_InitStruct.Number MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress 0x30040000; MPU_InitStruct.Size MPU_REGION_SIZE_256B; MPU_InitStruct.TypeExtField MPU_TEX_LEVEL0; MPU_InitStruct.IsCacheable MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(MPU_InitStruct);2.2 时钟树配置ETH需要精确的50MHz时钟在Clock Configuration选项卡确保HCLK不超过400MHz我设置到400MHz稳定运行在ETH configuration选择RMII模式检查PHY时钟是否来自PA1ETH_REF_CLK3. 硬件接口配置3.1 GPIO引脚设置根据LAN8720硬件设计配置复位引脚我用的PH15配置为GPIO_Output供电控制PA0如有初始电平根据硬件设计设置RMII接口PA1: REF_CLKPA2: MDIOPA7: CRS_DVPB11: TX_ENPB12: TXD0PB13: TXD1PG11: RXD0PG12: RXD1PG13: RXER实测发现必须将所有ETH相关GPIO速度设为High否则会出现丢包。3.2 LAN8720硬件复位在main.c的初始化代码中添加硬件复位序列// 硬件复位LAN8720 HAL_GPIO_WritePin(GPIOH, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOH, GPIO_PIN_15, GPIO_PIN_SET); HAL_Delay(100);4. LWIP协议栈配置4.1 CubeMX中的ETH设置在Connectivity - ETH中选择RMII接口模式勾选Auto NegotiationPHY Address填0根据硬件设计可能为0或14.2 LWIP参数调整在Middleware - LWIP中关闭DHCP设置静态IP如192.168.1.100内存配置MEM_SIZE改为16*1024PBUF_POOL_SIZE改为16TCP_MSS改为1460在opt.h中取消定义LWIP_DHCP4.3 关键代码修改在ethernetif.c中找到low_level_init函数修改PHY检测逻辑// 修改PHY检测为LAN8720 do { if (ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) ! 0xFFFF) break; HAL_Delay(1); } while (--retries); // 设置LAN8720特殊寄存器 ETH_WritePHYRegister(PHY_ADDRESS, PHY_BCR, PHY_FULLDUPLEX_100M);5. 调试与问题排查5.1 常见Ping失败原因Cache问题表现为能收到ARP请求但无法响应检查MPU配置时钟不同步用示波器测量PA1是否有50MHz时钟PHY未复位测量nRST引脚波形确保复位时间足够内存溢出在lwipopts.h中增大MEM_SIZE5.2 调试技巧在eth.c中添加调试输出void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) { printf(Packet received, length: %d\n, heth-RxFrameInfos.length); }使用Wireshark抓包过滤目标IP查看是否收到请求6. 完整工程验证最后在main函数中添加网络测试代码// 启动ETH HAL_ETH_Start(heth); // 开启DHCP如需 // dhcp_start(gnetif); // 简单Ping测试 ip_addr_t target_ip; IP4_ADDR(target_ip, 192,168,1,1); for (;;) { if (netif_is_link_up(gnetif)) { err_t err ping_send(gnetif, target_ip); printf(Ping result: %d\n, err); } HAL_Delay(1000); }工程编译下载后先用网线直连电脑在电脑端ping 192.168.1.100测试。如果一切正常应该能看到稳定的响应。我在最终调试时发现必须严格按照上述顺序配置才能保证稳定性特别是Cache配置和PHY复位时序这两个环节最容易出问题。
STM32H743以太网实战:基于CubeMX 6.8.0与LAN8720的LWIP移植避坑指南
发布时间:2026/5/15 23:21:18
1. 环境准备与CubeMX基础配置折腾了一周终于把STM32H743的以太网调通发现网上大多数教程都存在配置遗漏。这里分享我的完整配置流程从CubeMX安装到最终Ping通每个步骤都经过实测验证。首先确保安装STM32CubeMX 6.8.0和对应的HAL库。我遇到过因为版本不匹配导致ETH初始化失败的情况建议通过Help - Check for Updates进行升级。创建新工程时直接在搜索框输入STM32H743VI根据实际芯片型号选择双击进入配置界面。注意CubeMX默认生成的代码会覆盖用户修改建议先在Project Manager选项卡勾选Generate peripheral initialization as a pair of .c/.h files。2. Cache与MPU的关键配置2.1 Cortex-M7缓存设置H743的Cache配置是第一个大坑。在System Core - CORTEX_M7中必须配置两个MPU区域第一个区域设置为Device类型起始地址0x30040000ETH DMA描述符地址Size设256B关闭所有Cache第二个区域设置为Normal类型起始地址0x30000000SRAM3Size设64KB开启Write-back Cache// 生成的MPU配置代码示例 MPU_Region_InitTypeDef MPU_InitStruct {0}; MPU_InitStruct.Enable MPU_REGION_ENABLE; MPU_InitStruct.Number MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress 0x30040000; MPU_InitStruct.Size MPU_REGION_SIZE_256B; MPU_InitStruct.TypeExtField MPU_TEX_LEVEL0; MPU_InitStruct.IsCacheable MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(MPU_InitStruct);2.2 时钟树配置ETH需要精确的50MHz时钟在Clock Configuration选项卡确保HCLK不超过400MHz我设置到400MHz稳定运行在ETH configuration选择RMII模式检查PHY时钟是否来自PA1ETH_REF_CLK3. 硬件接口配置3.1 GPIO引脚设置根据LAN8720硬件设计配置复位引脚我用的PH15配置为GPIO_Output供电控制PA0如有初始电平根据硬件设计设置RMII接口PA1: REF_CLKPA2: MDIOPA7: CRS_DVPB11: TX_ENPB12: TXD0PB13: TXD1PG11: RXD0PG12: RXD1PG13: RXER实测发现必须将所有ETH相关GPIO速度设为High否则会出现丢包。3.2 LAN8720硬件复位在main.c的初始化代码中添加硬件复位序列// 硬件复位LAN8720 HAL_GPIO_WritePin(GPIOH, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOH, GPIO_PIN_15, GPIO_PIN_SET); HAL_Delay(100);4. LWIP协议栈配置4.1 CubeMX中的ETH设置在Connectivity - ETH中选择RMII接口模式勾选Auto NegotiationPHY Address填0根据硬件设计可能为0或14.2 LWIP参数调整在Middleware - LWIP中关闭DHCP设置静态IP如192.168.1.100内存配置MEM_SIZE改为16*1024PBUF_POOL_SIZE改为16TCP_MSS改为1460在opt.h中取消定义LWIP_DHCP4.3 关键代码修改在ethernetif.c中找到low_level_init函数修改PHY检测逻辑// 修改PHY检测为LAN8720 do { if (ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) ! 0xFFFF) break; HAL_Delay(1); } while (--retries); // 设置LAN8720特殊寄存器 ETH_WritePHYRegister(PHY_ADDRESS, PHY_BCR, PHY_FULLDUPLEX_100M);5. 调试与问题排查5.1 常见Ping失败原因Cache问题表现为能收到ARP请求但无法响应检查MPU配置时钟不同步用示波器测量PA1是否有50MHz时钟PHY未复位测量nRST引脚波形确保复位时间足够内存溢出在lwipopts.h中增大MEM_SIZE5.2 调试技巧在eth.c中添加调试输出void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) { printf(Packet received, length: %d\n, heth-RxFrameInfos.length); }使用Wireshark抓包过滤目标IP查看是否收到请求6. 完整工程验证最后在main函数中添加网络测试代码// 启动ETH HAL_ETH_Start(heth); // 开启DHCP如需 // dhcp_start(gnetif); // 简单Ping测试 ip_addr_t target_ip; IP4_ADDR(target_ip, 192,168,1,1); for (;;) { if (netif_is_link_up(gnetif)) { err_t err ping_send(gnetif, target_ip); printf(Ping result: %d\n, err); } HAL_Delay(1000); }工程编译下载后先用网线直连电脑在电脑端ping 192.168.1.100测试。如果一切正常应该能看到稳定的响应。我在最终调试时发现必须严格按照上述顺序配置才能保证稳定性特别是Cache配置和PHY复位时序这两个环节最容易出问题。