W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发

微叠加复杂业务逻辑就容易出现卡顿、丢包甚至协议栈崩溃。WIZnet 凭借全硬件 TCP/IP 协议栈技术在工业联网领域深耕多年,从经典的外置 W5500 以太网芯片,到如今推出集成主控的单芯片方案 W55MH32,直接把 Cortex-M3 内核、硬件 TOE 卸载引擎、MAC 与 PHY 全部整合进一颗芯片,从根源上降低了单片机联网的开发门槛与运行风险。

3cb3c4c93b4440b7588627845e37dd6e.png

最近我们拿到了基于 W55MH32L 打造的官方评估板 W55MH32L-EVB。它不仅完整引出了芯片全部外设资源,还板载了 AHT20 温湿度传感器、有源蜂鸣器、EEPROM、SD 卡插槽与 Arduino 兼容排针,甚至集成了 WIZ-Link 调试器,一根 USB 线就能完成烧录、调试、串口输出,开箱即可上手开发。更值得关注的是,官方已经推出了完整适配的 MicroPython 固件,不用啃寄存器、不用手写底层驱动,用 Python 脚本就能快速实现外设控制与以太网通信。

本文就从硬件规格拆解入手,基于 MicroPython 开发环境,依次实测 GPIO 输入输出、I2C 传感器读取、SPI 屏幕驱动、基础网络通信等核心功能,完整呈现这块开发板的上手门槛、实际表现和适用场景,给打算入门硬件物联网项目的读者做一份全面参考。

一、W55MH32 芯片介绍

1.1 简介

W55MH32 是 WIZnet 新推出的高性能以太网单片机。它采用高性能 Arm® Cortex-M3 内核,主频最高达 216MHz,内置 1024KB FLASH、96KB SRAM 。尤为突出的是,其搭载 WIZnet TCP/IP offload 引擎(TOE),集成全硬件 TCP/IP 协议栈、MAC 及 PHY ,还配备 32KB 独立以太网收发缓存,供 8 个硬件 socket 使用,是真正的 All-in-One 解决方案。

image.png

W55MH32 有两种封装,一种为 100QFN(12x12mm)即上图(左)W55MH32L,另外一种为 68QFN(8x8mm)即上图(右)W55MH32Q,本教程所使用的 W55MH32L-EVB 使用的是 W55MH32L,关于另外一种封装,我们将不会详细讲解

1.2 系统框架

W55MH32 芯片支持丰富的外部接口,包括 GPIO、ADC、UART、SPI、I2S、I2C 和 SDIO 等,便于与传感器、执行器和其他外围设备进行连接和交互。这些特性使得 W55MH32 芯片适用于各种需要高效网络通信和数据处理的应用场景,如智能家居、工业自动化、智能电网等。

image.png

1.3 资源

封装

W55MH32L:100QFN(12x12mm)

W55MH32Q:68QFN(8x8mm)

32 位 Arm Cortex-M3 核心,主频最高可达 216MHz

1024KB FLASH, 96KB SRAM

3 个 12 位 ADC,2 个 12 位 DAC

12 通道 DMA 控制器

10/100 兆以太网 MAC 和 PHY

全硬件 TCP/IP 协议栈,支持:TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE

8 个独立的硬件 socket

独立 32KB 以太网收发缓存

支持自动协商

LED 状态显示

最多 66 个多功能双向 IO 口,全部可映射到 16 个外部中断上。

17 个定时器

10 个通用定时器

2 个带死区控制的高级定时器

2 个基本定时器

2 个看门狗定时器

1 个系统滴答定时器

最多 12 个通信接口

2 个 I2C 接口

5 个 USART 接口

2 个 SPI 接口,1 个带 I2S 接口复用

1 个 CAN 接口

1 个 USB2.0 全速接口(可选内部 1.5K 上拉电阻)

1 个 SDIO 接口

支持硬件加密算法单元(DES、AES、SHA 等)

image.png

1.4 引脚分布

image.png

W55MH32L 引脚分布

image.png

W55MH32Q 引脚分布

二、W55MH32L-EVB 开发板介绍

2.1 简介

W55MH32L-EVB 是基于 W55MH32L 芯片开发的一款功能丰富的开发板,已将芯片上的所有外设和 IO 引出,方便评估芯片和学习。

image.png

W55MH32L-EVB 正面

image.png

W55MH32L-EVB 背面

2.2 板载资源

开发板集成了 TF 卡座,温湿度传感器,EEPROM,用户按钮,用户 LED 等外设,资源丰富。还有一套 ARDUINO 插排,可以外接 ARDUINO 接口的扩展板,无论是开发板自身的功能性和兼容性,还是拓展性都非常强大。

此外,开发板上还集成了一个 WIZ-Link 仿真器,支持调试,程序下载以及虚拟串口功能,再也无须外接仿真器和串口调试工具,只需一根 TYPE C 数据线和一块开发板即可轻松搞定单片机 + 以太网部分的学习内容。

image.png

W55MH32L-EVB 硬件资源配置图

image.png

W55MH32L-EVB 硬件资源配置表

image.png

三、实验前的准备-MicroPython 开发环境的搭建

3.1 烧录 MicroPython 固件和 Thonny IDE 的下载安装

这里,我们主要参考文档:https://docs.w5500.com/ 中内容搭建 MicroPython 开发环境:

image.png

关于 Thonny IDE 的基本介绍和使用可以看教程:https://freakstudio.cn/node/019bd0bd-07e2-7599-9909-f359d81230a9

image.png

首先需要准备一个 Type-C 数据线,连接到开发板上的 DAPLINK-USB 接口:

6e1a2e2c2ba0cd9f2d45638995c45982.png

建议在已有 python 环境下 pip 下载 thonny

pip install thonny

接着,下载固件:

image.png

W55MH32 烧录方式基本和树莓派 Pico 的 UF2 固件烧录方式一模一样,操作简单无需额外操作:

使用 Type-C 数据线连接开发板与电脑

待电脑识别出名为 WIZLINK 的 U 盘

将下载好的 w55mh32_1_27_mpy_260326.hex(实际固件名可能改变) 固件文件拖拽到 U 盘中

开发板会自动重启,固件烧录完成

注意:如果电脑没有识别出 WIZLINK U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口。

image.png

接着,打开 Thonny IDE,我们可以在 Thonny 的右下角解释器选择中看到您的开发板了:

image.png

然后选择开发板:

image.png

3.2 uPyPI-Thonny 插件的安装

thonny-upypi-manager 是 FreakStudio 专为 Thonny IDE 打造的第三方插件,核心作用是对接 FreakStudio 团队维护的 uPyPi(MicroPython 风格包仓库),实现 MicroPython 包的全流程可视化管理,适配 Thonny 4.1.7 及以上版本。

image.png

image.png

简单来说,它就是 uPyPi 仓库的 "Thonny 客户端",让你不用再切换网页、复制终端命令,在 IDE 里就能搞定所有包管理操作。

详细介绍和使用可看教程:https://freakstudio.cn/node/019dd332-61c0-72b4-864e-93f1ef37ca73

image.png

四、GPIO 快速实验:按键、LED 和蜂鸣器

在下列代码中,我们首先导入 Pin 类和 time 类,在初始化配置中设置 PG6 为按键输入引脚,设置 PD14 为 LED 输出引脚,下拉电阻使能。

在主循环中,不断检测按键是否按下:

​如果按键没有按下:​不进行任何操作,

​如果按键已经按下:​在硬件电路中,按键按下时,GPIO 引脚读取的电平为低(0),在按键按下检测到后,延时 50 毫秒(time.sleep_ms(50))进行按键消抖

如果 LED 当前状态为熄灭,则切换为点亮,终端输出 "The LED is ON"

如果 LED 当前状态为点亮,则切换为熄灭,终端输出 "The LED is OFF"

这里的延时 50ms 主要是因为按键在闭合和断开时,触点会存在抖动现象,如图所示:

image.png

实际波形在按键按下的那一刻前后有 50ms 的抖动,因此这里通过延时 50ms 跳过抖动的区域获取中间稳定区域的电平。

Python env : MicroPython v1.27.0

-- coding: utf-8 --

@Time : 2026/5/7 下午1:34

@Author : 李清水

@File : main.py

@Description : GPIO读写实验,完成驱动板载LED灯和按键读取的任务

======================================== 导入相关模块 ========================================

硬件相关的模块

from machine import Pin

时间相关的模块

import time

======================================== 全局变量 ============================================

初始化LED的状态为关闭(False)

led_state = False

======================================== 功能函数 ============================================

======================================== 自定义类 ============================================

======================================== 初始化配置 ==========================================

上电延时3s

time.sleep(3)

打印调试消息

print("FreakStudio: Using GPIO to control LED and read KEY")

需要注意的是 MicroPython 中Pin类的构造函数不支持关键字参数,仅支持位置参数

因此下列定义KEY,将会产生一个报错

TypeError: function missing 1 required positional arguments

key = Pin(id = 2, mode = Pin.IN, pull = Pin.PULL_DOWN)

设置PG6 为按键输入引脚,开启内部上拉电阻,让按键检测更稳定

KEY = Pin("PG6", Pin.IN, Pin.PULL_UP)

设置PD14为LED输出引脚,下拉电阻使能

LED = Pin("PD14", Pin.OUT, Pin.PULL_DOWN)

======================================== 主程序 ============================================

循环检测按键是否按下

while True:

检测到KEY引脚按下

if KEY.value() == 0:

按键消抖:延时50ms跳过抖动的区域

time.sleep_ms(50)

确保按键仍然处于按下状态

if KEY.value() == 0:

切换LED的状态

led_state = not led_state

根据状态变量设置LED亮或灭

if led_state:

LED.value(0)

print("The LED is ON")

else:

LED.value(1)

print("The LED is OFF")

等待按键松开(避免连续检测到按键按下)

while KEY.value() == 0:

pass

这里需要注意的是,​MicroPython​中 Pin 类的构造函数在传入参数时不支持关键字参数,仅支持位置参数,因此下列定义 KEY 将会产生报错 TypeError: function missing 1 required positional arguments:

KEY = Pin(id = 2, mode = Pin.IN, pull = Pin.PULL_DOWN)

将上述代码烧录到 MicroPython 中,可以看到实验现象:image.png

当第一次按下按键时,切换 led_state 为 True,LED 灯点亮并且终端输出如下:

image.png

当第二次按下按键时,切换 led_state 为 False,LED 灯熄灭并且终端输出如下:

image.png

image.png

此后,每按下一次按键,LED 的状态在点亮和熄灭之间交替切换。

同时我们可以看到在 PD15 上有一个蜂鸣器,我们可控制在 LED 亮起时控制蜂鸣器响起

Python env : MicroPython v1.27.0

-- coding: utf-8 --

@Time : 2026/5/7 下午1:34

@Author : 李清水

@File : main.py

@Description : GPIO读写实验,完成驱动板载LED灯蜂鸣器和按键读取的任务

======================================== 导入相关模块 ========================================

硬件相关的模块

from machine import Pin

时间相关的模块

import time

======================================== 全局变量 ============================================

初始化LED的状态为关闭(False)

led_state = False

======================================== 功能函数 ============================================

======================================== 自定义类 ============================================

======================================== 初始化配置 ==========================================

上电延时3s

time.sleep(3)

打印调试消息

print("FreakStudio: Using GPIO to control LED and read KEY")

需要注意的是 MicroPython 中Pin类的构造函数不支持关键字参数,仅支持位置参数

因此下列定义KEY,将会产生一个报错

TypeError: function missing 1 required positional arguments

key = Pin(id = 2, mode = Pin.IN, pull = Pin.PULL_DOWN)

设置PG6 为按键输入引脚,开启内部上拉电阻,让按键检测更稳定

KEY = Pin("PG6", Pin.IN, Pin.PULL_UP)

设置PD14为LED输出引脚,下拉电阻使能

LED = Pin("PD14", Pin.OUT, Pin.PULL_DOWN)

设置PD15为LED输出引脚

BUZZER = Pin("PD15", Pin.OUT)

======================================== 主程序 ============================================

循环检测按键是否按下

while True:

检测到KEY引脚按下

if KEY.value() == 0:

按键消抖:延时50ms跳过抖动的区域

time.sleep_ms(50)

确保按键仍然处于按下状态

if KEY.value() == 0:

切换LED的状态

led_state = not led_state

根据状态变量设置LED亮或灭

if led_state:

LED.value(0)

BUZZER.value(1)

print("The LED is ON")

else:

LED.value(1)

BUZZER.value(0)

print("The LED is OFF")

等待按键松开(避免连续检测到按键按下)

while KEY.value() == 0:

pass

五、I2C 快速实验:读取板载 AHT20 温湿度传感器数据

823f3062d22d392d8d70a5a1f950c7c6.png

如图,在 I2C1 上(PB7=SDA, PB6=SCL)存在一个温湿度传感器 AHT20,这里,我们首先打开 Thonny 和对应 thonny-upypi-manager 插件,搜索 AHT20,将驱动安装到开发板上:

image.png

接下来,将下面的 main.py 烧录并运行:

Python env : MicroPython v1.23.0

-- coding: utf-8 --

@Time : 2026/05/11 07:39

@Author : Andreas Bühl, Kattni Rembor

@File : main.py

@Description : AHT20 温湿度传感器测试程序

@License : MIT

version = "1.0.0"

author = "Andreas Bühl, Kattni Rembor"

license = "MIT"

platform = "MicroPython v1.23"

======================================== 导入相关模块 =========================================

from machine import I2C

import utime

import ahtx0

======================================== 全局变量 ============================================

I2C_ID = 1

INTERVAL_MS = 2500

======================================== 功能函数 ============================================

======================================== 自定义类 ============================================

======================================== 初始化配置 ==========================================

初始化 I2C 总线,PB7=SDA,PB6=SCL

i2c = I2C(I2C_ID)

创建 AHT20 传感器对象

sensor = ahtx0.AHT20(i2c)

======================================== 主程序 ===========================================

print("AHT20 sensor test started")

while True:

try:

读取温度

temp = sensor.temperature

读取相对湿度

humi = sensor.relative_humidity

print("Temperature : %5.1f C" % temp)

print(" Humidity : %5.1f %%rH" % humi)

print("-" * 28)

except RuntimeError as e:

print("Sensor runtime error: %s" % e)

except OSError as e:

print("Sensor OS error: %s" % e)

等待采样间隔

utime.sleep_ms(INTERVAL_MS)

相关推荐
老k一步步来1 小时前
STM32 HAL库CAN通信核心函数详解,参数以及作用
stm32·单片机·嵌入式硬件
paopaokaka_luck3 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
Freak嵌入式5 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
wuyk5555 小时前
77.嵌入式 C 语言中 enum 枚举的工程化实践:告别魔法数字,提升代码可维护性
c语言·开发语言·stm32·单片机·嵌入式硬件
发光小北5 小时前
SG-RS232/485/422-Fiber-110 串口光纤收发器如何使用?
网络协议
纵有疾風起6 小时前
从OSI到TCP/IP——分层架构的思想根源与模型之争
tcp/ip·计算机网络·架构·osi·408·体系结构·分层
longxingiot6 小时前
轻量化单片机数传终端降低物联网开发门槛
单片机·嵌入式硬件·物联网
我星期八休息6 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
看昭奚恤哭7 小时前
LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
网络·tcp/ip·php
亿道电子Emdoor7 小时前
【Arm】MSP和PSP的区别简介
c语言·arm开发·单片机·mcu