news 2026/9/27 1:45:48

STM32CubeMX 实战指南:从安装到 LwIP 以太网配置完整链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32CubeMX 实战指南:从安装到 LwIP 以太网配置完整链路

很多第一次接触 STM32CubeMX 的朋友,拿到的第一份资料往往是零散的博客片段,结果卡在装机、下载固件、生成工程这三道坎上。今天不按官方手册目录来讲,就按照我自己这些年装机、配工程、排错的实际顺序走一遍,把下载安装、固件包管理、首个工程创建、常见外设配置,以及 YT8512C 加 LwIP 这种进阶玩法全部串起来。STM32CubeMX 是意法半导体官方提供的一站式图形化配置工具,最直接的价值就是不用手动写一大堆 GPIO、时钟、外设的初始化代码,只要在图形界面里把引脚、时钟树、外设参数和通信中间件设定好,一键生成工程代码。它适合刚入门的学生、从其他 MCU 转过来的工程师,也适合老手在项目前期快速搭原型——尤其是换型号时,几分钟生成一套可用工程,比自己对着寄存器手册啃高效太多。

1. 为什么现在学STM32几乎绕不开STM32CubeMX

1.1 它到底解决了什么问题

传统写 STM32 程序的方式,是打开参考手册,一个个寄存器去查,GPIO 怎么配、时钟怎么开、串口波特率怎么算,全部手写。这套流程在老工程师手里没问题,但对新手和需要快速出方案的人来说效率太低,而且换一颗芯片型号,初始化代码几乎推倒重来。STM32CubeMX 配合 HAL 库,把“干脏活”的部分自动化了。你在图形界面里点一下引脚,选一个功能,软件直接生成对应的初始化函数,底层寄存器具体怎么写的,大多数时候不用操心。

当然这并不代表不需要学寄存器。真正调硬件问题时,还是要回到寄存器层面去看 HAL 库内部做了什么。我的体会是:先靠CubeMX 把工程跑起来,再在出现问题的时候去读底层代码,学习效率反而高很多。很多在校生一上来就死磕寄存器,磕了一个月还在点灯,其实就是没找对切入方式。

1.2 不只是生成代码,还有中间件与系统级视角

把 STM32CubeMX 单纯理解成“自动生成初始化代码的工具”,格局小了。它还能管理以太网、USB、SDMMC、DMA,以及 FreeRTOS、LwIP、FatFS 这些中间件。换句话说,它是一个前端配置平台:把你需要的硬件特性和软件栈组合在一起,生成的是带好依赖关系的工程,而不是零散的寄存器赋值。

为什么说现在学 STM32 几乎绕不开它?因为 ST 官方所有开发板的例程、HAL 库的配置模板、生态里的 middleware 集成方式,全都挂在 CubeMX 体系下。你用不用它,官方例程都是这个路子,如果不熟悉它,拿到一份原厂工程反而不容易看懂。所以我的建议是:哪怕你以后做产品不用 HAL 库,也值得花一天时间把 CubeMX 的操作流程过一遍,它能帮你快速理解一颗新芯片的整体资源分布。

2. 下载与安装:版本选择、Java依赖和最容易被忽略的安装细节

2.1 从官网获取安装包的正确姿势

到 ST 官网搜索 STM32CubeMX,进入产品页面后选择对应自己操作系统的安装包下载。这一步通常需要注册一个 ST 账号,注册免费,填邮箱收验证邮件就行。网页上会看到两个入口:独立安装的 STM32CubeMX,以及整合进 STM32CubeIDE 里的插件版本。我的建议是,如果平时主要用 Keil 或者 IAR 写代码,直接下载独立安装包;如果打算用 ST 自家的 STM32CubeIDE 开发,那其实不用单独装 CubeMX,IDE 里已经带了这个功能,省得维护两套工具。

版本选择上,新手直接装官网当前最新稳定版就够用了,不要追 beta 版本,也不建议下载很旧的版本。有些老教程让你用 5.x,那是因为当年只有那个版本,但旧版对现在的新芯片支持不全,比如新型号选不到、新封装识别不了,最后还得回来升一次级。所以认准官网最新稳定版,能少踩很多坑。

2.2 Java 环境:最容易闪退的元凶

STM32CubeMX 是基于 Java 的图形程序,这一点很多人不知道。系统里没有 Java 或者版本过旧,最常见的表现就是双击图标没反应,或者打开后弹一个“缺少 Java 运行时环境”之类的提示框。安装前先确认 Java 环境,命令行输入 java -version,能看到版本号再继续。新版 CubeMX 对 Java 版本有下限要求,一般 Java 8 及以上能跑,部分新版本要求 11 甚至 17,具体以安装前软件给你的检测提示为准。

我这里还遇到过一种情况:电脑里装了多个 Java 版本,环境变量 PATH 和 JAVA_HOME 指向混乱,CubeMX 启动时直接提示找不到主类。处理办法是把 JAVA_HOME 明确设置成 CubeMX 需要的那个 JDK/JRE 目录,然后重开命令行窗口再启动软件。装完建议重启一次电脑,避免环境变量没刷新导致一系列奇怪问题。

2.3 安装细节:路径、权限与杀软

安装时第一个要注意的是路径里别放中文。C 盘默认路径可以用,但不要自己改成“D:\软件\CubeMX”这种带中文的目录,否则之后加载固件包、生成工程经常出现编码问题。第二是权限。安装到 Program Files 目录下时涉及系统权限,固件包仓库默认在 C:\Users\你的用户名\STM32Cube\Repository,如果 C 盘空间紧张,可以在安装后修改仓库目录位置,但最好在首次启动前就规划好,半途搬仓库很容易引发路径混乱。

第三是杀毒软件。Windows Defender 或者第三方杀软会把 CubeMX 的一些临时写文件当成可疑行为隔离,安装完打不开,先去看看隔离记录里有没有 STM32 相关文件。实测下来,Windows 自带的 Defender 误报概率不高,但某些国产杀软对 Java 程序会特别敏感,安装时加白名单或者暂时退出,装完再开回来,能少折腾半天。

3. 固件包管理:下载慢、提示无法安装固件库的完整排查思路

3.1 为什么每次都要和“固件包”打交道

STM32CubeMX 安装包本身只是骨架,芯片支持靠的是固件包,这两个概念经常被新手混淆。每个芯片系列对应一个独立固件包,比如 STM32F1 系列是 STM32Cube_FW_F1,STM32F4 系列是 STM32Cube_FW_F4。新建工程时,如果本地没有对应系列的固件包,软件会尝试联网下载,这也是新手最容易卡住的一步。固件包体积并不小,类似 F4 这种全系列包动辄几百 MB,网络状况不好时下到一半就断的情况很常见。

很多人以为装完 CubeMX 就万事大吉,打开软件发现所有型号都选不了,就慌了。其实不是软件坏了,而是固件包还没到位。理解了这个机制,后面所有下载错误就都好解释了。

3.2 正规流程:在 Help 菜单里手动管理

在 CubeMX 主界面点 Help → Manage embedded software packages,能看到所有系列固件包的在线列表,勾选你需要的那几项,点 Install 下载。这里我强烈建议“按需安装”:只勾选当前正在用的芯片系列,不要全选。全选看似一步到位,实际会让首次启动非常慢,而且任何一个包下载失败都会弹错误提示,反而影响后续操作。

版本号方面,尽量勾选最新的稳定版本,除非你的工程对特定版本有依赖。打开别人发的 .ioc 工程时,工程文件里记录了它用的固件包版本号,如果你本地版本不一致,CubeMX 会尝试下载旧版本,这也是“打开工程时显示下载错误”最常见的来源。

3.3 下载慢怎么处理

国内网络访问国外服务器速度不稳定是常态,这个我可以明确告诉你,不是你电脑出问题了。我的做法是错峰下载,比如早晨或者深夜,成功率明显更高。另一个更省心的办法是离线固件包:在官网固件包页面下载对应系列 ZIP 包,然后在 Help → Manage embedded software packages 里点 From Local,选择本地 ZIP 文件导入。

这里有个操作细节:手动导入时直接选择下载好的 ZIP 压缩包,不要提前解压,CubeMX 会自己处理目录结构。如果 ZIP 包本身下载不完整,导入时会报错,所以下载完先看一眼文件大小是不是和官网标注一致,再执行导入操作。

提示:如果导入时报“cube firmware cannot be installed into repository”之类的错误,优先检查 ZIP 文件是否完整。很多情况是浏览器下到一半就停了,缓存里的文件比官网标注小很多,看一眼文件修改时间和体积就能判断出来。

3.4 无法安装固件库的完整排查链路

遇到固件包无法安装时,我的排查顺序是这样:先看磁盘剩余空间,C 盘如果少于 2GB,基本必失败;再看仓库目录权限,手动去 C:\Users\你的用户名\STM32Cube\Repository 下创建文件夹、写入测试文件,看系统允不允许;最后查杀毒软件的隔离记录。如果这几项都正常但依然失败,手动把固件包 ZIP 解压到仓库目录,注意目录结构要保持 Repository\STM32Cube_FW_F4_V1.27.x 这种形式,固件包是独立的顶层文件夹,解压层级错了会识别不出来。

解压后重启 CubeMX,它一般就能识别到本地固件包,这个问题到此解决。这一路排查下来,绝大多数情况都能命中,不敢说 100%,但比反复重装 CubeMX 强多了。

4. 第一个工程实操:芯片选型、时钟树与生成代码全流程

4.1 新建工程时从 MCU 还是开发板开始

打开 CubeMX 后点 New Project,会弹出芯片和开发板两种入口。自己做板子就选 MCU,直接输入芯片型号,比如 STM32F103C8T6,下方列表会过滤出对应芯片;如果想用官方开发板或者兼容板做验证,选 Board Selector 找到板子,软件会把板载外设引脚预设好,省去手动接线时间。

我建议新手尽量从 MCU 入口开始。自己亲手点一遍引脚,才能知道哪个引脚有第二功能、哪个引脚是 5V 容忍的。用开发板入口虽然省事,但是自动化程度太高,容易让人失去对底层引脚分配的感觉。等理解了基本逻辑再用开发板入口,会顺手很多。

4.2 引脚视图和 Debug 设置的第一次踩坑

进入主界面后会看到芯片引脚图,左边是外设列表,右边是芯片图形。点击 PA5 引脚,选择 GPIO_Output,就能定义一个 LED 控制口。这时记得进 SYS 配置,把 Debug 从 Disable 改成 Serial Wire。这个步骤非常不起眼,但它直接影响后续仿真和第二次下载程序。如果不设置,默认会占用 JTAG 相关引脚,有些板子在第一次下载后,后续连接芯片会失败,就是这个原因。

我见过不止一个新手因为这个没设置,疯狂重装驱动、换下载器,最后发现只是 CubeMX 里少点了一个下拉。所以生成代码前,养成习惯:SYS 的 Debug 直接选 Serial Wire,不管你现在用不用仿真器,都先选上,成本极低,收益很高。

4.3 时钟树配置:从 8MHz 晶振到 72MHz 主频

切换到 Clock Configuration 页,这是很多人第一眼就懵的地方。其实逻辑很简单:外部晶振进来,经过 PLL 锁相环倍频/分频,最后得到系统时钟。以最常见的 F103 为例,HSE 填 8MHz,然后在 HCLK 输入框填 72,软件会自动计算 PLL 的倍频和分频系数。如果填的值超出芯片上限,输入框会跳红,这时候手动减少倍频即可。

时钟树是所有外设工作的基础。串口波特率、SPI 速率、ADC 采样频率,全部从这条树上分出来。配错时钟的后果往往不是立刻崩掉,而是某个外设的时序完全不对,排查起来特别痛苦。所以配时钟树时,哪怕暂时不需要那么高速度,也要按芯片手册标称值配,保证各条总线频率在合理范围内。

4.4 Project Manager 里 Toolchain/IDE 选择与没有 MDK-ARM 选项的问题

生成代码前,点 Project Manager 页。Project Name 填工程名,Location 路径同样不能有中文,Toolchain/IDE 下拉框里选 MDK-ARM(对应 Keil)或者 STM32CubeIDE。这里要说一个真实存在的情况:有人反馈下拉框里没有 MDK-ARM 选项。我实际遇到的原因主要有这几种:

  • CubeMX 版本太老,选项名称或者分类位置和现在不同,升级到最新版再看。
  • 安装不完整,部分组件缺失,修复安装一次就能恢复。
  • 用的是 Linux 或 macOS 版本,Keil MDK 本身只支持 Windows,所以跨平台版本里没有 MDK-ARM 是正常的。这种情况要么改用 STM32CubeIDE 生成工程,要么拿到 Windows 环境下生成。

选好 MDK-ARM 后,生成的工程是 .uvprojx 格式,直接用 Keil 打开。如果你打开后发现单片机型号不对,可以在 Keil 的 Device 选择里重新选一次,但正常情况下 CubeMX 生成时已经写好了。

4.5 生成代码后还需要做的几件事

点 GENERATE CODE 后,CubeMX 会生成一个完整工程目录。用 Keil 打开后第一件事不是直接编译,而是看左上角魔术棒里的 Debug 设置,选对调试器型号并配置 SWD 接口。然后是下载设置,很多人用了 ST-Link 但没选对驱动,Keil 提示找不到设备,真不是程序问题。

接下来才编译下载。如果编译报错,排查优先级也很明确:检查 Keil 版本是不是 MDK5 以下,检查工程路径是不是有中文,检查是否缺少对应的 Device Family Pack。这三样都正常,工程基本能一次通过。之后就可以点灯了,点灯成功,整个工具链就算跑通了。

5. 热门外设配置实战:ADC 采样与 SPI 通信

5.1 ADC 参数里最容易忽视的采样时间

热词里的“ad配置”其实就是 ADC,模拟数字转换器。配置时先打开 ADC1,勾选需要的通道,在 Parameter Settings 里把分辨率设为 12 位,多数 STM32 的最高精度就是 12 位。然后是采样时间,这是很多人学着学着会忽略的参数。周期越短,转换越快,但噪声越大;周期越长,数值越稳定,但采样率下降。选哪个,要看测量的信号:电池电压这种缓变信号,用长采样时间没问题;音频采样就要折中。

如果需要连续采集多路模拟量,建议用 DMA。CubeMX 里把 ADC 的 Continuous Conversion Mode 打开,然后在 DMA Settings 里添加 ADC 通道,循环模式打开。代码侧先调用 HAL_ADC_Start_DMA(),再在 HAL_ADC_ConvCpltCallback 回调里取数据,CPU 不用死等转换完成。这是项目里更合理的写法,比在 while 循环里一次次启动转换强很多。

5.2 SPI 配置中要把主从极性搞清楚

SPI 的坑主要在模式选择。你是主机还是从机,时钟极性和时钟相位是否匹配从设备,这两点决定了通信能不能正常。在 CubeMX 的 SPI1 里,Mode 选 Full-Duplex Master,硬件片选我一般不用,因为软件控制普通 GPIO 更灵活,尤其是一个主机带多个从设备的时候。波特率预分频根据外设时钟算,SPI1 通常挂 APB2,比如 72MHz 时钟下还要跑 4Mbps,就除 18,但 CubeMX 只提供固定分频档位,选最接近且不超过目标值的那档就行。

CPOL 和 CPHA 的选择,以从设备数据手册为准。常见的存储类芯片习惯 Mode 0 或 Mode 3,配反的话数据全是乱码。生成代码后,收发用 HAL_SPI_Transmit、HAL_SPI_Receive 或者组合的 HAL_SPI_TransmitReceive。调试时用逻辑分析仪先看时钟和片选信号,比直接看寄存器状态靠谱得多。

5.3 外设配置的通用提醒:引脚冲突不可只在界面里点

CubeMX 左侧外设列表配置好后,右侧引脚也会变颜色,同一个引脚只能分配一个功能,抢占了会弹冲突提示。这时不要靠强制分配硬来,应该从方案上调整:查数据手册确认复用功能,或者换引脚。还有上下拉电阻和 GPIO 速度等级,看起来是小参数,但对 LCD、SDIO 这类高速信号影响很大。GPIO Speed 要按信号频率选 High,不然波形边沿被拉垮,接口就工作不稳定。

这些参数在生成代码后也能手动改,但一定要养成“改配置回 CubeMX、重新生成代码”的习惯,不然下次重新生成工程时,手动改的部分全被覆盖了。

6. 进阶实战:YT8512C 以太网 PHY 搭配 LwIP 的配置要点

6.1 什么场景会碰到 YT8512C 加 LwIP

有网络需求的板子越来越多,YT8512C 是国产 10/100M 以太网 PHY,在很多低成本开发板和产品上都能看到。搭配方案一般是 STM32 的 ETH 外设接 RMII 接口,软件栈用 LwIP。CubeMX 在这种组合里的价值非常大:ETH 初始化、RMII 引脚映射、时钟配置、LwIP 的 PBUF 和网卡驱动框架都是自动生成的,你只需要把 PHY 相关参数和硬件对应起来。

这个组合最常出现在物联网网关、串口服务器和工业控制板里。如果只是做产品验证,手里有一块板子想快速跑通 TCP/IP,CubeMX 基本是唯一合适的选择,手写这部分的初始化,工作量相当可观。

6.2 CubeMX 里的 ETH 与 LwIP 配置顺序

在 Connectivity 里打开 ETH,接口选 RMII。如果 PHY 列表里没有 YT8512C 这个型号,选一个通用的 RMII PHY 类型,然后在参数里手动填 PHY 地址。这一步非常容易出错,YT8512C 的地址由硬件绑定,常见的是 0x00 或 0x01,具体必须看原理图,不能凭感觉。PHY 地址填错,网卡驱动读不到 PHY 的寄存器,整个网络链路就是哑的。

接着在 Middleware 里打开 LwIP,选择 DHCP 或静态 IP。如果只是内网调试,静态 IP 更省事,给板子配 192.168.1.100 之类不容易冲突的地址。配置完检查一下 ETH 相关引脚是否全部映射成功,尤其是 RX_CLK 和 TX_CLK 这些时钟引脚。生成代码后,网卡驱动底层对 PHY 的读写函数有可能需要按 YT8512C 的寄存器定义稍微调整,重点看 lwip_ethernet.c 里跟 PHY 相关的部分。

6.3 RMII 参考时钟:50MHz 是网络能否稳定的分水岭

RMII 接口要求提供 50MHz 参考时钟。这个时钟要么由外部晶振模块给出,要么由 MCU 的 MCO 引脚输出。CubeMX 里如果选择 MCO 输出,需要在 RCC 配置中打开 MCO1,并设置为 50MHz。很多人 Ping 不通,先查的就是这里:用示波器量一下有没有稳定 50MHz,没有的话软件配置再正确也白搭。

方案稳定性成本备注
外部 50M 有源晶振高,受 PCB 走线影响小略高,多一个器件产品量产比较推荐
MCU MCO 输出中,受引脚驱动能力和走线影响大省一个晶振适合原型验证和引脚紧张的场合

两条路没有绝对好坏,但调试阶段如果网络不稳定,先试试外部晶振方案来排除时钟嫌疑。MCO 输出的信号质量在长走线下确实容易出问题,这也是很多人最后选择加有源晶振的原因。

6.4 常见网络问题排查顺序

配好 YT8512C 加 LwIP 后,如果网络不通,我的固定排查顺序是:先看 PHY 芯片的 link 指示灯,能协商出 100M 才说明硬件层正常;然后确认 PHY 地址读对了;再确认 RMII 时钟存在;最后才查 LwIP 里的 IP 配置和网卡驱动。按这个顺序找,基本能定位九成的问题。

千万不要一开始就在 LwIP 的线程配置里翻找。软件参数再对,底层时钟和 PHY 没起来,一样不通。只要把底层链路捋顺,TCP/IP 这层反而很少出问题。

7. 汉化与常见问题排查:打不开、下载错误、MDK-ARM 缺失

7.1 官方至今没有中文语言包,怎么办

关于汉化,要告诉新手的现实是:ST 官方目前没有提供 STM32CubeMX 的中文语言包,界面参数是英文的,这不是你安装出错了。网上有第三方汉化补丁,但我不建议给开发工具加来路不明的外部补丁,既可能失去正常升级能力,也有安全风险。实际上 CubeMX 的界面词量非常有限,配合翻译软件查一遍常用术语,两三天就能熟悉。

可以先记几个固定入口:Pinout & Configuration 是引脚和外设配置页,Clock Configuration 是时钟树页,Project Manager 是生成设置页,GENERATE CODE 是生成代码按钮。把界面框架记熟之后,剩下所有参数都是字面意思,配合手机翻译软件就能解决。

7.2 双击打不开或闪退的排查步骤

打不开的排查顺序和 Java 高度相关。先开命令行,进安装目录执行 stm32cubemx.exe,让报错信息直接打在屏幕上。如果提示缺少 Java,检查 Java 是否安装以及版本是否符合要求。如果 Java 正常但界面不出现,打开任务管理器看有没有残留进程,有就把相关 Java/CubeMX 进程全部结束再重开。

还不行的话,清理当前用户的 .stm32cubemx 配置目录再启动。清理前先备份,目录里保存了固件包下载记录和界面配置。最后再检查杀毒软件隔离和路径中文问题,这两类问题在很多工具软件上都通用。

7.3 打开 .ioc 工程时提示下载错误

双击别人的 .ioc 文件时,CubeMX 会根据这个工程所需的固件版本查找本地固件包,找不到就尝试联网下载,网络不好就会弹下载错误。解决办法是先关掉弹窗,回主界面去 Help 里按系列下载对应固件,确认版本号一致后重新打开 .ioc。如果试了几次联网还是失败,就走前面说的离线包导入路线,把对应固件装好,再打开工程就正常了。

这个问题的本质是固件包依赖,不是工程文件损坏。搞清楚这一点,就不会再因为看到下载错误而以为自己把工程弄坏了。

在使用习惯上,我现在会把 CubeMX 当成一个配置快照工具:每次改动外设配置,都先更新 .ioc 文件,再重新生成代码,不手动去改 HAL 初始化部分。这样换芯片或者换板卡时,能快速把原工程迁移过来。省下来的时间足够多调几个外设,这个习惯值得从第一个工程就开始培养。

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

Smith Chart与ADS阻抗匹配实战:从单频匹配到宽带优化

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

作者头像 李华
网站建设 2026/9/27 1:45:07

PlatformIO创建工程失败?彻底清理残留重装环境全攻略

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

作者头像 李华
网站建设 2026/9/27 1:45:02

STM32 SBUS协议解析:DMA+IDLE中断+环形缓冲区实战

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

作者头像 李华
网站建设 2026/9/27 1:44:52

PPT多视频同步播放全攻略:动画窗格与VBA方案详解

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

作者头像 李华
网站建设 2026/9/27 1:44:44

CRC校验彻底讲透:原理、参数与Modbus/PLC实战指南

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

作者头像 李华
网站建设 2026/9/27 1:42:27

STM32F103C8T6驱动JY901S九轴传感器实战指南

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

作者头像 李华