第5章 STM32CUBE RMII配置和LWIP配置



前言

硬件的配置由前面的工程递增,会根据目的修改部分控制代码
由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成
源码地址https://gitcode.com/qq_36517072/stm32,第x章为cx文件夹


一、STM32CUBE配置网络

1.1根据原理图配置ETH

由原理图可知对应的IO
alt textalt textalt text
配置CUBE ETH,在FREERTOS下使用中断接收
alt text
观察到默认引脚与原理图有三个引脚有区别,分别修改三个引脚
alt textalt text

1.2根据原理图配置PHY的复位

由原理图可知对应的复位IO为PD3
alt text
在CUBE内配置IO,并命名为ETH_RESET
alt text

1.3配置LWIP

使能LWIP,配置IP
alt text
配置PHY驱动类型
alt text
ctrl+s保存generate code

二、代码和测试

main函数里添加PHY的复位代码

  /* USER CODE BEGIN 2 */
	HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET);
	HAL_Delay(10);
	HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_SET);
	HAL_Delay(10);
  /* USER CODE END 2 */

连接好烧录器编译并烧录

连接网线使用主机ping单片机可以ping通
alt text


总结

主要介绍了STM32CUBE下freertos的配置

问题解决

由于之前STM32做的少,调LWIP发现和以前工程一样的代码,会卡死在MX_LWIP_Init函数内,查阅资料发现问题可能是编译时的优化等级,在将优化等级改为O2后,初始化可以通过,但LED不转换,说明已经卡死;改为O1后,可以PING通几秒,然后又卡死;改为O0后才没问题,以往没对编译器优化研究过,但现在的MCU性能普遍很强,懒得去深究了。
alt text

参考

https://www.cnblogs.com/yu1741588584/p/18299835

STM32CubeIDE 中配置 LwIP(轻量级 TCP/IP 协议栈)主要通过以下步骤完成: ### 1. 创建工程 使用 STM32CubeIDE 创建一个新的 STM32 工程,并选择合适的芯片型号。 ### 2. 配置时钟外设 - 在 **Clock Configuration** 页面中配置系统时钟。 - 进入 **Pinout & Configuration** 页面,启用以太网外设(如 ETH),并配置RMII 或 MII 模式(取决于硬件设计)。 - 设置 PHY 地址、通信引脚等参数。 ### 3. 启用 LwIP - 在 **Middleware** 部分找到 **LwIP**,将其启用。 - 配置 LwIP 参数: - IP 地址类型:静态地址或 DHCP - 启用协议:TCP、UDP、ICMP 等 - 内存设置:pbuf、连接数等 ### 4. 配置网络接口 LwIP 初始化后会自动生成 `lwipopts.h` `main()` 中的初始化代码。你可以在 `main()` 函数中添加如下内容来启动网络接口: ```c MX_LWIP_Init(); ``` 如果你启用了 DHCP,则可以调用: ```c dhcp_start(netif); ``` ### 5. 编写应用层代码 在 `main()` 循环中调用 `MX_LWIP_Process();` 来处理 LwIP 的任务。你可以在此基础上编写 TCP/UDP 服务器或客户端程序。 --- ### 示例:创建一个简单的 UDP 接收器 ```c #include "lwip/udp.h" void udp_receive_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { if (p != NULL) { char *data = (char *)p->payload; printf("Received: %s\n", data); pbuf_free(p); } } void start_udp_server() { struct udp_pcb *upcb = udp_new(); if (upcb != NULL) { err_t err = udp_bind(upcb, IP_ADDR_ANY, 7); // 使用端口 7 if (err == ERR_OK) { udp_recv(upcb, udp_receive_callback, NULL); } } } ``` 在 `main()` 中调用 `start_udp_server()`。 --- ### 常见问题与调试 - 确保 PHY 芯片正常工作(如 LAN8742) - 检查 MAC 地址是否正确设置 - 查看 LwIP 日志输出(可启用 LWIP_DEBUG) - 使用 Wireshark 抓包分析网络通信 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值