news 2026/7/22 12:50:54

STM32F107单片机驱动Dp83848以太网芯片程序教程及代码例程分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F107单片机驱动Dp83848以太网芯片程序教程及代码例程分享

STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以太网芯片,本人发现其配置起来比较麻烦,所以整理了一份STM32F107单片机驱动Dp83848的程序代码例程,方便大家学习相关代码的配置

最近在项目里折腾STM32F107和DP83848这对搭档,这PHY芯片配置起来真是让人头大。特别是当硬件同事把原理图甩过来的时候,看到那一堆MDIO/MDC信号线就预感到要掉头发。好在最后摸清了套路,这里把关键代码和踩坑经验分享给大家。

先说硬件接法,DP83848的PHYAD0引脚决定了PHY地址。咱们板子上这个引脚接地,所以PHY地址是0x00。这个地址后面配置MAC的时候要特别注意,很多兄弟在这里栽跟头。

STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以太网芯片,本人发现其配置起来比较麻烦,所以整理了一份STM32F107单片机驱动Dp83848的程序代码例程,方便大家学习相关代码的配置

上电第一步得先伺候好时钟。STM32的AHB总线时钟要开启,别忘了MAC用的DMA时钟:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx | RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

接下来是GPIO配置。以RMII接口为例,注意CR寄存器要配置成50MHz模式:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; // RMII_TXD0/TXD1 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);

PHY初始化这块最磨人。建议先用软件复位打个招呼:

uint16_t phy_status; ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR, PHY_Reset); do { phy_status = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR); } while (phy_status & PHY_Reset); // 等复位完成

然后开启自动协商,这里有个坑——DP83848的自动协商完成标志位有点迟钝,实测要加个延时:

ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR, PHY_AutoNegotiation); HAL_Delay(1500); // 不睡够时间直接读状态会扑街 do { phy_status = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMSR); } while (!(phy_status & PHY_AutoNego_Complete));

链路状态检测建议用中断方式。配置PHY的中断引脚接到STM32的某个EXTI:

// 开启链接状态变化中断 ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_REG_MISR, PHY_Link_Status_Interrupt); // 配置EXTI中断回调 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == PHY_INT_PIN) { uint16_t status = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_REG_MISR); if(status & PHY_Link_Status_Interrupt) { // 处理链接状态变化 handle_network_event(); } } }

MAC层的DMA描述符配置是个精细活,这里给个发送描述符的初始化示例:

ETH_DMADESCTypeDef *dma_tx_desc; dma_tx_desc = ETH_GetDMATxDesc(); for(int i=0; i<TX_DESC_COUNT; i++) { dma_tx_desc->Status = ETH_DMATXDESC_OWN; // 告诉DMA可以接管 dma_tx_desc->Buffer1Addr = (uint32_t)&tx_buffer[i][0]; if(i == TX_DESC_COUNT-1) { dma_tx_desc->Status |= ETH_DMATXDESC_RER; // 环回配置 } dma_tx_desc = (ETH_DMADESCTypeDef*)(dma_tx_desc->Buffer2NextDescAddr); }

最后上主程序骨架。建议先做个链路检测再启动协议栈:

int main(void) { hardware_init(); phy_init(); while(1) { if(ETH_CheckLink() == ETH_LINK_UP) { // 亮个绿灯表示联网成功 LED_Set(GREEN_LED, ON); // 这里跑LwIP的定时检查 ethernetif_input(&gnetif); } else { LED_Toggle(RED_LED); HAL_Delay(500); } } }

调试时最实用的技巧:用示波器抓MDIO波形。曾经遇到读取PHYID始终为0xFFFF的问题,最后发现是MAC的MDC时钟分频系数不对。STM32的ETHMACMIIAR寄存器中,CR位需要根据系统时钟频率配置,72MHz主频时建议设为0x1C(即28分频)。

完整工程里还有个关键点——中断优先级配置。接收中断要设为最高优先级,不然在高流量时容易丢包。这里给出NVIC配置参考:

HAL_NVIC_SetPriority(ETH_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ETH_IRQn);

最后提醒各位,DP83848的硬件复位信号至少要保持10ms低电平。曾经有兄弟偷懒用RC电路做复位,结果每次上电初始化都失败,改成MCU控制复位脚后才正常。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 4:19:56

一文说清JLink驱动安装无法识别的核心要点

一文讲透J-Link驱动装不上、认不出的底层逻辑与实战修复 你有没有遇到过这种情况&#xff1a; 手头项目正紧&#xff0c;调试关键时刻插上J-Link&#xff0c;结果设备管理器里只显示“未知设备”或带黄叹号的USB设备&#xff1f; Keil连不上&#xff0c;Ozone报错&#xff0…

作者头像 李华
网站建设 2026/7/22 3:30:53

arm版win10下载安装详解:小白也能轻松完成

手把手教你下载并安装arm版Win10&#xff1a;从零开始的完整实战指南 你是否曾好奇&#xff0c;为什么Surface Pro X能一边插着SIM卡上网&#xff0c;一边连续使用15小时&#xff1f;答案就藏在它运行的操作系统—— Windows on ARM 。这并不是普通的Windows 10&#xff0c;…

作者头像 李华
网站建设 2026/7/12 8:49:34

[特殊字符]_微服务架构下的性能调优实战[20260113171318]

作为一名经历过多个微服务架构项目的工程师&#xff0c;我深知在分布式环境下进行性能调优的复杂性。微服务架构虽然提供了良好的可扩展性和灵活性&#xff0c;但也带来了新的性能挑战。今天我要分享的是在微服务架构下进行性能调优的实战经验。 &#x1f4a1; 微服务架构的性…

作者头像 李华
网站建设 2026/7/19 12:38:45

基于SVC和PSS的电力系统暂态稳定性研究 【软件】Matlab/Simulink、Word

基于SVC和PSS的电力系统暂态稳定性研究 【软件】Matlab/Simulink、Word&#xff1b; 【说明】通过仿真各类短路故障&#xff0c;验证静止无功补偿器(SVC)和电力系统稳定器(PSS)对于提高电力系统暂态稳定性的重要作用&#xff1b; 【文件】包括&#xff1a;Matlab/Simulink仿真模…

作者头像 李华
网站建设 2026/7/19 0:24:07

结合温升测试验证工业用PCB线宽电流对照表

温升实测揭秘&#xff1a;工业PCB走线到底能扛多大电流&#xff1f;从一个烧断的铜箔说起某天&#xff0c;一位工程师在调试一台工业变频器时发现&#xff0c;设备运行十几分钟后突然停机。检查发现&#xff0c;主板上一条看似“足够宽”的电源走线竟然局部碳化、断裂——而这根…

作者头像 李华
网站建设 2026/7/1 23:37:35

W5500与STM32结合的看门狗机制设计:操作指南

W5500与STM32协同看门狗设计&#xff1a;从原理到实战的完整指南你有没有遇到过这样的场景&#xff1f;一台部署在工厂角落的工业网关&#xff0c;连续运行了几周后突然“失联”——Ping不通、数据中断&#xff0c;但现场检查却发现设备电源正常&#xff0c;MCU似乎还在跑代码。…

作者头像 李华