news 2026/6/8 6:05:22

用STM32F103和W5500模块,5分钟搞定一个简易的Web服务器(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32F103和W5500模块,5分钟搞定一个简易的Web服务器(附完整代码)

STM32F103与W5500极简Web服务器实战指南

在嵌入式开发领域,为设备添加网络功能已成为刚需。想象一下,当你需要远程监控温室温度、控制智能家居设备或快速配置工业传感器时,一个轻量级的Web界面往往是最直接的解决方案。本文将带你用STM32F103C8T6(Blue Pill开发板)和W5500以太网模块,在30行核心代码内构建一个能响应HTTP请求的Web服务器。

1. 硬件准备与环境搭建

1.1 所需材料清单

  • STM32F103C8T6开发板(约$2的Blue Pill板)
  • W5500模块(推荐Niren_W5500或兼容型号)
  • RJ45网线(直连或通过路由器)
  • ST-Link调试器(用于烧录程序)
  • 杜邦线若干(建议使用排针焊接)

注意:W5500与STM32的SPI接口电压需匹配,若W5500为5V电平,需添加电平转换电路或选择3.3V兼容型号。

1.2 开发环境配置

  1. 安装Keil MDK或PlatformIO
  2. 添加STM32F1xx HAL库支持
  3. 下载W5500官方驱动库( WIZnet官网 提供)
# PlatformIO项目配置示例 [env:bluepill_f103c8] platform = ststm32 board = bluepill_f103c8 framework = stm32cube lib_deps = wiznet/W5500@^1.0.0

2. 硬件连接与SPI配置

2.1 引脚连接对照表

STM32引脚W5500引脚功能说明
PA4SCSSPI片选
PA5SCKSPI时钟
PA6MISO主入从出
PA7MOSI主出从入
PC13RST硬件复位
3.3VVCC电源正极
GNDGND电源地

2.2 SPI初始化代码精要

// SPI1初始化(72MHz主频下) void SPI1_Init(void) { __HAL_RCC_SPI1_CLK_ENABLE(); SPI_HandleTypeDef hspi = { .Instance = SPI1, .Init = { .Mode = SPI_MODE_MASTER, .DataSize = SPI_DATASIZE_8BIT, .CLKPolarity = SPI_POLARITY_LOW, .CLKPhase = SPI_PHASE_1EDGE, .NSS = SPI_NSS_SOFT, .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4, .FirstBit = SPI_FIRSTBIT_MSB } }; HAL_SPI_Init(&hspi); }

3. W5500网络核心配置

3.1 网络参数静态配置

uint8_t mac[6] = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}; // 自定义MAC地址 uint8_t ip[4] = {192, 168, 1, 100}; // 设备IP uint8_t sn[4] = {255, 255, 255, 0}; // 子网掩码 uint8_t gw[4] = {192, 168, 1, 1}; // 默认网关 void W5500_Init(void) { wiz_NetInfo netinfo = {.mac = mac, .ip = ip, .sn = sn, .gw = gw}; WIZCHIP_CRITICAL_ENTER(); WIZCHIP_Initialize(); ctlnetwork(CN_SET_NETINFO, (void*)&netinfo); WIZCHIP_CRITICAL_EXIT(); }

3.2 网络状态诊断技巧

通过以下命令可快速验证网络连通性:

# 在电脑终端执行(Linux/macOS) ping 192.168.1.100 arp -a | grep "192.168.1.100" # 验证MAC地址 # 若无法ping通,检查: # 1. 网线连接状态指示灯 # 2. 路由器ARP表中是否出现设备 # 3. W5500硬件复位是否正常

4. HTTP服务器实现实战

4.1 精简HTTP处理框架

#define SOCK_HTTP 0 // 使用Socket 0作为HTTP通道 void HTTP_Server(void) { uint8_t buffer[512]; uint16_t len; switch(getSn_SR(SOCK_HTTP)) { case SOCK_INIT: listen(SOCK_HTTP); break; case SOCK_ESTABLISHED: len = getSn_RX_RSR(SOCK_HTTP); if(len > 0) { recv(SOCK_HTTP, buffer, len); if(strstr((char*)buffer, "GET /")) { // 构造简单HTML响应 char response[] = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n\r\n" "<html><body>" "<h1>STM32 Web Server</h1>" "<p>GPIO State: <a href='/led=on'>ON</a> | <a href='/led=off'>OFF</a></p>" "</body></html>"; send(SOCK_HTTP, (uint8_t*)response, strlen(response)); } } disconnect(SOCK_HTTP); break; } }

4.2 LED控制功能扩展

在main.c中添加GPIO控制逻辑:

// 在while(1)循环中添加 if(strstr((char*)buffer, "led=on")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED亮 } else if(strstr((char*)buffer, "led=off")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED灭 }

5. 进阶优化与调试技巧

5.1 内存占用优化策略

优化方向具体措施预期效果
TCP窗口大小调整Sn_RXBUF_SIZE为2KB减少RAM占用30%
Socket数量仅启用1个Socket用于HTTP节省8KB内存
响应缓存使用预生成HTML模板降低CPU负载20%

5.2 常见问题排查指南

  1. 无法获取IP地址

    • 检查网线连接状态
    • 用示波器验证SPI时钟信号
    • 确认W5500的VCC电压稳定(3.3V±5%)
  2. HTTP请求超时

    // 在初始化后添加超时设置 setRTR(2000); // 设置2秒重试超时 setRCR(3); // 最大重试次数
  3. 网页加载不完整

    • 确保HTTP响应头以\r\n\r\n结束
    • 检查send()函数返回的实际发送字节数
    • 使用Wireshark抓包分析TCP流

6. 项目扩展方向

6.1 传感器数据可视化

通过AJAX实现实时数据更新:

// 在HTML中添加JavaScript代码 setInterval(function() { fetch('/sensor').then(r => r.text()) .then(data => { document.getElementById('temp').innerText = data; }); }, 1000);

对应的STM32处理代码:

if(strstr((char*)buffer, "GET /sensor")) { float temp = read_temperature(); // 假设的温度读取函数 char sensor_data[32]; sprintf(sensor_data, "%.1f°C", temp); send(SOCK_HTTP, (uint8_t*)sensor_data, strlen(sensor_data)); }

6.2 OTA固件升级

实现HTTP固件更新的关键步骤:

  1. 在STM32中划分两个Flash分区(运行区/更新区)
  2. 通过HTTP POST接收bin文件
  3. 使用内置Flash编程接口写入
  4. 校验完成后跳转到新固件
void handle_upload(uint8_t *data, uint32_t len) { static uint32_t addr = 0x08010000; // 更新区起始地址 HAL_FLASH_Unlock(); for(int i=0; i<len; i+=4) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr+i, *(uint32_t*)(data+i)); } HAL_FLASH_Lock(); }

在实际项目中,建议添加SHA256校验和看门狗保护机制确保升级可靠性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 6:05:07

RK3568J EDP时序调试避坑指南:从屏参Datasheet到DTS timing节点的实战换算

RK3568J EDP时序调试实战&#xff1a;从屏参解析到DTS节点精准配置调试嵌入式显示接口时&#xff0c;最令人头疼的莫过于屏幕点亮后的异常现象——花屏、闪烁、甚至完全无显示。这些问题往往源于时序参数的细微偏差。本文将带您深入理解EDP显示时序的核心原理&#xff0c;并手把…

作者头像 李华
网站建设 2026/6/8 5:56:05

从达尔文到GDP:为什么我们像150年前一样,被一个‘增长神话’困住了?

从达尔文到GDP&#xff1a;认知框架如何塑造我们的增长困境1. 范式转移的历史回响1859年11月24日&#xff0c;伦敦约翰穆瑞出版社印制的1250本《物种起源》在上市当天销售一空。达尔文用502页的论证颠覆了人类对自身起源的认知&#xff0c;却引发了持续数十年的激烈争议。当时的…

作者头像 李华
网站建设 2026/6/8 5:54:00

LangGraph中实现可复现的人机协同流程(HITL)

我理解您的严格要求&#xff0c;也完全认同内容安全、专业深度与表达真实性的绝对优先级。但需要坦诚说明&#xff1a;您提供的输入内容中&#xff0c;项目标题、正文、关键词与摘要均明确指向一篇已发表于Medium平台的第三方技术文章&#xff0c;其核心信息&#xff08;作者名…

作者头像 李华