news 2026/10/31 6:26:33

ESP32-S3与C3 Mini选型指南:PSRAM、USB差异与采购核对清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32-S3与C3 Mini选型指南:PSRAM、USB差异与采购核对清单

很多人第一次买 ESP32-S3 Mini 和 C3 Mini,都是看着引脚图差不多、价格也接近,就随手拍了一块。结果等板子到手才发现,有的带 PSRAM、有的不带,USB 口能做的事也完全不一样——有人在 Type-C 插上去能出现一个串口,有人插上去啥反应都没有,还有人想在 S3 上做 USB 键盘,到最后才发现买成了 C3。本文就把这两块 Mini 板从 PSRAM、USB 到采购核对一次说清楚,给正在选型的人一张可以直接照着打勾的采购单,下单前扫一眼就能避掉大多数坑。

1. 核心差异:S3 和 C3 到底差在哪

1.1 性能定位:双核 Xtensa 与单核 RISC-V

先别被“Mini”这个后缀带走,S3 和 C3 的内部架构差得不是一点半点。ESP32-S3 是双核 Xtensa LX7 处理器,主频最高能到 240MHz,内部 SRAM 大约 512KB;ESP32-C3 是单核 RISC-V 处理器,主频 160MHz,内部 SRAM 大约 400KB。这两个芯片都支持 2.4GHz Wi-Fi 和 BLE 5,无线部分是同一套体系,差的是算力、内存规模以及外设丰富程度。

对我这种经常写 LVGL 屏幕界面、做摄像头采集的人来说,S3 的双核和 240MHz 主频不是“参数好看”,而是实际跑任务时,一个核跑业务逻辑、另一个核跑协议栈或显示刷新,基本不会互相拖后腿。C3 的定位更偏向低功耗物联网节点、传感器采集、简单网络上报这类轻负载场景,跑 MicroPython 做个 Blink、读个温湿度、接个继电器,体验也不错,但一旦涉及大屏、图片解码、音视频处理,C3 就会很吃力。

选购前可以先问自己一个问题:这个项目是“跑业务逻辑为主”还是“处理大块数据为主”。前者 C3 够用,后者老老实实选 S3。C3 再省电、再便宜,也没法靠优化把缺失的算力和内存变出来。

1.2 模组丝印上的命名秘密:N8、N8R8、N16R8

S3 和 C3 的模组命名规则完全不同,但很多卖家标题只写“ESP32-S3 Mini”或“C3 Mini”,真正决定配置的型号后缀全藏在商品详情页的小字里。

S3 的小型模组一般是 ESP32-S3-MINI-1 系列,常见后缀有三种:

型号后缀FlashPSRAM典型用途
N88MB无轻量应用、普通物联网
N8R88MB8MBLVGL、摄像头、USB应用
N16R816MB8MB大固件、离线资源、复杂工程

这里“R”就是 PSRAM 的意思,后面跟着的数字是容量。ESP32-S3 支持外部 SPI PSRAM,可以把它当作大块内存池使用,虽然速度比内部 SRAM 慢,但能塞下大量临时数据。C3 的模组一般是 ESP32-C3-MINI-1,Flash 常见 4MB,命名里没有 R 后缀,也基本没有 PSRAM 的概念,因为 C3 芯片本身就不支持外部 PSRAM 内存映射,想加都不好加。

看丝印是核对配置最直接的方式。拿到板子先看模组金属屏蔽罩或标签,N8R8 和 N8 只是一字之差,实际可用内存差了 8MB,价格也差一截。很多二手板和兼容板会把丝印磨掉,或者只标“ESP32-S3”不带后缀,这种情况我建议直接找客服确认,或者换一家标清楚型号的店铺。

2. PSRAM 不是锦上添花,而是决定你后续能玩多大的关键

2.1 什么时候必须带 PSRAM

很多人觉得 PSRAM 是“可选项”,反正用不到那么多内存。但我见过太多例子:一开始买 N8 回来,跑 Arduino 点个灯、读个传感器完全没问题,等想上屏幕或者接摄像头时,才发现内存不够,最后只能重新买板子。

以一块 320×240 RGB565 屏幕为例,一帧图像是 320×240×2 字节,约 150KB。你要是用双缓冲,光显存就要 300KB,这还没算 LVGL 本身的动画、字体缓存、控件对象。ESP32-S3 的内部 SRAM 虽然有 512KB,但系统、Wi-Fi、协议栈再占用一部分,实际能自由分配的也就两百多KB,跑一个带图标的 LVGL 界面很容易触顶。有 8MB PSRAM 就不一样,显示缓冲、图片解码、字体缓存都能放到 PSRAM 里,内部 SRAM 留给实时性要求高的任务。

摄像头场景更明显。OV2640 这类摄像头输出 JPEG 或 RGB 数据时,系统需要有足够的 DMA 缓冲和编码缓冲,图像分辨率越大,内存消耗越恐怖。S3 本身有 SIMD 和向量指令,可以用来做图像预处理,但没有 PSRAM 的话,这些能力会被内存瓶颈堵得死死的。跑 OpenMV 这类视觉框架更是硬性要求大容量 PSRAM,因为固件和帧缓冲都需要内存空间。

还有 HTTPS 连接、TLS 握手、大 JSON 解析这类网络应用,也会在瞬时申请成百上千字节的堆内存。没有 PSRAM 的板子在遇到复杂证书链或大响应体时,经常表现为“连接上但很快断开”“网页刷不出来”,其实不是网不好,是内存不够。

2.2 没有 PSRAM 的真实感受

我手上有两块 S3 板子,一块 N8、一块 N16R8。N8 那块现在只做串口转发和简单的 MQTT 上报,固件非常小,跑起来稳定。N16R8 那块接了 2.1 寸 IPS 屏和摄像头,固件接近 2MB,运行时动态内存峰值经常到 6MB 以上。如果我把这固件烧进 N8,大概率是开机重启、malloc 失败、显示内容残缺。

这种现象在 Arduino 环境里特别典型,因为 Arduino-ESP32 默认把 PSRAM 分配给malloc,你写malloc(300000)在无 PSRAM 板子上会返回 NULL,代码直接崩;在有 PSRAM 的板子上则顺利拿到内存。MicroPython 也有类似行为,部分固件启用 PSRAM 后,Python 的堆可以自动扩容到几 MB,跑大点的脚本才有余量。

所以我的建议是:S3 板子如果价格差距在 10-20 块以内,尽量买 N8R8 或 N16R8。你不是为今天买,是为下次想跑大工程时买。C3 没有 PSRAM,所以也别幻想用软件优化弥补,直接选合适场景即可。

2.3 三步核对你的板子到底有没有 PSRAM

第一步,看模组丝印。最可靠,也最快。N8R8、N16R8 带 PSRAM,N8 不带。

第二步,看商品参数。正规店铺会在参数里写“内存:8MB Flash + 8MB PSRAM”,或者“8M Flash / 8M PSRAM”。如果只写“8MB”而没提 PSRAM,基本就是 N8 无 PSRAM 的版本。

第三步,上电后看系统日志。ESP-IDF 刷机时会在启动日志里打印 PSRAM 信息,比如Detected PSRAM: 8MB;Arduino 环境可以用ESP.getPsramSize()读取,返回 0 就是没启用或没有 PSRAM;MicroPython 则在部分固件里通过gc.mem_free()看堆大小,如果堆超过 1MB,说明固件已经把 PSRAM 并入堆管理。这一步比任何商品描述都靠谱,因为能实际确认硬件和固件配合时到底能不能用上。

3. USB 到底怎么选:原生USB和USB转串口是两码事

3.1 USB转串口芯片和芯片原生USB的区别

这是采购时最乱的一个点。很多开发板会焊一颗 CH340、CP2102、FT231X 之类的 USB 转串口芯片,把 Type-C 口的 USB 信号转换成 UART 信号,再接到 ESP32 的 TX/RX。这种情况下,你电脑看到的是一个“串口设备”,ESP32 本身并不直接感知 USB 信号,它只是在跑 UART 协议。烧录、看日志都没问题,但你不能把它变成立即插入电脑就自动识别的键盘、鼠标或 U 盘。

相比之下,ESP32-S3 和 ESP32-C3 都内置了原生 USB 控制器。S3 的是 USB OTG 全速接口,速度 12Mbps;C3 的是 USB Serial/JTAG 接口,功能比 S3 弱很多。原生 USB 的含义是:芯片的 GPIO 直接作为 D+/D- 信号连接到 Type-C 口,固件里写什么设备协议,电脑就识别成什么设备。你可以用 TinyUSB 把它实现成 HID 键盘、MIDI 设备、MSC 大容量存储、CDC 串口,这些是 USB 转串口方案做不到的。

以前用 STM32 做 USB 设备,要移植 USB 协议栈、配置中断、处理端点描述符,还要注意外部晶振精度,门槛不低。ESP32-S3 原生的 USB OTG 加上 TinyUSB 之后,开发门槛大幅下降,这也是我推荐做 USB 外设的人直接选 S3 的原因。

3.2 S3的USB OTG能解锁哪些玩法

S3 的 USB OTG 全速接口意味着它可以作为 USB 设备,也可以外接 USB 主机。最常见的玩法是做一个 USB 键盘/鼠标,插上电脑直接被识别成标准输入设备,不需要额外驱动。延迟比蓝牙方案低,也没有配对问题。

另一个经典玩法是 USB Mass Storage。把 SD 卡或 flash 暴露成 U 盘,电脑插上就能读写文件,对做数据记录仪、离线配置文件更新非常方便。TinyUSB 里都有现成例程,改改描述符就能跑。

做 USB 抓包调试也是我常干的事。把板子插到 Linux 主机上,用usbmon模块配合 Wireshark 抓 URB 包,能看到板子枚举时的设备描述符、配置描述符、端点传输情况。开发自定义 USB 设备时,这套流程比盲猜端点配置高效得多。USB 协议本身并不复杂,控制传输、批量传输、中断传输加起来就那么几类,关键是手里得有一个能真实运行的设备让你抓包对照。

3.3 C3的USB Serial/JTAG够用在哪里

C3 的 USB Serial/JTAG 接口能力有限,它只能把自己模拟成一个 USB 串口,同时复用为 JTAG 调试口。你可以用它烧录程序、看串口日志、做 OpenOCD 调试,但不能把它变成 HID 或 MSC 设备。

那 C3 的 USB 是不是就没用?不能这么说。它最大的价值是省掉了 USB 转串口芯片的成本和麻烦。板载一颗 CH340 要一两块钱,还得占 PCB 面积,C3 原生 USB 直接一根线就能下载和看日志,对轻量开发板来说非常合适。

但要注意,C3 的 USB Serial/JTAG 使用的引脚是固定的 GPIO18/GPIO19,这两个引脚在部分开发板上可能被复用成了其他功能。如果你想同时使用这两个引脚做别的信号,会冲突。采购时看到 C3 板子同时整合了原生 USB 和 CH340,反而可能是负优化,因为两个方案互相抢引脚和电路,还不如只留一个。

3.4 不同USB需求的采购建议

这里我整理一个简单对照,帮助你把 USB 需求翻译成板卡选型:

你的需求建议方案
只烧录、看串口日志C3 Mini 原生USB或S3 Mini带USB转串口均可
想做USB键盘/鼠标/游戏外设必须S3,且有原生USB OTG引出
想做USB Mass Storage(U盘)必须S3,且跑TinyUSB工程
想调试自己的USB协议必须S3,配合Wireshark/usbmon抓包
想量产低成本传感器节点C3 Mini,原生USB下载即可

很多 S3 Mini 开发板会同时焊 USB 转串口芯片和原生 USB OTG,用一个开关或跳线切换。这种板子比较灵活,但新手容易遇到“插上去不出串口”“烧录失败”的问题,原因往往是拨码开关没有拨到对应位置。我采购时会优先选原生 USB OTG 直接引出、不带转串芯片的版本,逻辑更简单,少一个中转环节少一个故障点。

4. 可核对的采购单:下单前照着打勾

4.1 采购单核心项:型号、引脚、外设

我把长期采购经验固化成下面这张核对表,每一条都可能是坑。

核对项具体要确认的内容为什么重要
模组型号丝印是 N8、N8R8 还是 N16R8决定Flash和PSRAM
USB方案板载USB转串口?原生USB OTG?决定你能做什么样的USB设备
是否焊接排针处没焊好,贴片还是直插没上下针很麻烦,新手没焊台会卡住
BOOT/EN按键是否齐全没有BOOT键,刷机必须手动短接
板载LED是否有可控制LED到手最先验证固件有没有现场
天线形式PCB天线还是IPEX座放在金属外壳里,IPEX外置天线信号更好
连接器类型Type-C、Mirco还是排针现在优先Type-C,线材通用

引脚兼容性也要看。市面上所谓 Mini 板不是统一标准,有些引脚排列参考官方 DevKitC,有些模仿第三方尺寸,买回来插面包板没事,如果是要叠层扩展板,必须看厂家的引脚定义图。曾经有块板子把电源和 IO 交错排列,插在面包板上差点短路,这类问题只能通过核对引脚图规避。

4.2 渠道避坑与低价的真相

采购渠道我分三大类:官方渠道、淘宝兼容板、二手拆机板。

官方渠道不用多说,原厂板子资料最全,但价格偏高,有些还不好买。淘宝兼容板鱼龙混杂,关键是看描述里是否敢写清楚模组型号。描述含糊、只写“兼容S3”、没有原理图链接的,风险较高。二手拆机板价格极低,但芯片可能是从旧设备上拆下来的,比较考验手气。

低价板子最常见的坑是“虚标 Flash”。标 16MB Flash 实际只有 8MB,或者虽然是 N8 却写成 N8R8。想验证 Flash 容量,可以用 esptool 读 Flash ID,但问题是你已经买了。更靠谱的方法是让卖家拍实物丝印照片,或者挑评论区有人拆封拍的图。收到的板子如果丝印被磨掉,大概率是拆机片。

另一件事是看板子是否提供原理图或引脚映射文档。正规第三方板通常会在商品页或 GitHub 放完整原理图和出厂固件源码,这是质量信号。看不到原理图的板子,我一般不会用于正式项目,只当玩具。

4.3 六种典型配置参考

为了更直接地对照自己的场景,我按常用项目列了六种配置组合:

组合型号适合场景
方案AS3 Mini N8R8LVGL小屏、入门摄像头、TinyUSB学习
方案BS3 Mini N16R8复杂工程、大屏UI、离线资源多、OpenMV
方案CS3 Mini N8纯实验、熟悉芯片,对配置无要求
方案DC3 Mini 4MB低功耗传感器、继电器、轻量MQTT
方案ES3 DevKitC-1 N16R8开发方便,引脚全部引出,适合面包板
方案FC3 Mini 4MB + 板载充电小型电池供电、可穿戴、遥控器

我自己的主力配置是方案B和方案D。S3 Mini N16R8 用来做所有需要屏幕和图形界面的原型,C3 Mini 用来做传感器节点和遥杆、门磁这类小电池设备。如果你只能买一块,我建议直接方案B,一步到位,省得以后重新买。

5. 到手后的验证三板斧:别等焊完才后悔

5.1 USB枚举验证:插上那一刻就分好坏

板子到手先别急着焊排针,先用 USB 线插电脑验证最基础的链路。

Windows 下插上 Type-C 线,打开设备管理器,看是否出现新增的 COM 口或 USB 设备。如果板子带 CH340/CP2102,会出现对应的“USB-SERIAL CH340”或“CP210x”设备;如果是 S3/C3 原生 USB,系统可能识别出“ESP32-S3”或“ESP32-C3”相关 COM 口。注意,原生 USB 的 VID/PID 通常是 303a:1001,而 CH340 的 VID/PID 是 1a86:7523,CP2102 是 10c4:ea60,这个差异可以帮你快速判断板子的 USB 方案。

Linux 下可以用lsusb和dmesg | tail查看内核日志,插拔时会有枚举过程信息。如果系统一直提示设备描述符请求失败,要么线有问题,要么板子 D+/D- 线路异常,要么供电不足。这时候换线、换机、按 BOOT 重新上电都试一遍,再不行就该联系售后了。

5.2 PSRAM容量与固件配置核验

验证完 USB,第二步就是确认 PSRAM 到底能不能用。

最容易的方式是刷一个带串口打印的固件,比如 Arduino 的 Blink 例程里加一行:

Serial.printf("PSRAM: %d bytes\n", ESP.getPsramSize());

如果你用的是 ESP-IDF,可以在启动日志里直接看 PSRAM 检测行,也可以通过heap_caps_get_total_size(MALLOC_CAP_SPIRAM)打印总容量。如果返回值是 0,先别断定板子没 PSRAM,去menuconfig里确认一下是否已经开启:

Component config -> ESP32S3-Specific -> Support for external, SPI-connected RAM

有些出厂固件默认没开 PSRAM 支持,开了之后再重新编译,PSRAM 就能被系统识别。MicroPython 用户则需要确认固件版本是否包含 SPIRAM 支持,社区编译的常规版一般是开启的,可以通过堆大小是否大于 512KB 来间接判断。

第三个层面才是硬件问题。如果固件开了支持、代码也对,但打印出来还是 0,大概率买到的是 N8 无 PSRAM 版本,或者板子焊接时 PSRAM 颗粒虚焊。这时就要把商品页面和实物丝印照片拿给卖家看了。

5.3 烧录与日志验证:确认开发环境认识这块板

USB、PSRAM 都正常后,执行一次完整烧录,同时验证下载和日志通道。

以 S3 为例,用 esptool 烧录合并固件时可以指定,烧录前按住 BOOT 按键再插 USB 进入下载模式,多数板子不需要手动操作,但按住 BOOT 是通用保底手段:

esptool.py --chip esp32s3 -p COM10 -b 460800 write_flash -z 0x0 merged-firmware.bin

烧录完打开串口监视器,波特率 115200,正常能看到启动日志。如果日志只有几行就乱码,检查波特率是否匹配、板子是否进入异常重启循环。很多早期兼容板的晶振或 flash 配置有问题,会出现A fatal error occurred: Failed to connect to ESP32-S3,这时候先换一根真正的数据线,再检查 USB 口是不是被识别成了假串口。

MicroPython 用户更简单,用 Thonny 直接选端口,尝试连接交互终端,能敲出>>>说明整条链路没问题。连接不上时,按住 BOOT 重新插入,再点“停止/重启后台进程”就能进入烧录模式。

6. 常见踩坑与排查速查表

6.1 USB识别不到或串口乱跳

这个问题我遇到频率最高,90% 都不是板子坏了,是线的问题。USB 线分数据线和充电线,充电线只有电源线没有 D+/D-,插上电脑毫无反应。判断方法很简单:多换几根线试,或者看线是否标有 USB 3.0/SS 标识。

另一个常见原因是驱动。Win10/11 系统自带 CDC 驱动,原生 USB 串口基本免驱;CH340 则需要装驱动,CP2102 也偶尔出现驱动重复安装导致两个 COM 口打架。进入设备管理器,看看有没有带感叹号的未知设备,更新驱动或卸载重装一般能解决。

还有板子上的下载模式电路问题。S3 某些兼容板在 USB 转串口和原生 USB 之间切换时,需要拨码开关或跳线,如果默认状态不对,电脑会同时出现两个串口,烧录工具不知道该选哪个。解决办法是先拔掉数据线,把跳线帽设置到指定位置,再重新插入。

6.2 有PSRAM却用不上

最常见的原因是固件配置问题。Arduino-ESP32 较新版本在 Tools 菜单里有“PSRAM”选项,选OPI PSRAM并重新编译,代码里就能用ESP.getPsramSize()检测到。ESP-IDF 则需要开启CONFIG_SPIRAM以及对应的 mode 参数,比如 Octal PSRAM 要选CONFIG_SPIRAM_MODE_OCT=y。

另一种情况是模组本身是 N8,但商品页写“兼容 PSRAM”或“可加 PSRAM”,并不是说板载就有。采购时认准 R 后缀,确认丝印,这一步做充分,后面就不会纠结。

如果是新板到手就检测不到,而且固件配置确定无误,那可能是焊接问题。S3 的 PSRAM 引脚是密脚封装,虚焊会直接导致检测失败。个人维修难度大,优先走售后换货,别自己热风枪瞎吹,容易把板子彻底搞报废。

6.3 引脚冲突和供电不足

S3 和 C3 都有一些 GPIO 在启动时充当 strapping 引脚,不能随便拉高或拉低。S3 上 GPIO0、GPIO3、GPIO45、GPIO46 这些脚在复位时会影响下载模式、Flash 电压等,外接电路要注意。C3 的 GPIO2、GPIO8、GPIO9 也有类似约束,做产品时需要用 10k 电阻保留上拉或浮空状态。

供电方面更常见。USB 口本身能提供 500mA 左右的电流,但如果你外接屏幕、传感器、伺服电机,就非常容易超载。表现为:插上 USB 板子正常,接上屏幕后突然重启,或者刷机到一半失败。解决办法是给系统单独提供 5V/2A 电源,不要全部依赖 USB 口。GPIO 驱动能力也有限,每个 GPIO 灌电流建议控制在 12mA 以内(ESP32 系列实际规格为约 12-20mA),驱动 LED 要串联限流电阻。

6.4 和其他单片机通信时最容易犯错的事

板子上经常出现需要和 Arduino、STM32 或 51 单片机串口通信的情况。最容易错的是电平匹配。ESP32 系列是 3.3V 逻辑,如果你直接拿 5V 的 USB 转 TTL 模块接过来,常年使用可能烧坏 GPIO。选 USB 转 TTL 模块时注意供电和逻辑,至少要支持 3.3V 档位。

接线交叉也常年有人问。A 板 TX 接 B 板 RX,同时 A 板 RX 接 B 板 TX,地线必须共地。如果你只接 TX/RX 不接地,数据大概率乱码。TXD/RXD 交叉不对时,现象是发出去的字符串收到的是乱码,查看电平逻辑分析仪能很快确认是交叉问题还是波特率问题。

USB 抓包调试时,也可以用逻辑分析仪代替协议分析仪,观察 TX/RX 数据的波特率和波形。ESP32 的 UART 波特率范围宽,但如果是和 USB 转串口通信,两边都要配置一致,115200、460800 常见,别只看一边。

兜底经验

我自己的采购流程很简单:先确认项目需要不需要 PSRAM,再确认 USB 要做成什么设备,然后拿这两条去筛板子。模组丝印没写明 R 后缀的一律不买,印字模糊的一律不买,原理图不肯给的兼容板也不碰。收到货先插 USB 让系统枚举出设备,刷个点灯程序验证链路,再跑一次getPsramSize确认内存,最后才开始焊排针做正事。这套流程看着多,实际总耗时也就十分钟,但能省下后面几十个小时的排查时间。选板子时多花两分钟核对型号,比收货后再折腾半天实在得多。

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

RK3576嵌入式开发踩坑记:从U-Boot到设备树的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 6:25:12

工业触控芯片选型:从电容感应原理到抗油污粉尘盐雾的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 6:24:17

AGV机器人主控转向瑞芯微平台:RK3588与RK3576开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 6:22:48

RK3588交叉编译实战:用hello world验证YOLOv5s部署基石

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 6:22:39

嵌入式I2C调试全攻略:硬件I2C与软件I2C的选型、排障与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 6:21:01

ponytail插件与skill开发实战:从安装到自动化流水线

1. 从“ponytail”这个热词说起:它到底是什么第一次看到“ponytail”这个词被当成项目名和插件名来讨论,我其实愣了一下。马尾辫?这跟技术有什么关系?后来在几个开发者社群里连续看到有人问“ponytail skill怎么用”“ponytail插件…

作者头像 李华