一、功能简介
本项目将 STM32F429 搭建成一个 Web 服务器(WebServer),用户可通过浏览器访问其 IP,实现远程控制与配置功能,例如:
二、硬件 & 软件平台
- MCU 平台:STM32F429XXX 系列
- PHY 芯片:LAN8720 / DP83848 / LAN8742(本示例默认使用 LAN8720)
- 软件工具链:
- STM32CubeMX:v6.13.0
- KEIL MDK
- 操作系统:FreeRTOS(CMSIS-RTOS v2 接口)
三、CubeMX 配置说明
1. ETH 配置
2. FreeRTOS 配置
- 任务管理
- 添加专门用于处理 Web 请求的任务,例如
http_task - 建议该任务的 Stack Size 设置为 较大值,如
1024或2048,以避免网页数据处理栈溢出,这里选用了task06。
- 添加专门用于处理 Web 请求的任务,例如
- 系统堆大小
- 适当增大 heap size,确保 FreeRTOS 内部内存分配足够
- 示例值:
configTOTAL_HEAP_SIZE = 16 KB或更多(根据 RAM 剩余情况)
3. LWIP 配置
(1) PHY 芯片设置
- 本项目使用 LAN8720
- CubeMX 中若无明确 LAN8720 选项,选择
LAN8742也可正常使用
(2) 网络配置
(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 内部堆区,所有动态分配结构来自这里。 | 内存耗尽时会分配失败,触发硬件异常或系统崩溃。 |
阅读全文
2433