• 正文
  • 相关推荐
申请入驻 产业图谱

【STM32 】LAN8720+LWIP+RTOS的WebServer实现

04/27 15:15
2433
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、功能简介

本项目将 STM32F429 搭建成一个 Web 服务器(WebServer),用户可通过浏览器访问其 IP,实现远程控制与配置功能,例如:

二、硬件 & 软件平台

  • MCU 平台:STM32F429XXX 系列
  • PHY 芯片LAN8720 / DP83848 / LAN8742(本示例默认使用 LAN8720)
  • 软件工具链
    • STM32CubeMX:v6.13.0
    • KEIL MDK
    • 操作系统:FreeRTOS(CMSIS-RTOS v2 接口)

三、CubeMX 配置说明

1. ETH 配置

  • 接口类型:选择 RMII 模式(推荐用于性能更优的通信)
  • GPIO 设置:根据自己电路图配置即可(CubeMX 会根据选择自动分配)

2. FreeRTOS 配置

  • 任务管理
    • 添加专门用于处理 Web 请求的任务,例如 http_task
    • 建议该任务的 Stack Size 设置为 较大值,如 10242048,以避免网页数据处理栈溢出,这里选用了task06。
  • 系统堆大小
    • 适当增大 heap size,确保 FreeRTOS 内部内存分配足够
    • 示例值:configTOTAL_HEAP_SIZE = 16 KB 或更多(根据 RAM 剩余情况)

3. LWIP 配置

(1) PHY 芯片设置
  • 本项目使用 LAN8720
  • CubeMX 中若无明确 LAN8720 选项,选择 LAN8742 也可正常使用

(2) 网络配置
  • 关闭不需要的协议(如 UDPSNMP)以减小资源占用
  • IP 地址设置为 上位机处于同一网段(如 PC 是 192.168.1.100,STM32 可设为 192.168.1.10
(3) 参数配置(重点关注)

这里重点介绍下一些配置参数:

✅ 一、TCP 栈缓冲相关配置(数据发送/接收效率核心)
参数名 当前值 推荐值 用途说明 如果太小会发生什么
TCP_SND_BUF 1072 4096 或 8192 TCP 发送缓冲区,决定一次最多缓存多少字节数据用于发送(比如 send())。 数据分多次、小包发;效率低,容易“卡顿”等待 ack。
TCP_SND_QUEUELEN 9 32 或更多 TCP Segment 队列长度(= 多少个 segment 可在缓冲中排队等待发送)。 send() 会阻塞或失败,响应中断;数据吞吐极低。
TCP_WND 2144 4096 或更大 TCP 接收窗口大小,告诉对方 “我还能接收多少数据”。 接收窗口太小,对方只能慢慢发,拖慢整个 TCP 流。
TCP_MSS 536 1460(建议) 每个 TCP Segment 大数据长度,若 MTU 是 1500,则 MSS 可设为 1460。 每个包很小,浪费带宽,还增加中断和拷贝开销。

✅ 二、内存池相关配置(影响并发能力 & 连续数据传输)
参数名 当前值 推荐值 用途说明 太小会造成的问题
MEMP_NUM_TCP_SEG 16 64 或 128 TCP segment 对象数量,决定发送排队能力(结合 TCP_SND_QUEUELEN)。 连续 send() 超不过几次就堵住。
MEMP_NUM_PBUF 16 32 或 64 PBUF 结构体数量(非池),决定系统可管理的 buffer 数量。 数据包还没来得及处理就被丢弃。
PBUF_POOL_SIZE 16 64 或 128 pbuf_pool 中的 buffer 数量(通常来自 mem_malloc())。 大数据收发容易失败或内存不足。
PBUF_POOL_BUFSIZE 592 592~1500 每个 pool buffer 的大小。若 TCP_MSS 提高,也建议同步提高。 若 MSS 变大,buf size 太小就会浪费分片。
MEM_SIZE 1600 8192 或 16384 LwIP 内部堆区,所有动态分配结构来自这里。 内存耗尽时会分配失败,触发硬件异常或系统崩溃。

相关推荐