stm32f107如何移植lwip
在STM32F107上移植lwIP需要结合其内置的以太网控制器(MAC)和外部PHY芯片(如DP83848或LAN8720),以下是详细步骤:
1. 硬件准备
-
确认硬件连接
- STM32F107的RMII接口(ETH_MII_CRS、ETH_MII_RX_DV等)需正确连接PHY芯片。
- 检查PHY的复位引脚、时钟源(通常需要外部25MHz晶振或STM32提供的50MHz时钟)。
- 确保PHY地址配置正确(通过硬件上下拉电阻设置)。
-
初始化时钟
- 配置STM32的时钟树,确保ETH外设时钟(通过AHB总线)和RMII接口的50MHz参考时钟正常(例如使用HSE或PLL输出)。
2. 软件环境搭建
-
使用STM32CubeMX生成基础工程
- 在CubeMX中选择STM32F107芯片,启用ETH外设(RMII模式)。
- 配置PHY相关参数(地址、自适应速率/双工模式)。
- 启用LwIP协议栈(勾选Middleware中的LwIP)。
- 生成代码(选择适合的IDE如Keil、IAR或STM32CubeIDE)。
-
添加LwIP源码
如果未使用CubeMX,需手动将LwIP源码(lwip/src目录)和STM32的ETH驱动(如stm32f2xx_hal_eth.c)加入工程。
3. LwIP配置与适配
-
修改LwIP配置文件
lwipopts.h:根据应用需求调整核心参数,例如:#define MEM_SIZE (16*1024) // 调整内存池大小 #define PBUF_POOL_SIZE 64 // 接收缓冲区数量 #define TCP_MSS 1460 // TCP最大报文段cc.h:适配编译器(如定义LWIP_PROVIDE_ERRNO)。
-
实现网络接口驱动
- 在
ethernetif.c中完善底层函数: low_level_init():初始化ETH DMA描述符、PHY芯片。low_level_output():发送数据包到ETH外设。low_level_input():从ETH DMA接收数据包。- 示例PHY初始化代码(以LAN8720为例):
void PHY_Init(void) { uint32_t reg; // 复位PHY HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_RESET); HAL_Delay(100); // 启用自动协商 HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_AUTONEGOTIATION); // 等待链路就绪 do { HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BSR, ®); } while (!(reg & PHY_LINKED_STATUS)); }
- 在
4. 集成与调试
-
启动LwIP协议栈
- 在主函数中调用
MX_LWIP_Init(),并启动LwIP内核线程(如使用FreeRTOS)或轮询模式。
- 在主函数中调用
-
测试网络连通性
// 示例:初始化静态IP ip4_addr_t ipaddr, netmask, gw; IP4_ADDR(&ipaddr, 192, 168, 1, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 1); netif_set_default(netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input));- 使用
ping命令测试硬件链路是否正常。
- 使用
-
实现应用层协议
- 示例:创建TCP Echo服务器:
void tcp_echo_init() { struct tcp_pcb *pcb = tcp_new(); tcp_bind(pcb, IP_ADDR_ANY, 7); tcp_listen(pcb); tcp_accept(pcb, tcp_echo_accept); }
- 示例:创建TCP Echo服务器:
5. 常见问题解决
-
PHY初始化失败
- 检查PHY地址(通过
HAL_ETH_ReadPHYRegister读取ID寄存器)。 - 确认复位时序和时钟配置(PHY可能需要更长的复位时间)。
- 检查PHY地址(通过
-
Ping不通
- 检查ETH DMA描述符配置(如
DMATxDesc和DMARxDesc是否对齐到内存)。 - 确认防火墙或路由器未屏蔽ICMP报文。
- 检查ETH DMA描述符配置(如
-
数据包丢失或CRC错误
- 调整ETH DMA接收/发送缓冲区大小。
- 检查RMII信号线是否受到干扰(必要时增加滤波电容)。
6. 优化与进阶
-
启用DHCP
在lwipopts.h中定义LWIP_DHCP=1,并调用dhcp_start(&gnetif)。 -
使用FreeRTOS
在CubeMX中启用FreeRTOS,并在sys_arch.c中实现信号量和邮箱的RTOS适配。 -
启用PPPoE或IPv6
根据需求在lwipopts.h中启用LWIP_PPP_SUPPORT或LWIP_IPV6。
通过以上步骤,可完成LwIP在STM32F107上的基本移植。建议参考ST官方例程(如STM32CubeF1中的LwIP示例)进行调试。
AN3411_基于stm32F107的IEEE1588高精度时间协议演示
AN3411_基于stm32F107的IEEE1588高精度时间协议演示
资料下载
佚名
2022-11-21 08:11:30
STM32F107官方开发板原理图及PCB资料免费下载
本文档的主要内容详细介绍的是STM32F107官方开发板原理图及PCB资料免费下载。
资料下载
ah此生不换
2019-07-22 08:00:00
STM32F107是怎样通过LWIP实现MQTT发布和订阅框架的呢
怎样通过STM32CubeMX配置STM32F107VCTx的demo呢?STM32F107是怎样通过
STM32F107通过LWIP实现MQTT发布和订阅框架 精选资料分享
STM32F107通过LWIP实现MQTT发布和订阅框架原料创建STM32F107的BasecodeMQTT源码获取添加MQTT源码到工程修改m
STM32F107的LWIP内存溢出
最近在用STM32F107做以太网,移植了LWIP1.3.1进行TCP客户端/服务器通讯,,,短时间通讯没问题,每200ms发送1300字节,串
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机