tm32f207 + DP83848 + Lwip初始化问题

本文解决了STM32F207上DP83848 PHY芯片初始化失败的问题,通过调整系统时钟至100MHz并确保外部50MHz时钟输入,最终实现成功的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浏览更多内容,可访问:http://www.growai.cn
###1 遇到的问题

  • **ETH_Init(&ETH_InitStructure,DP83848_PHY_ADDRESS);初始化不成功问题 **
  • **在while (ETH_GetSoftwareResetStatus() == SET);卡死 **
  • 动态IP获取不成功问题

###2 阐述可能原因

出现上述问题主要是PHY芯片DP83848初始化不成功引起的,主要从以下几个方面入手检查:

  • 检查是否引脚有虚焊
  • 检查DP83848_PHY_ADDRESS地址是否正确,查看手册,一般是0x01,这个需要根据具体电路
  • 最后查看系统时钟,DP83848芯片要求需要外部输入50MHZ的时钟。(我也是在这坑的,我主要讲一下这个解决方案)
    ###3 解决方案(针对问题三)

主要是先了解单片机系统的时钟树,针对stm32f207,他的系统时钟最高可达120M,为了输出PHY芯片DP83848芯片所需的时钟,我们必须将单片机设置为100M时钟输出,具体怎么设置,可以将如下代码复制到系统的system_stm32f2xx.c中,主要是替换以前系统时钟设置时的宏定义。

`#ifndef RMII_MODE
  /* System clock frequency configured for 120 MHz ****************************/
  /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  #define PLL_M      25
  #define PLL_N      240

  /* SYSCLK = PLL_VCO / PLL_P */
  #define PLL_P      2

  /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  #define PLL_Q      5
#else
  /* System clock frequency configured for 100 MHz ****************************/
  /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  #define PLL_M      4
  #define PLL_N      64

  /* SYSCLK = PLL_VCO / PLL_P */
  #define PLL_P      4

  /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  #define PLL_Q      5

  /* IMPORTANT NOTE
     ==============
       This configuration is valid only when MCO pin is used as RMII clock source.
       To output a 50 MHz clock signal on the MCO pin, the following conditions
       must be respected:
         – 25 MHz external crystal connected to OSCIN/OSCOUT pins
         – RCC_PLLCFGR PLL factors configured as follows:
           PLLMx = 4, PLLNx = 64, PLLP = 4.
           This leads to a system clock of 100 MHz.
         – Then set the MCO prescaler to 2 in the RCC_CFGR register to configure
           the system clock to 50 MHz.
     */
#endif /* RMII_MODE */`

为了是系统启动时就是时钟生效设置为100MHZ,必须提前定义RMII_MODE,我采用如下的方法,也可以在SetSysClock()函数之前定义,但是在main.c中定义不会生效。
这里写图片描述
由于系统时钟较快,假如出现不能获取或者偶尔不能获取系统时钟时,可以在DP83848引脚和时钟初始化后加一个19ms的系统延时即可。

### STM32F407与DP83848网络PHY芯片结合使用LWIP协议栈进行网络通信设置 #### 工程创建与配置 为了实现STM32F407与DP83848 PHY通过LWIP协议栈完成网络通信,首先需利用STM32CubeMX工具建立新项目并选择目标MCU型号为STM32F407XX。在中间件选项里勾选LWIP组件以及FreeRTOS实时操作系统支持[^1]。 #### 配置硬件资源 进入外设配置界面开启Ethernet MAC模块,并确保其连接至外部PHY设备即DP83848的数据线已正确定义于引脚分配表内。同时调整RMII接口参数匹配所选用的物理层收发器特性要求。 #### 添加必要的库文件和支持代码 从官方提供的固件包获取对应版本号下的`lwip`, `ethernetif.c/h` 和其他关联源码片段加入到当前工作区目录结构下;这些文件包含了底层驱动程序逻辑用于初始化网卡控制器并与高层应用交互数据流处理机制。 #### 修改启动文件和链接描述符 依据具体应用场景需求编辑`.s`汇编引导序列及`.ld`映射规则文档来优化内存布局安排,保证堆栈空间充足以便容纳多任务调度期间产生的临时变量存储请求。 #### 实现TCP/IP应用程序框架 编写主循环函数负责调用轮询式的接收发送操作API入口点如`tcp_new()`,`udp_bind()`等构建完整的客户端/服务器模式实例演示案例: ```c #include "lwip/api.h" #include "netif/ethernetif.h" void start_tcp_server(void *argument){ struct netconn *conn; conn = netconn_new(NETCONN_TCP); err_t err = netconn_bind(conn, IP_ADDR_ANY, 80); /* Bind to port 80 */ } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值