你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Nucleo-F429ZI开发板体验LWIP功能

[复制链接]
STMWoodData 发布时间:2025-2-15 14:45

首先看看开发板配置:

板上采用的是LQFP144封装的STM32F429ZIT6型号MCU。有3个用户LED,1个用户按钮和1个复位按钮。再就是具有Micro-USB接口和以太网RJ45接口。

开发板还通过三种连接端口提供应用扩展功能。除现有的板上的Arduino™Uno和ST morpho连接器外,还包括一个ST zio连接器。这三类连接器让开发人员能够使用STM32微控制器的全部通用I/O引脚,轻松实现任何具有创造性的功能。

image.png

看到板上有个RJ45的以太网接口,想着还没有试过用用ST的以太网功能。本次就来简单体验一下以太网外设功能用法,试一试LWIP网络协议栈。

下面打开STM32CubeMX,通过用开发板方式新建工程。

image.png

选择我们对应的开发板,然后开始项目。开始之后,就进入项目配置了。通过开发板方式创建新项目的好处就是已经分配好开发板的默认引脚了。

image.png

接着选择ETH外设配置:

这里配置挺简单的,模式选择RMII模式。下面都是默认的配置。开发板板载的 PHY 芯片型号为 LAN8720A,该芯片只支持 RMII 接口。

这里说一下RMII。RMII 接口是 MII 接口的简化版本,MII 需要 16 根通信线,RMII 只需 7 根通信,在功能上是相同的。

  • TX_CLK:数据发送时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时为 25MHz。 RMII 接口没有该线。
  • RX_CLK:数据接收时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时为 25MHz。 RMII 接口没有该线。
  • TX_EN:数据发送使能。在整个数据发送过程保存有效电平。
  • TXD[3:0]或 TXD[1:0]:数据发送数据线。对于 MII 有 4 位, RMII 只有 2 位。只有在TX_EN 处于有效电平数据线才有效。
  • CRS:载波侦听信号,由 PHY 芯片负责驱动,当发送或接收介质处于非空闲状态时使能该信号。在全双工模式该信号线无效。
  • COL:冲突检测信号,由 PHY 芯片负责驱动,检测到介质上存在冲突后该线被使能,并且保持至冲突解除。在全双工模式该信号线无效。
  • RXD[3:0]或 RXD[1:0]:数据接收数据线,由 PHY 芯片负责驱动。对于 MII 有 4 位,RMII 只有 2 位。在 MII 模式,当 RX_DV 禁止、 RX_ER 使能时,特定的 RXD[3:0]值用于传输来自 PHY 的特定信息。
  • RX_DV:接收数据有效信号,功能类似 TX_EN,只不过用于数据接收,由 PHY 芯片负责驱动。对于 RMII 接口,是把 CRS 和 RX_DV 整合成 CRS_DV 信号线,当介质处于不同状态时会自切换该信号状态。
  • RX_ER:接收错误信号线,由 PHY 驱动,向 MAC 控制器报告在帧某处检测到错误。
  • REF_CLK:仅用于 RMII 接口,由外部时钟源提供 50MHz 参考时钟。因为要达到 100Mbit/s 传输速度, MII 和 RMII 数据线数量不同,使用 MII 和 RMII 在时钟线的设计是完全不同的。对于 MII 接口,一般是外部为 PHY 提供 25MHz 时钟源,再由 PHY 提供 TX_CLK 和 RX_CLK 时钟。对于 RMII 接口,一般需要外部直接提供 50MHz时钟源,同时接入 MAC 和 PHY。

image.png

板上LAN8720A电路部分如下:

image.png

下面接着设置LWIP协议栈参数,这里参数比较多。但是大多数只需要默认配置即可。

image.png

这里暂时没有使用RTOS系统。

image.png

这里选择板上对应的PHY驱动IC。

image.png

其他的LWIP配置先保持默认即可。

下面是系统时钟配置,使用默认的168MHz。

image.png

接着是生成的代码工程配置。

image.png

生成的KEIL工程如下:

image.png

初始生成的工程是使用AC5编译器的,我这个KEIL版本已经没有AC5了,这里我就修改为AC6编译器。编译优化也修改了。

image.png

image.png

初始编译会有错误。主要是没有sys/time.h头文件。

image.png

我先去掉这个头文件,再编译一下,发现还有如下错误。是有函数未实现找不到。

image.png

接着我搜索了一下这些函数。发现在lwip.c中有简易实现这些函数,但是编译没有包含进去。主要是宏定义__CC_ARM不识别。这个宏定义是AC5的。既然这样,我就先去掉这个宏定义判断,加上下面函数定义。

image.png

再编译一次就可以成功无错误了。接着下载到开发板上试一试。

主main中循环要加上如下代码函数:MX_LWIP_Process(); 要不然啥反应都没有。

添加打印IP地址函数。

void print_ip_address(void) {
  struct netif *netif = netif_default;
  ip_addr_t ip_addr = *netif_ip_addr4(netif);

  printf("IP Address: %d.%d.%d.%d\n",
         ip4_addr1(&ip_addr),
         ip4_addr2(&ip_addr),
         ip4_addr3(&ip_addr),
         ip4_addr4(&ip_addr));
}

image.png

image.png

下面可以看到串口打印数据。插上网线就可以看到 link up,然后打印IP地址。拔掉网线就会打印link down.

image.png

image.png

收藏 评论0 发布时间:2025-2-15 14:45

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版