STM32入门必修课:芯片定位、选型逻辑与开发调试全解析
很多人第一次搜索“STM32 简介”多半是因为手里那个项目到了一个坎单片机需要同时处理彩色显示屏、按键扫描、传感器数据甚至跑一个轻量级通信协议栈原来的8位机怎么优化都吃力。我当年接手一个带彩屏和外部通信模块的小设备时匆忙从库房翻出一块STM32F103最小系统板边看数据手册边配工程三天把系统骨架跑了起来。那段经历之后我才意识到大部分人对STM32的疑惑其实不是某个引脚怎么接、某个寄存器怎么配而是它到底适合解决什么问题、和普通单片机有什么本质区别。这篇文章就围绕这个核心结合我这几年的实际项目经验把STM32的定位、选型逻辑、底层要点和入门路线一次讲清楚。1. 先回答最直接的问题STM32到底是一块怎样的芯片1.1 从“点灯”这件小事看芯片定位STM32是ARM Cortex-M内核的32位微控制器和高端应用处理器不同它属于“微控制器”而不是“处理器”。这两者最大的区别是微控制器把CPU、内存、Flash存储器和各种外设接口集成在同一颗芯片里上电就能独立跑程序不必外挂内存颗粒和存储芯片。你可以把它理解成一套功能完整的小型计算机只不过披着拇指大小芯片的外壳。用最简单的LED闪烁来感受这种差异。8位单片机上你要做的往往只有设置某个引脚为输出模式再写高低电平。STM32上即使是用库函数也要先使能GPIO所在总线的时钟再配置引脚模式、速度、上下拉然后才能真正把引脚拉高。第一次接触时很多人会觉得“明明点个灯而已为什么这么麻烦”但一旦面对多外设、多中断、通信协议并存的复杂项目你就会发现这套配置机制其实是把复杂的资源管理变成了规则清晰的流程。STM32的价值恰恰在这里它提供的不是最简单的点灯方案而是一个规模化、模块化、可扩展的硬件平台。你可以在它上面跑裸机状态机也可以跑FreeRTOS可以驱动一个温湿度传感器也可以同时处理网络协议栈和高清屏幕数据。1.2 内核、外设和总线芯片内部的“城市地图”想要真正熟悉STM32至少要分清三件事内核负责计算外设负责和外界打交道总线把两者连起来。内核Cortex-M系列核心负责算术运算、逻辑判断、中断响应是处理能力的来源。外设GPIO、UART、SPI、I2C、定时器、ADC、DAC、DMA、USB、CAN、以太网等模块是芯片接外部世界的“窗口”。总线系统相当于城市道路把内核、内存和外设高效连接起来避免数据拥堵。有个生活化的类比很贴切。内核像是城市政府的决策中心外设像是各个职能部门GPIO就是最普通的对外接待窗口UART/SPI/I2C是不同规格的公文传递通道定时器是交通调度中心ADC是信息采集处DMA是专用的快递专线可以在不需要CPU逐个参与的情况下批量搬运数据。NVIC则是应急指挥中心谁有紧急事件需要CPU停下手上工作去处理由它统筹安排。内容安全说明内部内容不涉及任何敏感话题仅围绕技术展开。 这样理解你自然就知道为什么要关注主频、Flash容量、RAM大小和外设资源了——它们正好对应这座“城市”的决策速度、档案馆容量、办公区域面积和部门齐全度。2. 为什么市面MCU那么多大家偏先从STM32入门2.1 生态的力量资料、工具和代码出乎意料地多单论性能STM32并非无敌手。但在入门这件事上它的生态形成了巨大护城河。你随便搜一个问题几乎都能找到对应案例而且不止一种解法。这种“查得到、看得懂、跑得通”的循环对新手太重要了。举个例子你要用STM32驱动一个OLED屏幕网上能找到大量基于SPI或I2C的现成例程包括初始化序列、取模工具、显示函数。如果是冷门芯片很可能问遍论坛都没人理你只能自己翻几百页的英文数据手册。我见过不少从其他品牌MCU转过来的人刚开始抱怨“怎么这么复杂”两个月后就变成“还是STM32顺手”原因就是遇到问题都能快速定位到答案试错成本大幅降低。原厂工具链也功不可没。STM32CubeMX可以免费用图形化界面完成引脚分配、时钟树配置和外设初始化代码生成再把工程导出到MDK-ARM等IDE里继续写逻辑。这对前期能跑通、后期能扩展都有巨大帮助。2.2 8位机玩家迁移时的真实落差如果你是从51单片机过来的第一个星期心里多半会有一句“怎么填的东西比原来多这么多”没开时钟、没配复用功能、没选中断优先级引脚就是不按预期工作。这种门槛不是设计倒退而是因为STM32的资源复杂度完全不同外设太多、引脚可以复用、中断可以有抢占优先级如果把所有默认状态替你“猜”好反而可能产生大量神秘故障。我建议你把这段适应期看成“结构化思维训练”。原来写寄存器是一块一块地垒砖现在用STM32更像是先看图纸、再按图施工。级别上来了工具也专业了别扭几天是正常的。3. 型号命名就是一部“选型计算器”拆开看每一个字符3.1 把一个完整型号拆给新手看很多教程都会让你“直接买STM32F103C8T6最小系统板”但如果你不知道型号里每个字符代表什么后续自己选型时一定会懵。以STM32F103C8T6为例段位含义本例说明STM32微控制器品牌系列ARM Cortex-M内核F1产品线F1代表通用主流系列103子系列基础型带USB、CAN等外设C引脚数量48脚C488Flash容量64KB8对应64KT封装LQFP486温度范围-40℃到85℃如果你拿到的型号是STM32F407ZGT6就很容易拆解F4系列说明是带FPU的Cortex-M4F内核Z表示144脚G表示Flash容量为1024KBT仍是LQFP封装6代表工业级温度范围。换句话说型号本身就是一份高密度参数表选型第一步就是看懂它。3.2 F0/F1/F4/H7这些系列到底怎么选很多人会问既然都是STM32我是不是直接买最高端的H7就行当然不对。选型最重要的一条准则是够用且留有余量而不是性能越高越好。系列内核典型主频适合场景F0Cortex-M048MHz低成本I/O控制、传感器读取、替代8位机F1Cortex-M372MHz通用控制、小屏、CAN、USB、入门首选F4Cortex-M4F168MHz起音频、DSP算法、图像简单处理、通信协议栈H7Cortex-M7400MHz级别高性能计算、机器视觉、复杂人机界面F1是无数入门者接触的第一块STM32你在淘宝买到的开发板十有八九是它。F4带单精度浮点运算单元和DSP指令适合做需要一定算力的信号处理。H7性能强劲但对电源、布局、调试工具的要求也随之上升新手一上来就碰H7往往会在“为什么我用不好”这件事上消耗大量时间。3.3 选型时最容易踩的三个坑第一个坑是只盯主频不看Flash和RAM。有些芯片主频很高但Flash只有64KB你想上图形界面或RTOS空间就会非常紧张。第二个坑是封装没考虑生产。同样是F4BGA封装的引脚密集手工焊接几乎不可能普通原型验证阶段优先选LQFP或者带最小系统板的现成模块。第三个坑是外围硬件不匹配项目需要两路CAN、五路串口、多路ADC选型前必须先对着数据手册把外设资源清单核对一遍否则后面不是加芯片就是换平台重做。4. 存储布局、启动流程和时钟树被好多人跳过的基础4.1 代码烧进去之后芯片到底怎么跑起来的STM32的Flash起始地址通常安排在0x08000000SRAM的起始地址在0x20000000。上电后芯片会根据BOOT0/BOOT1引脚的电平决定从哪启动。最常见的是BOOT0接地从主Flash启动用户程序就直接跑起来了。代码启动远比看着主函数“顺滑进入”要复杂。芯片上电先读向量表里的初始堆栈指针和复位向量跳到复位服务程序然后做时钟初始化、变量初始化最后才调用main函数。你如果对这套流程没有概念当遇到“程序莫名其妙不跑”“调试器连上去看不到变量初值”之类问题时就会毫无方向。4.2 时钟树为什么是新手的第一道坎所有外设都在某种时钟频率下工作而STM32内部往往不止一个时钟源。初学者最容易犯的一个错是点亮LED之前忘了开启对应GPIO端口的时钟结果代码看起来完全没毛病引脚就是没反应。这不是玄学而是外设默认处于未使能状态要先用RCC相关函数把它的时钟打开。理解时钟树的另一个关键点是系统时钟从哪里来。典型路径是外部高速晶振或内部RC振荡器作为源头经过PLL倍频后产生系统主频再经过AHB和APB总线分频器分配给各个外设。如果你使用STM32CubeMX它在图形界面会帮你自动配置如果你全手动写寄存器就务必查清楚外设挂在哪个总线上以及该总线的最高频率限制。APB1和APB2的最大频率在F1和F4上是不同的查错一处定时器或者串口波特率就会偏得离谱。4.3 通过现象理解NVIC中断和SysTick内核自带中断控制器NVIC负责管理所有外设中断的开关、挂起和优先级。每个中断有抢占优先级和子优先级抢占优先级高的可以打断正在执行的普通中断。配置优先级分组是项目里“必须提前想好”的事因为多个中断同时出现时分组设置直接决定谁先响应。SysTick是内核里一个简单的24位递减定时器HAL库的HAL_Delay就依赖它实现ms级延时。了解它之后你会发现很多RTOS的节拍也是基于SysTick建立起来的。这些基础不搞清楚你很难理解为什么“delay不准”“中断卡死”这类问题。虽然对于纯应用开发可以不深究但我仍然建议你亲自用寄存器把SysTick初始化写一遍哪怕之后就再也不用了。5. 开发方式三选一寄存器、标准外设库和HAL库的取舍5.1 三种开发方式真实对比很多新手卡在学习路线上是从寄存器学起还是直接从HAL库开始先看看三者的差别。开发方式上手难度效率可读性维护状态寄存器直接操作高灵活但繁琐晦涩永远可用标准外设库中中等较好已逐步停止主流更新HAL库低高清晰易读当前主流寄存器操作能让你了解芯片最底层细节但用它完成同样的功能代码量往往是HAL库的数倍。标准外设库在F1时代非常流行现在新项目已普遍转向HAL库和LL库。我的观点是新手上路直接学HAL库等能独立做项目后再回头用寄存器补底层短板。这样学习曲线最平滑也最容易获得正向反馈。5.2 从零搭一套顺手的环境入门阶段最标准的环境组合是电脑上安装MDK-ARM也就是大家习惯叫的Keil再安装STM32CubeMX和芯片支持包调试器选ST-LINK或带仿真器的开发板。安装完成后流程一般是在CubeMX里选择具体型号配置引脚功能。设置时钟树确定外部晶振频率和系统主频。选择外设功能比如UART、SPI、ADC等。设置工程名称、堆栈大小、IDE类型生成初始化代码。在MDK里打开工程编写应用逻辑编译后通过ST-LINK下载。这套流程比纯手写初始化代码省力得多而且CubeMX生成的初始化代码相当规范等于有一名经验丰富的助手替你写好了前半部分。5.3 工程配置里那些“看不见”的坑CubeMX虽然方便但工程选项千万不能乱选。首先调试接口要选对。如果只用SWD调试务必选择Serial Wire不要选JTAG选错会导致调试器无法连接。其次外部晶振频率必须和硬件实际焊接的晶振一致。明明板上焊了8M晶振你在CubeMX里写成25M生成的系统时钟就会严重超频或直接不工作。还有一个非常容易被忽略的选项HAL库的堆栈大小。默认的堆栈值在简单项目里够用可一旦你引入文件系统、网络协议栈或复杂的GUI库栈溢出就会以HardFault或莫名重启的方式报复你。提前在工程配置里把栈调到足够大能省掉后面大量排查时间。6. 调试器、电源和烧录失败新手最容易翻车的三个现场6.1 SWD接线看着对就是连不上SWD调试最少需要四根线SWDIO、SWCLK、GND、3V3。问题常常出在细节上线序接反、杜邦线接触不良、板子上电顺序不对。更隐蔽的一种情况是某根线只接触点焊看似连上了实际通讯极不稳定。我在某次调试时遇到过“下载器在IDE里识别正常但一点下载就报找不到芯片”的情况。排查后发现我把SWDIO接到了3V3上SWDIO却是开漏结构结果电平全被拉高。换对之后一次成功。这种问题没有捷径只能按信号顺序逐根核对。另外如果芯片的SWD引脚在用户程序里被复用成了普通GPIO程序跑起来后调试接口就失效了。此时可以在MDK里选择Connect under Reset让芯片在上电复位瞬间建立调试连接再抢回引脚控制权。6.2 电源纹波带来的“玄学故障”STM32标称3.3V供电但很多入门板为了便宜直接用USB的5V经过一片LDO转到3.3V。如果LDO后面没有足够容量的去耦电容或者板子布局不佳ADC采样值就会像喝了酒一样乱跳程序偶尔还会跑飞或者进HardFault。表面看像软件Bug实际上是电源纹波惹的祸。我后来处理这种问题的标准做法是第一在芯片电源引脚附近贴至少一个100nF陶瓷电容和一个10µF左右的钽电容或电解电容第二凡是电机、舵机、继电器这类感性负载坚决不要和MCU共用同一路3.3V哪怕只是短暂共地也会在动作瞬间把地电位拉偏第三用杜邦线做原型验证时线越短越好电源和地线绝对不能省。6.3 “烧录一次第二次就烧不进去了”的经典场景这几乎是所有入门者都会遇到的“鬼故事”。正常流程是第一次下载成功程序运行正常你修改代码后再次下载IDE报错无法连接。原因通常是程序启动后立刻把SWD调试引脚重新配置成GPIO模式或者开启了低功耗模式把芯片“睡死”了又或者看门狗开启后来不及喂狗。解决办法有很多种从易到难的顺序是先试着按住复位键的同时点击下载让芯片在复位期间完成连接接着在调试设置里把连接模式改成Connect under Reset如果都不行就把BOOT0拉高再上电让芯片进入系统存储器Bootloader模式此时Flash不会再执行你的用户程序下载器就可以重新连接擦除后再把BOOT0拉回低电平。这个思路对所有“下载器连不上芯片”的场景都通用建议收藏。7. 给入门者的路线图从第一个LED到看得懂数据手册7.1 别在起点内耗直接让LED亮起来我不建议把“学会STM32”理解成“把某个知识点彻底搞懂再进入下一个”。更合理的方式是先用现成工具链把LED点亮建立整体工程概念再抽空拆解细节。CubeMX生成代码后你要做的其实就是找到main函数里的while(1)加一个翻转引脚的调用下载运行。一个晚上能完成的事就不要拖到一周后再动手。点亮LED之后下一步是串口。串口输出的意义不亚于给程序装了一双眼睛。建议你在每一段重要代码路径里加上调试打印尤其是中断处理和状态机切换处。7.2 一段时间线供你参考结合我自己的经历和带人的经验大概的时间安排可以是第1周CubeMX生成工程点亮LED按键输入串口收发。第2-3周定时器PWM、外部中断、ADC采集完成一个“按键切换传感器显示”的小任务。第1个月理解中断优先级和DMA搬运尝试用DMA接收串口不定长数据。第2-3个月跑FreeRTOS创建一个多任务系统或者做一个带OLED屏、按键、传感器和通信的真实小项目。第3个月之后开始养成阅读参考手册的习惯重点看外设框图和寄存器列表。7.3 数据手册的正确开启方式很多人拿到几百页的数据手册就望而却步其实根本不用从头读到尾。看一款外设先看框图弄清它挂在哪条总线上、有哪些主要输入输出再看功能描述搞清楚它工作模式的区别最后才是寄存器细节。寄存器部分完全可以用到哪个查哪个。那些能一个人搞定复杂项目的工程师并不是把手册背下来了而是掌握了“按需定位信息”的方法。我自己的习惯是每做一个新外设都先花20分钟把该外设的框图抄到纸上再标出我需要的数据流方向和关键控制位。这个笨办法帮我避开了大量低级错误比反复在网上搜“为什么我的某某功能不工作”高效得多。如果你现在正站在路口犹豫要不要入坑我的态度很明确先不管寄存器先不管RTOS用CubeMX把灯点亮再让串口说出第一个字节。剩下的路会在一次一次成功的反馈里逐渐清晰。

相关新闻

Muse Gadgets:开源AI外设开发全家桶全解析

Muse Gadgets:开源AI外设开发全家桶全解析

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

2026/10/13 5:31:53 阅读更多 →
仿微信IM开发实战:Flutter架构、消息时序与长连接避坑指南

仿微信IM开发实战:Flutter架构、消息时序与长连接避坑指南

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

2026/10/13 5:31:58 阅读更多 →
HyperWorks学生手册实操拆解:跑通第一个有限元分析

HyperWorks学生手册实操拆解:跑通第一个有限元分析

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

2026/10/13 5:32:01 阅读更多 →

最新新闻

lingbot-map:室内移动机器人激光SLAM建图与导航实战

lingbot-map:室内移动机器人激光SLAM建图与导航实战

看到“lingbot-map”这个项目名,我第一反应就是机器人地图相关,而且大概率是围绕建图、定位、导航这三件套来做文章。我实际接触过不少类似的室内移动机器人项目,名字里带“bot”的通常都是机器人本体的代号,“map”则明确指向地图…

2026/10/13 7:58:24 阅读更多 →
无模型控制仿真:MFAPC与MFAILC实现、对比与工程避坑指南

无模型控制仿真:MFAPC与MFAILC实现、对比与工程避坑指南

1. 从模型依赖到数据驱动:MFAPC与MFAILC想要解决的问题做控制的都知道一个尴尬的事实:课本上那些漂亮的控制器设计方法,到了现场十有八九要先过“建模”这一关。经典PID要整定参数,极点配置要拿到状态空间模型,模型预测…

2026/10/13 7:58:24 阅读更多 →
深入解析 Serde 序列化框架:核心设计与 farm 仓库的 crates.io 补丁兼容方案

深入解析 Serde 序列化框架:核心设计与 farm 仓库的 crates.io 补丁兼容方案

前端构建构建工具开发工具 【免费下载链接】farm Extremely fast Vite-compatible web build tool written in Rust 项目地址: https://gitcode.com/gh_mirrors/fa/farm 点击查看 免费下载 本篇文章以本仓库 patches/serde/crates-io.md(Serde 发布到 c…

2026/10/13 7:58:24 阅读更多 →
Lambda架构性能测试实战:批处理、实时链路与服务层的压测方法

Lambda架构性能测试实战:批处理、实时链路与服务层的压测方法

1. 为什么Lambda架构需要一套独立的性能测试方法做大数据系统的人,对Lambda架构应该都不陌生——批处理层负责全量数据的离线计算,速度层负责实时数据的增量计算,服务层再把两层结果合并起来对外提供统一查询。这套架构把“准确”和“低延迟”…

2026/10/13 7:58:24 阅读更多 →
手把手教你实现自己的“Manus”:基于容器隔离的多用户Agent应用搭建指南

手把手教你实现自己的“Manus”:基于容器隔离的多用户Agent应用搭建指南

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

2026/10/13 7:58:24 阅读更多 →
Litellm:大模型调用的统一抽象层与生产级路由网关

Litellm:大模型调用的统一抽象层与生产级路由网关

1. 为什么“litellm”突然在开发者圈里刷屏?它到底不是个新模型,而是一把万能钥匙最近两周,好几个不同技术栈的同行在群里发截图:有人在用 Python 调通了本地运行的 Qwen3,有人把公司私有部署的 DeepSeek-R1 接进了旧版…

2026/10/13 7:57:23 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →