ESP32-C3 + W5500 + MicroPython 编译记录

article/2025/6/28 11:07:07

前言

我本来是想连个网,结果连上了无数个坑……

在这个项目中,我的目标是用 ESP32-C3 + W5500 作为有线网关,运行 MicroPython。听上去简单,实操下来却是一场跨平台 + 编译环境 + 烧录流程的大混战。

为了避免你也在这些坑里打转,这篇文章详细记录了我几天以来的所有血泪经验,涵盖:

• macOS + Windows 下的编译与烧录对比

• MicroPython 与 ESP-IDF 的正确版本组合

• 烧录时如何使用正确的 bin 文件

• W5500 实际驱动使用方式


坑的开端:macOS 无法识别 CH343

        一切的混乱始于我用的开发板串口芯片是 CH343,macOS 下驱动兼容不太好。无奈切到 Windows 环境开始编译和烧录。可以买两个TpyeC的那种,我的S3就是两个头的,是可以正常使用的。

在MacOS使用Thonney烧录报错:Downloading from https://micropython.org/resources/firmware/ESP32_GENERIC_C3-20250415-v1.25.0.bin
Writing to /var/folders/dy/t1n7jgcs48389c2_ct1vqqk00000gn/T/tmpisppkp6z/ESP32_GENERIC_C3-20250415-v1.25.0.bin
100%/Applications/Thonny.app/Contents/Frameworks/Python.framework/Versions/3.10/bin/python3.10 -u -m esptool --port /dev/cu.usbmodem5A450120851 --chip esp32c3 --baud 115200 write_flash --flash_mode keep --flash_size keep --erase-all 0x0 /var/folders/dy/t1n7jgcs48389c2_ct1vqqk00000gn/T/tmpisppkp6z/ESP32_GENERIC_C3-20250415-v1.25.0.bin
esptool.py v4.7.0
Serial port /dev/cu.usbmodem5A450120851
Connecting....
Chip is ESP32-C3 (QFN32) (revision v0.4)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 9c:9e:6e:ee:a4:28
Uploading stub...A fatal error occurred: Failed to write to target RAM (result was 01070000: Operation timed out)Command returned with error code 2(注:插上线,按住boot,按一下reset,点安装,我是一直按住boot,直到安装完成)

ESP-IDF 版本的混乱:5.5 ➜ 5.1.1 ➜ 5.4 ➜ 5.2.2

根据一众Ai的指导,我开始尝试用 ESP-IDF v5.5,一堆错误:

版本不匹配错误:D:/A_GitCode/esp-idf/components/mbedtls/mbedtls/library/platform_util.c:261:2: error: #error "No mbedtls_ms_time available"261 | #error "No mbedtls_ms_time available"|  ^~~~~#error "No mbedtls_ms_time available"还是版本不对:In file included from /Users/chenph/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/riscv32-esp-elf/include/sys/reent.h:458,from /Users/chenph/esp-idf/components/newlib/platform_include/sys/reent.h:13,from /Users/chenph/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/riscv32-esp-elf/include/alloca.h:11,from /Users/chenph/Work/micropython/ports/esp32/mpconfigport.h:8,from /Users/chenph/Work/micropython/py/mpconfig.h:91,from /Users/chenph/Work/micropython/py/mpstate.h:31,from /Users/chenph/Work/micropython/py/runtime.h:29,from /Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c:28:
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c: In function 'ble_secret_store_read':
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c:1914:33: error: 'const struct ble_store_key_sec' has no member named 'ediv_rand_present'1914 |                 assert(!key->sec.ediv_rand_present);|                                 ^
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c:1920:33: error: 'const struct ble_store_key_sec' has no member named 'ediv_rand_present'1920 |                 assert(!key->sec.ediv_rand_present);|                                 ^
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c:1931:28: error: 'const struct ble_store_key_sec' has no member named 'ediv_rand_present'1931 |             assert(key->sec.ediv_rand_present);|                            ^
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c: In function 'ble_secret_store_write':
/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c:1980:27: error: 'struct ble_store_key_sec' has no member named 'ediv_rand_present'1980 |             assert(key_sec.ediv_rand_present);|                           ^
make[3]: *** [esp-idf/main_esp32c3/CMakeFiles/__idf_main_esp32c3.dir/Users/chenph/Work/micropython/extmod/nimble/modbluetooth_nimble.c.obj] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [esp-idf/main_esp32c3/CMakeFiles/__idf_main_esp32c3.dir/all] Error 2
make[1]: *** [all] Error 2
make failed with exit code 2, output of the command is in the /Users/chenph/Work/micropython/ports/esp32/build-ESP32_GENERIC_C3/log/idf_py_stderr_output_38444 and /Users/chenph/Work/micropython/ports/esp32/build-ESP32_GENERIC_C3/log/idf_py_stdout_output_38444
-e See https://github.com/micropython/micropython/wiki/Build-Troubleshooting
make: *** [all] Error 1

❌ v5.5 版本过新,构建失败

❌ v5.1.1 也报错

⚠️ v5.4 是给 MicroPython v1.25 用的

       网上说AI各种厉害的,纯扯淡,我用了最新版本的ChatGPT,Grok,Claude,没一个靠谱的,还是老老实实啃文档吧!!

最终确认:

MicroPython v1.24 要配 ESP-IDF v5.2.2

我当前用的是 v1.24,回退到 ESP-IDF v5.2.2 后,很快就成功了。


Windows CMD噩梦:命令太长 + 编码格式爆炸

本来觉得烧录和编码只能用Windows了,那也在Windows下来吧,但 Windows 下编译 MicroPython 的体验极差:

• CMD 命令太长,频繁触发路径长度限制;(需要装wsl,我没有装,直接劝退,换回MacOS编译)

命令过长:(esp-idf\main_esp32c3\CMakeFiles\qstr.i.last-417609e.bat)[790/1349] Generating ../../genhdr/qstr.i.lastFAILED: genhdr/qstr.i.last D:/A_GitCode/micropython/ports/esp32/build-ESP32_GENERIC_C3/genhdr/qstr.i.last esp-idf\main_esp32c3\CMakeFiles\qstr.i.last-417609e.bat 08f08957beaee5a6The system cannot execute the specified program.Batch file failed at line 3 with errorcode 1[791/1349] Building ASM object esp-idf/riscv/CMakeFiles/__idf_riscv.dir/vectors.S.obj[792/1349] Linking C static library esp-idf\hal\libhal.a[793/1349] Building C object esp-idf/riscv/CMakeFiles/__idf_riscv.dir/instruction_decode.c.obj[794/1349] Building C object esp-idf/riscv/CMakeFiles/__idf_riscv.dir/interrupt.c.obj[795/1349] Building C object esp-idf/riscv/CMakeFiles/__idf_riscv.dir/interrupt_intc.c.objninja: build stopped: subcommand failed.ninja failed with exit code 1, output of the command is in the D:\A_GitCode\micropython\ports\esp32\build-ESP32_GENERIC_C3\log\idf_py_stderr_output_6864 and D:\A_GitCode\micropython\ports\esp32\build-ESP32_GENERIC_C3\log\idf_py_stdout_output_6864
See [1;31mhttps://github.com/micropython/micropython/wiki/Build-Troubleshooting[0m
make: *** [Makefile:71: all] Error 1

• Python 构建脚本中带有 Unicode 字符时,命令行编码乱掉;(可以设置chcp 65001)

乱码报错:(这个不知道是什么玩意:"ϵͳ޷ִָij",设置编码后可以解决)GEN D:/A_GitCode/micropython/ports/esp32/build-ESP32_GENERIC_C3/genhdr/mpversion.h
[787/1349] Generating ../../genhdr/qstr.i.last
FAILED: genhdr/qstr.i.last D:/A_GitCode/micropython/ports/esp32/build-ESP32_GENERIC_C3/genhdr/qstr.i.last
esp-idf\main_esp32c3\CMakeFiles\qstr.i.last-417609e.bat c45bc19e3ff53715
ϵͳ޷ִָij
Batch file failed at line 3 with errorcode 1
[792/1349] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio.c.obj
ninja: build stopped: subcommand failed.
ninja failed with exit code 1, output of the command is in the D:\A_GitCode\micropython\ports\esp32\build-ESP32_GENERIC_C3\log\idf_py_stderr_output_2176 and D:\A_GitCode\micropython\ports\esp32\build-ESP32_GENERIC_C3\log\idf_py_stdout_output_2176
See https://github.com/micropython/micropython/wiki/Build-Troubleshooting
make: *** [Makefile:71: all] Error 1

烧录失败的原因:用了错误的 bin 文件

构建成功后,我直接切回Windows烧录 micropython.bin,结果设备无法正常启动。后来才发现:

• 构建目录里还有一个自动生成的 firmware.bin

• 这个 firmware.bin 是 MicroPython 工程自动合并的成品,已经包含了 bootloader、partitions 和 micropython.bin,我烧录的micropython.bin

烧录之后控制台循环报错:ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x7 (TG0WDT_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40047ed2
SPIWP:0xee
mode:DIO, clock div:1
load:0x3c150020,len:0x3cd28
load:0x3fc96600,len:0x3044
load:0x40380000,len:0x27c
load:0x42000020,len:0x14c444
Invalid image block, can't boot.
ets_main.c 333

只需要烧这个 firmware.bin就可以了!


真相大白:W5500 默认就支持了!

我一开始被Ai误导,需要使用 network.WIZNET5K() 来手动配置驱动,结果发现:

官网下载的 Esp32C3 的MicroPython v1.25版本,W5500 已经内置支持,可以直接用 network.LAN() 调用!

无需额外驱动、无需自己编译,开箱即用 !


总结,正确的顺序(micropython1.24为例)

  • esp-idf 搭建
$ git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git
$ cd esp-idf
$ git checkout v5.2.2
$ git submodule update --init --recursive
$ cd esp-idf
$ ./install.sh       # (or install.bat on Windows)
$ source export.sh   # (or export.bat on Windows)
  • micropython 搭建
$ git clone -b v1.24.0 --recursive https://github.com/micropython/micropython.git
$ cd mpy-cross
$ make
$ cd ports/name
$ make submodules
  • micropython 编译
$ make BOARD=ESP32_GENERIC_S3


http://www.hkcw.cn/article/utXACGBfHJ.shtml

相关文章

项目管理进阶:56页大型IT项目管理实践经验分享【附全文阅读】

此文档为大型IT项目管理实践经验分享目录概览,主要包含以下核心内容: 1. **整体介绍**:阐述了项目管理在IT领域的重要性,特别是针对产品经理与开发人员间的冲突和挑战,提出通过项目管理方法来提升工作效率。目标受众为…

一种在SQL Server中传递多行数据的方法

这是一种比较偷懒的方法,其实各种数据库对Json 支持的很好。sql server 、oracle都不错。所以可以直接传json declare 这是一个json varchar(max) set 这是一个json{"data":[{"code":"1","name":"啥1"},{"…

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP(Hyper Text Transfer Protocol) 超文本传输协议,是一种建立在 TCP 上的无状态连接,整个基本的工作流程是客户端发送一个 HTTP 请求,说明…

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率:H264 由于算法优化,可以低于 2Mbps 的速度实现标清数字图像传送;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下,实现 1080p 全高清视频传输。 编码架构:H.265/HEVC…

第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列

LinkedList集合的底层原理 LinkedList集合的应用场景之一 代码:掌握LinkedList集合的使用 package com.itheima.day19_Collection_List;import java.util.LinkedList; import java.util.List;//掌握LinkedList集合的使用。 public class ListTest3 {public static …

用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

实现Cursor + Pycharm 交互

效果演示: 直接可以在cursor或Pycharm中点击右键点击,然后就可以跳转到另一个应用的对应位置了 使用方法: 分别在两个应用中安装插件【Switch2Cursor Switch2IDEA,这两个插件分别安装在 IDEA 和 Cursor 中】: Switc…

【Linux】进程控制-上

> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有不足,还请多多包涵&a…

QT之头像剪裁效果实现

文章目录 源码地址,环境:QT5.15,MinGW32位效果演示导入图片设置剪裁区域创建剪裁小窗口重写剪裁小窗口的鼠标事件mousePressEventmouseMoveEventmouseReleaseEvent 小窗口移动触发父窗口的重绘事件剪裁效果实现 源码地址,环境&…

Android基于LiquidFun引擎实现软体碰撞效果

一、实现效果 Android使用LiquidFun物理引擎实现果冻碰撞效果 二、Android代码 // 加载liquidfun动态库static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Baklib赋能企业AI知识管理实践

Baklib构建AI-ready知识体系 Baklib作为新一代知识中台的核心引擎,通过知识图谱构建与自然语言处理(NLP)技术,将碎片化信息转化为结构化知识资产。平台依托智能语义分析能力,自动识别文档中的实体关系与上下文逻辑&am…

如何在 Windows 11 24H2 的任务栏时钟中显示秒数

我们都很熟悉任务栏时钟,或者说,是我们运行 Windows 的电脑屏幕右下角的数字时钟。它显示小时和分钟的时间,这基本上是每个人需要的,但我们有时也需要看到秒数。随着 Windows 11 的最新更新,它可以在任务栏时钟中直接显…

navicate菜单栏不见了怎么办

别慌!!! 将鼠标放到navicate框的最左侧,看到出现两个竖线(像这样||),点击拖动鼠标拉出来吧。

张家界溶洞垃圾堆7层楼高 污染触目惊心

近日,一段视频曝光了张家界市慈利县一处天然溶洞遭到人为排污的情况,引发广泛关注。视频中,溶洞内流淌着泛着绿色的污水,伴有黄绿色的淤泥沉积,黑色污染物自洞壁滑落凝固成厚厚的“黑痂”。拍摄者称,垃圾堆积高度达到七八层楼,令人触目惊心。据张家界市生态环境局透露,…

软件安全保障关键之漏洞扫描:原理、分类及意义全解析?

软件安全保障的关键在于漏洞扫描,这项工作通过特定技术和流程进行,旨在发现软件中可能存在的安全隐患,比如缓冲区溢出、跨站脚本攻击等,这些漏洞得以被识别和记录,对确保软件安全具有重要意义。 扫描原理 漏洞扫描依…

韩国大选开始投票 5人竞逐总统 李在明领跑民调

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。没有参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下5位候选人…

计算机网络 : 应用层自定义协议与序列化

计算机网络 : 应用层自定义协议与序列化 目录 计算机网络 : 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

比亚迪打响降价战为哪般 应对销量与利润双重压力

比亚迪打响降价战为哪般 应对销量与利润双重压力。5月22日,比亚迪宣布对旗下王朝网和海洋网共计22款车型降价,降幅在1.2万元至5.3万元之间,活动将持续到6月底。这是比亚迪自三月底以来的第三次降价,力度最大。作为中国新能源汽车销量冠军,比亚迪的大面积、大幅度降价预示着…

电子电器架构 --- 远程信息控制单元(TCU)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…

榴莲大降价!它能从“奢侈果”变成“亲民果”吗

夏季是各类水果集中上市的季节,榴莲爱好者们最近有口福了,市场上榴莲价格出现了大幅下降,甚至“腰斩”的情况。造成榴莲价格下跌的原因都有哪些?榴莲会不会就此从“奢侈果”变成“亲民果”?走进位于浙江湖州的一家榴莲批发店,榴莲成堆地被摆放在货架上,老板肖女士正在开…