STM32常用的web服务器方案是轻量级嵌入式服务器,比如lwIP自带的httpd、开源的httpserver以及商业的CycloneTCP,具体选择取决于你的网络需求、硬件资源和开发周期。
很多人问stm32用什么web服务器,其实答案不是唯一的,STM32单片机不是跑Linux的服务器,它的Flash和RAM有限,所以选web服务器要先看你的需求:是做个简单的配置页面,还是传输文件,还是要跑加密的HTTPS?下面我按实际场景把主流方案梳理一遍。
直接跑lwIP自带httpd,最省事
如果你用的是STM32搭配以太网,大多会用lwIP协议栈,lwIP自带了一个httpd服务器,这个方案在小型项目里非常常见,也是很多人入门时的第一选择。
它的特点是什么
lwIP httpd是专门为嵌入式设计的,代码很小,占用RAM通常在几KB到十几KB,不会给主控带来压力,它支持静态页面的输出,也可以通过CGI方式动态拼接数据。
适合什么场景
- 通过网页查看传感器数据(温度、湿度、电压)
- 做设备登录页面,输入WiFi账号密码
- 显示设备运行状态、日志信息
- 简单的参数配置,比如IP地址、阈值设置
实际开发步骤
在STM32上跑lwIP httpd,大致的流程是这样:
- 第一步,在CubeMX里配置ETH(如果是STM32F407或F429之类带MAC的型号),然后添加lwIP中间件
- 第二步,在lwIP配置项里勾选HTTPD,注意把
LWIP_HTTPD宏定义为1 - 第三步,编写网页内容,lwIP httpd支持将网页文件转换成C数组,也可以通过
fsdata机制打包 - 第四步,把httpd_init()放在网络初始化完成之后启动服务器
- 在浏览器里输入设备IP地址,就能看到页面了
有个需要注意的地方:lwIP自带httpd对动态内容的支持比较原始,需要用CGI回调函数逐个处理,如果你要建一个10个字段以上的配置页面,代码会变得比较啰嗦。
用开源库tropicssl或mbedtls做HTTPS
现在很多设备接入云端,或者用户需要在公网上访问,单纯HTTP是裸奔的,STM32的资源虽然小,但也能跑HTTPS,核心在于选用合适的TLS库。
推荐组合
- mbedTLS(现在叫TLS 1.3版本库):ARM官方维护,文档全面,社区资料多
- wolfSSL:另一种选择,对于F1系列小内存也做了裁剪
资源占用参考
据业内专家指出,mbedTLS在STM32F407上跑RSA握手,大概需要40KB以上Flash

和30KB以上RAM,如果做ECC握手会省一些,所以如果你的芯片不是F4系列以上,建议先把网页做小再做加密。
实际配置要点
以mbedTLS为例,在项目中你要:
- 下载mbedtls源码,剪掉不需要的算法(比如去掉GCM、CBC等不用的cipher)
- 把
MBEDTLS_SSL_ENABLED打开 - 将服务器证书和私钥放在Flash里,用数组方式存储
- 在TCP回调中,先建立TLS上下文,再让httpd跑在TLS层之上
这样做出来的web服务器,浏览器访问时会有一个绿色小锁,用户端看到的是标准HTTPS协议。
用开源库httpserver,界面更灵活
如果觉得lwIP httpd太死板,而在STM32上又要用比较完整的web功能,可以试试开源常用的httpserver(很多项目里叫httpd或webserver)。
这个方案通常基于裸机或FreeRTOS,自行解析HTTP请求,支持GET/POST,支持模板替换。
特色功能
- 支持多页面路由,比如
/status、/config、/update - 支持JSON接口,方便手机App和网页共用
- 支持大文件上传(比如固件升级)
- 可以配合SPI Flash存储网页文件
怎么在STM32上移植
以FreeRTOS+lwIP+httpserver的常见组合为例:
- 创建一个TCP server任务,监听80端口
- 收到连接后,用
socket或netconnAPI接收数据 - 解析HTTP头里的URL、Method、Content-Length
- 对应到各自的处理函数,生成HTML或JSON返回
代码结构比较清晰,但是要注意内存池管理,因为每个TCP连接都要占用一定的接收缓冲区,如果同时有多个客户端访问,内存会紧张,行业共识认为,STM32上并发连接数控制在4~8个是合理的,不要试图支持几十个并发。
用小型商业栈,适合需要稳定性的产品
很多做物联网网关、电力设备、医疗仪器的厂商,会选择CycloneTCP或者RT-Thread的Web组件,这些算商业或半商业的协议栈,代码质量高,bug少,而且提供完整的web server实现。
CycloneTCP是什么
CycloneTCP是瑞士Oryx Embedded公司出的嵌入式TCP/IP协议栈,支持STM32全系列,它里面的HTTP server实现非常完整,支持HTTPS、WebSocket、SSI、CGI,甚至能做多语言网页。
优势在哪
- 技术文档专业,有PDF手册
- 没有隐藏递归调用,代码风格统一
- 有持续维护,不像有些开源代码十年不更新
- 经过认证体系,适合有安全要求的场合

商业栈需要授权费用,对于小批量或者学习用,直接用lwIP就够了。
RT-Thread的Web组件
如果你用RT-Thread操作系统,里面自带的webnet组件也可以做web服务器,它支持CGI、AJAX、文件上传,而且和RT-Thread的设备框架结合得好,直接通过mkfs命令挂载文件系统就能读网页,这样改网页只需要更新Flash里的文件,不用重新编译固件。
用外部W5500加嵌入式web服务器
不少场景下,STM32本身不带以太网MAC,比如STM32F103,这时很多工程师会用SP接口的W5500芯片,W5500内嵌了硬件TCP/IP协议栈,MCU只需要通过SPI读写寄存器。
这是很多价格敏感项目的常见做法
比如买个STM32F103C8T6加W5500模块,成本大约在20元上下,比用F407加PHY芯片的方案低不少,社区和淘宝上也有很多现成的开发板,讲讲stm32用w5500部署web服务器,就是把网页数据放在W5500的发送缓冲区中。
具体操作区别
- W5500的socket库自带TCP处理,你不用担心lwIP协议栈的配置
- 但web server的应用层程序还是要自己写,或者移植一个简易的HTTP解析器
- 网页数据可以放在STM32的Flash里,按URL匹配发送
这种方案最适合需要快速交付、价格敏感的工业控制设备,不需要RTOS,也不用调lwIP的内存池。
如何根据STM32型号选web服务器
你手里的芯片决定了你能用什么方案,这里给一个参考思路。
| 芯片系列 | Flash | RAM | 推荐方案 |
|---|---|---|---|
| STM32F103 | 64-512KB | 20-64KB | W5500+自写HTTP或lwIP关闭缓冲 |
| STM32F407 | 512KB-1MB | 128-192KB | 标准lwIP+httpd,可选mbedTLS |
| STM32H743 | 2MB | 1MB | 完整Linux不行,但可跑完整HTTPS |
| STM32MP1 | 外部DDR | 大 | 可以直接跑嵌入式Linux,用Nginx或lighttpd |
需要注意,STM32MP1是M4+A7双核的,它能跑Linux,这算一个特例,如果用了MP1,web服务器完全可以上Nginx,就不受裸机资源限制了。
具体到内存紧张时怎么办
F103跑lwIP标准版比较吃力,但可以裁剪内存,把PBUF池调小,只支持一个TCP连接,网页内容控制在

10KB以内,用GZIP压缩后烧到Flash里,这样也能实现基本配置页面。
安全怎么处理
如果设备需要公网访问,一定要上HTTPS,STM32上的TLS握手比较慢,F407差不多要1-3秒,但用户能接受,注意定期更新证书,不要把私有密钥硬编码在源码里。
常见问题和排查经验
怎么解决网页打不开
一般是三个方面:
- 晶振不准导致MAC地址无效
- 没有设置正确的网关和子网掩码
- 网页数组没有正确包含结束符
用网络抓包工具看一下ARP和TCP握手是否能完成,问题基本能定位。
网页响应太慢
多数情况下是动态内容生成太慢,或者用了阻塞的Flash读写,把动态数据的生成放到后台任务,web server只取结果会快很多。
能不能同时跑HTTP和HTTPS
能,监听两个端口,80做HTTP重定向到443,443走TLS,这是一种标准做法,在STM32上会多占一点RAM,不过很多产品都这么做。
关于选型的一些总结
回到最初的问题,stm32用什么web服务器,我的推荐顺序是:
- 学习或者原型验证,直接用lwIP自带httpd
- 做产品且界面要求高,用RT-Thread webnet或CycloneTCP
- 要加密,先跑通lwIP然后加mbedTLS
- 成本敏感且软件能力有限,用W5500加简单HTTP
没有绝对最好的服务器,只有最合适自己硬件和开发周期的那一个,先把最小系统跑通,再逐步加功能,这是最稳的路线。
Q&A
stm32的web服务器内存要多大?
最少要8KB RAM才能跑起一个基本HTTP服务器,推荐有32KB以上RAM,这样能比较从容地处理TCP收发缓冲和动态页面拼装。
如何让STM32的web服务器显示实时数据?
通过CGI接口或者AJAX轮询实现,CGI思路是每次页面刷新时,由后端函数读取传感器数据并插入到HTML字符串里,AJAX思路是前端每秒请求一次/data接口,后端返回JSON格式的数据,前端用JavaScript更新DOM,第二种方式更流畅,不需要整个页面刷新。
HTTPS在STM32上会不会太慢?
F407级别芯片完成TLS 1.2握手大约需要1到2秒,建立连接后传输加密数据的速度是几十KB/s,对于配置网页和小型文件来说够用,如果觉得慢,可以用ECC证书替换RSA证书,因为ECC的握手计算量更小。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/893906.html

