本文为 W55RP20-EVB-Pico 模块 MicroPython 教程专项篇基于官方最新固件编写代码均经过实际验证可直接烧录运行。 版权声明本文为 WIZnet 官方原创技术文章转载请注明出处。前言上一篇实战教程我们已经完成了 W55RP20 芯片 DNS 域名解析与公网 IP 映射功能开发。本篇内容我们聚焦嵌入式设备精准计时的核心技术 ——NTP 网络时间同步。NTP网络时间协议是物联网领域通用的时间同步协议默认基于 UDP 123 端口通信可让设备自动获取全球标准 UTC 时间解决本地时钟漂移、断电清零、手动校准繁琐等问题非常适合嵌入式以太网设备的日志打点、定时任务、多设备时序同步场景。W55RP20 集成硬件 TCP/IP 协议栈搭配 MicroPython 开发环境几行代码即可实现稳定 NTP 时间同步无需关心底层 Socket 细节自动完成时区转换与定时重同步防漂移。NTP 协议核心原理与时间戳换算机制W55RP20 通过公网 NTP 服务器获取标准时间实现 UTC 时间转北京时间时区校准本地走时 定时重同步防漂移实现NTP 请求异常处理与常见问题排查嵌入式设备精准计时的工业级实现方案系列教程学习路径本专栏共 15 篇循序渐进覆盖 W55RP20-EVB-Pico 模块 MicroPython 开发全流程第 1 篇静态 IP 配置与网络基础第 2 篇DHCP 自动联网与网络诊断第 3 篇TCP Client 客户端通信第 4 篇TCP Server 服务端通信第 5 篇UDP 单播数据通信第 6 篇UDP 组播/广播数据通信第 7 篇DNS 域名解析第 8 篇NTP 从网络获取时间本文第 9 篇HTTP Client 客户端请求第 10 篇HTTP Server 服务端搭建第 11 篇HTTP 协议与 OneNET 平台数据上云第 12 篇MQTT 协议基础通信验证第 13 篇MQTT 协议与阿里云平台对接第 14 篇MQTT 协议与 OneNET 平台对接第 15 篇MQTT 协议与 ThingSpeak 平台对接第 16 篇Modbus 工业协议通信目录前言系列教程学习路径1. 准备工作1.1 软件准备1.2 硬件准备2. 烧录 W55RP20-EVB-Pico 模块专属 MicroPython 固件3. 硬件连接与开发环境配置3.1 硬件连接3.1.1 基础连接供电调试3.1.2 以太网连接3.1.3 模块与开发板接线3.2 Thonny 开发环境配置4. NTP 协议核心原理4.1 NTP 协议简介4.2 时间戳换算规则4.3 时区说明4.4 NTP 工作流程5. WIZnet 硬件协议授时优势6. 核心代码解析6.1 完整可运行代码6.2 代码功能说明7. 运行结果与测试验证8. 常见问题一站式排查9. 典型应用场景10. 系列预告与资源获取10.1 系列预告10.2 资源获取1. 准备工作1.1 软件准备所需软件均为免费版本按要求下载安装即可无需额外付费。软件名称版本要求下载地址说明Thonny4.0 及以上Thonny 官方下载轻量级 MicroPython IDE支持代码编辑、烧录与串口调试新手友好W55RP20-EVB-Pico 模块 MicroPython 固件最新稳定版WIZnet 官方固件下载专为 W55RP20-EVB-Pico 模块 编写已集成 WIZnet 硬件驱动与协议栈1.2 硬件准备W55RP20-EVB-Pico × 1Micro USB 数据线必须支持数据传输不能使用纯充电线× 1标准网线 × 1开启 DHCP 功能的路由器 / 交换机 × 1用于获取网络参数实现 DNS 解析W55RP20-EVB-Pico 模块已集成以太网相关器件无需额外焊接飞线配合 RP2040 开发板可快速搭建开发环境大幅降低接线错误和硬件故障概率。2. 烧录 W55RP20-EVB-Pico 模块专属 MicroPython 固件W55RP20-EVB-Pico 模块 完全兼容树莓派 Pico 的 UF2 固件烧录方式操作简单无需额外烧录器新手可快速上手按住 RP2040 开发板上的 BOOTSEL 按键不放使用 Micro USB 数据线连接开发板与电脑待电脑识别出名为 RPI-RP2 的 U 盘后松开 BOOTSEL 按键将下载好的 W5500_RP2040_firmware.uf2 固件文件拖拽到 U 盘中开发板会自动重启固件烧录完成。注意如果电脑没有识别出 RPI-RP2 U 盘请尝试更换 USB 数据线、重新插拔开发板或更换电脑 USB 接口优先使用 USB 2.0 接口。3. 硬件连接与开发环境配置3.1 硬件连接W55RP20-EVB-Pico 模块连接分为两步分别实现供电/调试和以太网连接操作简单无需复杂接线3.1.1 基础连接供电调试使用 Micro USB 数据线连接 RP2040 开发板与电脑用于开发板供电、代码烧录和串口调试。3.1.2 以太网连接使用网线连接 W55RP20-EVB-Pico 模块的以太网接口与路由器的 LAN 口或直接连接电脑网口需手动配置电脑 IP 与开发板同网段。3.1.3 模块与开发板接线若使用分离式模块与开发板需按以下引脚对应连接SPI 通信【硬件预留】此处插入硬件连接示意图3.2 Thonny 开发环境配置打开 Thonny 软件按以下步骤配置开发环境确保代码能正常烧录和运行点击顶部菜单栏「运行」→「配置解释器」切换到「解释器」选项卡在「解释器」下拉列表中选择 MicroPython (通用)在「端口」下拉列表中选择开发板对应的串口通常显示为 Board CDC COMx勾选「运行代码前先重启解释器」和「同步设备的实时时钟」点击「确定」完成配置。如果端口列表中没有出现开发板请尝试重新插拔 USB 数据线更换支持数据传输的 USB 数据线关闭其他占用串口的软件如串口助手、Arduino IDE 等重新烧录 MicroPython 固件安装树莓派 Pico USB 驱动。4. NTP 协议核心原理4.1 NTP 协议简介NTPNetwork Time Protocol网络时间协议是嵌入式、物联网领域通用的时间同步协议默认使用UDP 123 端口进行通信。设备通过向公网 NTP 服务器发送请求数据包获取全球统一标准时间解决本地时钟不准、时间漂移问题。4.2 时间戳换算规则NTP 原始时间起始年份 1900-01-01Unix 标准时间戳起始年份 1970-01-01固定时间偏移量用于两种时间格式相互转换4.3 时区说明NTP 服务器默认返回 UTC 零时区 时间北京时间为 UTC8程序内部自动增加 8 小时时差直接输出本地标准时间。4.4 NTP 工作流程开发板通过 DHCP 自动获取 IP完成网络联网构建标准 NTP 请求报文通过 UDP 发送至 NTP 服务器服务器返回 48 字节标准时间数据包解析数据包提取 NTP 时间戳转换为 Unix 时间程序计算时区偏差格式化输出年月日时分秒本地循环走时每分钟自动重同步抑制时间漂移。5. WIZnet 硬件协议授时优势相比于传统软件协议栈方案W5500 硬件 TCP/IP 协议栈在 NTP 授时场景优势明显全程硬件处理网络报文0% 占用 MCU CPU 资源UDP 请求响应速度更快网络授时延迟低工业级抗干扰设计复杂网络环境下同步成功率高芯片集成 MACPHY 协议栈外围电路精简BOM 成本更低MicroPython 固件底层封装完成仅需少量代码快速实现 NTP 功能多硬件 Socket 资源可同时运行 NTP、TCP、UDP、MQTT 多网络任务。6. 核心代码解析6.1 完整可运行代码from wiznet_init import wiznet import usocket import struct import time # 初始化网络 nic wiznet(W55RP20-EVB-Pico, dhcpTrue) print(IP:, nic.ifconfig()[0]) # NTP服务器阿里云稳定IP NTP_IP 120.25.115.20 NTP_PORT 123 # 1900-01-01 到 1970-01-01 的秒数 NTP_TO_UNIX_DELTA 2208988800 def get_ntp_unix_time(): 获取标准Unix时间戳从1970-01-01开始的秒数 try: sock usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM) sock.settimeout(3) msg b\x1b b\x00 * 47 sock.sendto(msg, (NTP_IP, NTP_PORT)) data, addr sock.recvfrom(48) sock.close() ntp_timestamp struct.unpack(!I, data[40:44])[0] return ntp_timestamp - NTP_TO_UNIX_DELTA except Exception as e: print(NTP同步失败:, e) return None def unix_to_datetime(ts): 把Unix时间戳转为(年,月,日,时,分,秒) 时区UTC8 北京时间 # 转为北京时间 t ts 8 * 3600 # 先算年份 year 1970 days_in_year 365 while True: # 判断闰年 is_leap (year % 4 0 and year % 100 ! 0) or (year % 400 0) if is_leap: days_in_year 366 else: days_in_year 365 year_seconds days_in_year * 86400 if t year_seconds: break t - year_seconds year 1 # 再算月份 if is_leap: month_days [31,29,31,30,31,30,31,31,30,31,30,31] else: month_days [31,28,31,30,31,30,31,31,30,31,30,31] month 1 for md in month_days: month_seconds md * 86400 if t month_seconds: day t // 86400 1 t % 86400 break t - month_seconds month 1 # 时分秒 hour t // 3600 t % 3600 minute t // 60 second t % 60 return (year, month, day, hour, minute, second) # 首次同步 print(正在同步NTP时间...) unix_ts get_ntp_unix_time() if not unix_ts: print(首次同步失败程序退出) exit() print(同步成功) last_sync_ts unix_ts last_sync_micros time.time() # 每秒更新每分钟重连NTP while True: elapsed int(time.time() - last_sync_micros) current_ts last_sync_ts elapsed dt unix_to_datetime(current_ts) print(f{dt[0]}年{dt[1]:02d}月{dt[2]:02d}日 {dt[3]:02d}:{dt[4]:02d}:{dt[5]:02d}) # 每分钟重新同步一次防止飘移 if elapsed 60: print(重新同步NTP...) new_ts get_ntp_unix_time() if new_ts: last_sync_ts new_ts last_sync_micros time.time() print(重新同步成功) time.sleep(1)6.2 代码功能说明依靠 wiznet_init 模块快速完成硬件初始化、DHCP 自动联网配置阿里云高可用 NTP 服务器保证同步稳定性封装 NTP 请求函数自动收发、解析 UDP 数据包完成时间戳换算、时区加 8 小时输出标准北京时间本地软件秒级走时保证断网也能继续计时每分钟主动重连 NTP 服务器修正时间漂移增加异常捕获网络波动时不会卡死程序。7. 运行结果与测试验证将代码复制到 Thonny点击运行串口输出如下IP Address: (192.168.1.123, 255.255.255.0, 192.168.1.1, 202.96.134.33) IP: 192.168.1.123 正在同步NTP时间... 同步成功 2026年04月30日 10:45:49 2026年04月30日 10:45:50 2026年04月30日 10:45:51设备正常联网、时间同步成功秒级自动刷新时间精准无误。8. 常见问题一站式排查NTP 同步超时 / 同步失败检查网线连接确认开发板可以正常访问外网路由器禁止 UDP 123 端口会导致失败更换手机热点测试更换其他公共 NTP 服务器地址。时间相差 8 小时代码未做 UTC8 时区补偿检查时间转换函数。每隔一段时间时间偏差变大正常现象本程序每分钟自动重同步可自行修改同步周期。Thonny 无法识别开发板更换 USB 线、安装 Pico 串口驱动、关闭占用串口软件。9. 典型应用场景物联网设备日志时间戳记录工业传感器定时采集、定时上报数据智能家居设备定时开关、时序控制多设备组网场景下统一时间基准嵌入式教学、NTP 协议原理实验无 RTC 硬件低成本精准计时方案。10. 系列预告与资源获取10.1 系列预告下一篇将带来HTTP Client 客户端请求实战教程讲解基于 W55RP20-EVB-Pico 硬件协议栈实现网页请求、API 数据获取、JSON 数据解析为后续设备上云、网络数据交互打下基础。10.2 资源获取WIZnet官网W5500 芯片手册WIZnet 官方资料网址