首页/新闻资讯/正文详情

STM32定时器进阶:PWM输出、输入捕获与编码器模式详解

发布时间:2026/11/3 14:06:59 来源:云帆数科 栏目:资讯中心
STM32定时器进阶:PWM输出、输入捕获与编码器模式详解
1. 为什么定时器是STM32里最值得深挖的外设玩STM32的朋友大概都有这么个体会GPIO点灯、串口打印这些外设翻翻手册半小时就能跑通但一到定时器这块寄存器多、模式杂、手册厚很多人就卡住了。我见过不少项目PWM调个占空比还行一旦要测外部信号频率或者接个旋钮做调节就开始到处抄代码抄完也不知道为什么这么配。其实定时器这东西你把它当成一个会数数的瑞士军刀就好理解了——本质上它就是一个按固定节奏递增或递减的计数器围绕这个计数器衍生出了输出比较、输入捕获、编码器接口等一堆玩法。这篇内容我想把STM32定时器的三个进阶用法掰开揉碎讲清楚PWM输出、输入捕获和编码器模式。这三个东西覆盖了绝大多数实际项目里的定时器需求从电机调速、LED调光到测转速、读旋钮、做正交解码基本都绕不开它们。适合已经能跑通基础定时中断、想进一步把定时器用透的嵌入式开发者也适合正在做电机控制、传感器采集类项目、需要快速落地的朋友。我会按为什么这么设计—怎么配—配的时候注意什么的顺序来讲尽量把每个参数背后的逻辑说透而不是甩一堆代码让你自己悟。先说个前提不同型号的STM32定时器资源差异挺大高级定时器比如TIM1、TIM8功能最全通用定时器TIM2到TIM5这类够用且灵活基本定时器TIM6、TIM7就只能数数。下面讲的内容默认以通用定时器为主涉及高级定时器特有的地方我会单独点出来。你手上具体是哪颗芯片先翻一下参考手册的定时器章节开头那张资源表确认你要用的定时器支持哪些功能这一步别省我踩过用基本定时器去配PWM结果死活不出波形的坑。2. PWM输出从占空比到死区把波形捏在手里2.1 PWM到底是怎么算出来的PWM的本质特别朴素一个计数器在0到ARR自动重装载值之间循环数数同时有个比较寄存器CCR计数器值小于CCR时输出一种电平大于等于CCR时输出另一种电平。于是输出的方波频率由计数节奏决定占空比由CCR和ARR的比例决定。公式很直接频率 定时器时钟 / ((PSC1) × (ARR1))占空比 CCR / (ARR1)这里PSC是预分频器。举个实际例子假设定时器挂在72MHz总线上我想要一个1kHz、占空比可调的PWM去驱动LED做呼吸灯。先定ARR如果PSC取71那计数时钟就是72MHz/721MHz要1kHz就是每1000个计数一个周期ARR取999。此时CCR从0到999变化占空比就从0%到100%线性变化分辨率是千分之一做呼吸灯绰绰有余。提示ARR和PSC都是实际值减一写进寄存器的因为硬件是从0开始数的。新手最容易在这里差一算出来的频率总跟预期对不上先检查这个。为什么这么设计而不是直接给频率因为这种分频重装载的结构给了你极大的灵活性——同一个定时器改PSC能大范围调频率改ARR能调周期精度改CCR能实时调占空比且不影响频率。这种解耦是PWM能同时服务电机调速和LED调光的原因。2.2 输出模式的选择PWM1还是PWM2配置PWM时你会遇到PWM模式1和模式2的选择。区别就一句话模式1下计数器小于CCR时输出有效电平模式2反过来。听起来无所谓但配合有效电平极性设置实际输出会差一个反相。我的经验是驱动LED、驱动MOS管这类先想清楚你的硬件是高电平有效还是低电平有效然后模式1配高极性基本能覆盖大部分场景。如果发现波形反了别急着改硬件先检查这两个设置。还有个常被忽略的点是预装载使能OCxPE。CCR寄存器如果不开预装载你改占空比时新值立刻生效可能在周期中间突然跳变对电机这种负载会产生冲击。开了预装载后新值要等到下一个更新事件才生效波形过渡平滑。做电机调速我强烈建议开预装载做LED调光开不开都行但养成开的习惯没坏处。2.3 高级定时器的死区驱动半桥的必修课如果你要驱动半桥或全桥比如直流无刷电机、逆变电路就必须用高级定时器因为只有它们带死区插入功能。死区是什么就是上下两个互补的开关管在切换时故意留一小段两者都关断的时间防止同时导通造成短路炸管。这个时间通常几十到几百纳秒具体看你的开关管关断速度。死区时间通过BDTR寄存器的DTG位配置它有一套编码规则不是直接写纳秒数。以常见的配置为例DTG的低几位决定死区时钟的分频高位决定计数。我一般这么算先确定定时器时钟周期比如72MHz对应约13.9ns想要500ns死区大约需要36个时钟周期然后对照手册的DTG编码表反推该写什么值。这块手册讲得细但表有点绕建议写个小脚本或者用CubeMX生成后反查寄存器值比手算靠谱。注意死区配置错了轻则波形异常重则烧管。第一次调半桥驱动务必先用示波器双通道看上下管的栅极波形确认死区真实存在且大小合适再上功率电。2.4 一份可直接抄的PWM配置流程以通用定时器输出一路PWM为例我平时是这么走的使能定时器时钟和对应GPIO时钟GPIO复用为定时器输出功能。配置时基PSC、ARR按上面公式算好填入计数模式选向上。配置输出比较选PWM模式1使能预装载设置初始CCR。使能对应通道输出CCxE高级定时器还要使能主输出MOE。启动定时器计数器。运行中通过改CCR调占空比。代码层面用标准库或HAL都行核心就是这几个寄存器。我习惯在初始化后先给个50%占空比用示波器确认波形频率和占空比都对再接入实际负载。这个先空载验证的习惯帮我省过很多事——有次直接接电机发现不转排查半天结果是初始化顺序里通道输出没使能空载一看波形根本没有问题立刻定位。3. 输入捕获把外部信号的脾气摸清楚3.1 输入捕获解决的是什么问题PWM是往外发输入捕获是往里收。它的原理是外部信号接到定时器的捕获通道上当信号发生边沿跳变上升沿或下降沿时硬件瞬间把当前计数器的值锁存到捕获寄存器CCR里同时可以触发中断。你拿到这个锁存值就能反推信号的时间信息。最典型的两个应用测频率和测脉宽。测频率的思路是在两个相邻上升沿之间记录计数器差值这个差值就是一个信号周期对应的计数值乘以计数时钟周期就是实际周期取倒数就是频率。测脉宽则是捕获上升沿和下降沿之间的差值。这里有个关键细节如果信号周期比定时器的一个计数周期ARR溢出周期还长计数器会溢出单次捕获的差值就不准了。解决办法要么把PSC调大让计数范围覆盖信号周期要么在溢出中断里累加溢出次数用溢出次数×ARR当前捕获值来算总时间。后者更通用我测低频信号比如几Hz的转速脉冲时基本都用溢出累加。3.2 捕获边沿与滤波别让噪声骗了你输入捕获配置里有两个容易被忽视但很要命的参数捕获边沿和输入滤波。边沿好理解测周期就配上升沿测脉宽就上升沿下降沿交替。滤波ICF位则是用来对付信号毛刺的——机械按键、长线传输的编码器信号、电机换相时的干扰都可能带来高频抖动不滤波的话一次跳变被识别成好几次捕获值全乱。滤波的原理是要求信号在连续N个采样周期内保持稳定才认作有效边沿N越大抗噪越强但响应越慢。我的经验值干净的方波信号滤波设最小甚至关掉机械触点或长线信号设中等强度电机环境下的编码器信号适当加大。这个没有标准答案得拿示波器看实际信号质量再定。有次测一个霍尔传感器输出不滤波时频率读数乱跳加了滤波立刻稳了就是信号边沿有振铃导致的。3.3 一个完整的测频实操假设要测一路0到10kHz的方波信号频率定时器时钟72MHz。我的配置思路PSC取71计数时钟1MHz即每个计数1微秒。ARR取最大65535这样单次计数范围约65ms对应最低能测约15Hz覆盖10kHz没问题。捕获通道配上升沿触发开捕获中断。中断里读CCR和上次捕获值做差得到周期计数换算频率。如果信号可能低于15Hz就得开更新中断累加溢出。代码逻辑是每次捕获中断里用溢出次数×65536 当前CCR - 上次CCR算周期然后清零溢出计数。这里有个坑——捕获和溢出可能同时发生读的顺序不对会差一个周期。稳妥做法是在捕获中断里先读溢出标志再读CCR或者干脆在捕获时短暂关中断保护一下。我一般用前者实测够用。提示测频精度取决于计数时钟。1MHz计数时钟下测10kHz信号一个周期是100个计数量化误差约1%够用。如果要更高精度可以提高计数时钟或者用测多个周期取平均的办法后者更划算。3.4 PWM输入模式一次捕获同时拿频率和占空比STM32的定时器还有个很实用的PWM输入模式它用两个捕获通道配合一个测周期一个测高电平时间一次就能同时得到频率和占空比。原理是同一个信号同时进两个通道一个配上升沿一个配下降沿硬件自动把周期值和高电平值分别锁存。这个模式测舵机信号、测PWM传感器输出特别方便省得你自己在中断里来回切边沿。配置时注意从模式要选复位模式让每次上升沿把计数器清零这样两个捕获值直接就是周期和脉宽不用做差。我第一次用这个模式时没配从模式结果两个值对不上查了半天手册才发现漏了这一步。4. 编码器模式让旋钮和电机自己报位置4.1 正交编码器为什么需要专门的硬件旋转编码器输出两路方波A和B相位差90度。正转时A领先B反转时B领先A通过判断两路信号的相位关系就能知道转向通过数边沿就能知道转了多少。如果用普通GPIO加中断去软件解码信号一快中断就爆了CPU全耗在这上面。STM32定时器的编码器模式就是把这个解码过程交给硬件A、B两路接到定时器的两个捕获输入上硬件自动根据相位关系做加减计数你只管定期读计数器的值就行。这个设计的精妙之处在于计数器值的变化本身就编码了转了多少、往哪转——正转加、反转减读一次差值就知道这段时间的净位移。而且硬件解码能支持很高的信号频率软件方案根本比不了。做电机测速、做带旋钮的人机界面这是标准解法。4.2 计数倍频1倍、2倍还是4倍编码器模式有个计数倍频的选择可以在A的边沿计数、A和B的边沿都计数、或者A和B的双边沿都计数对应1倍、2倍、4倍频。倍频越高分辨率越高但也要看信号质量。4倍频下每个周期能数4个数分辨率最高但如果信号有抖动误计数也会放大。我的建议信号干净比如光电编码器用4倍频信号一般比如机械编码器用2倍频甚至1倍频求稳。举个算例一个1000线的编码器4倍频后电机转一圈计数4000。如果定时器每10ms读一次两次读数差400那就是10ms转了0.1圈转速就是10转/秒即600转/分。这个换算关系做电机测速时天天用记住差值/每圈计数/采样时间这个套路就行。4.3 编码器模式的配置要点与坑配置上主要几步两个GPIO配成复用输入并上拉编码器输出常是开漏必须上拉定时器选编码器模式设置计数范围ARR使能定时器。这里有几个实操心得第一ARR别设太小。编码器计数器是循环的正转到头会从ARR跳回0反转从0跳到ARR。如果你读值的间隔内转过的计数超过ARR范围就会算错方向。一般ARR设最大65535除非你的采样间隔特别长、转速特别高。第二初始值建议设中间值。比如ARR65535时初值设32767这样正反转都有足够余量避免刚上电就在边界附近来回跳。第三读值要做有符号处理。两次读数的差如果超过ARR一半说明发生了回绕要按有符号数解释。比如差值算出65000实际应该是65000-65536-536即反转了536个计数。这个处理不做反转时读数会突然变得巨大。注意机械编码器带咔哒声那种的触点抖动很严重硬件上建议加RC滤波软件上可以配合定时器输入滤波。我做过一个面板旋钮不加滤波时慢慢转都会误判方向加了滤波和适当降低倍频后才稳。5. 三个模式的横向对比与选型思路把这三个模式放一起看其实它们对应了定时器的三种角色PWM输出是信号发生器输入捕获是信号分析仪编码器模式是运动解码器。选型时先问自己我是要产生信号、测量信号还是解读位置信息模式核心寄存器典型场景关键配置常见坑PWM输出CCR、ARR、PSC电机调速、LED调光、舵机模式选择、预装载、死区差一错误、极性反、死区算错输入捕获CCR、PSC、滤波测频、测脉宽、PWM输入边沿、滤波、溢出处理溢出未累加、噪声误触发编码器模式ARR、输入滤波旋钮、电机测速定位倍频、上拉、回绕处理边界回绕、抖动误计数实际项目里这三个经常组合出现。比如一个电机控制项目可能同时用PWM输出驱动电机、用编码器模式测转速、用输入捕获测某个传感器信号。这时候要注意定时器资源的分配——高级定时器优先给需要死区的PWM通用定时器分给捕获和编码器别让一个定时器同时干互相冲突的活。我见过有人想用一个定时器的同一个通道既做PWM输出又做捕获这物理上就不行通道是复用的得分开。还有个资源层面的经验定时器数量有限的芯片上能用硬件就别用软件模拟。比如编码器解码软件模拟在低速时看着能用一旦转速上去就丢步最后还是得回到硬件方案。前期规划时把定时器资源列个表哪个干什么是定死的后期改需求才不会手忙脚乱。6. 调试实录那些手册上不会写的排查经验6.1 PWM没波形按这个顺序查PWM调不出来是最常见的求助。我的排查顺序是先看GPIO有没有配成复用功能配成普通输出是没波形的再看定时器时钟使能没有然后看通道输出使能位CCxE和高级定时器的主输出使能MOE最后用示波器看。这四步能解决八成问题。剩下两成里一半是ARR或PSC算错导致频率离谱比如算出几Hz以为是没输出另一半是引脚被别的功能占用了。有次调了一小时最后发现是调试时把那个引脚配成了SWD的复用脚冲突了。6.2 捕获值总在跳先怀疑信号输入捕获读数不稳很多人第一反应是代码问题其实先该怀疑信号质量。拿示波器看原始波形有没有振铃、毛刺、边沿太缓。信号本身脏代码怎么写都白搭。确认信号干净后再查滤波配置和溢出处理。我遇到过一次捕获值周期性跳变最后发现是信号源和板子共地不良加了根地线就好了——这种问题纯看代码永远找不到。6.3 编码器反转读数异常查回绕编码器正转正常反转乱九成是回绕处理没做对。前面说过差值要按有符号数解释。还有个隐蔽情况如果ARR设得不是最大值而你又没考虑回绕正转到ARR附近再稍微转一点就跳回0差值算出来是个大正数方向就判反了。解决办法要么ARR设满要么差值判断时用超过一半就减一个周期的逻辑。这个逻辑我封装成一个小函数所有读编码器的地方都调它省得每处都写一遍还容易漏。6.4 中断里读寄存器的顺序问题捕获和更新溢出中断同时挂起时读CCR和清标志的顺序会影响结果。稳妥的做法是在捕获中断里先判断并处理溢出再读捕获值或者读之前短暂关一下中断。这个细节手册里提得不多但实际测低频信号时经常碰到表现为偶尔有一个周期的测量值偏差很大。我现在的习惯是捕获中断里统一用先读状态、再读数据、最后清标志的顺序实测稳定。7. 我个人在实际操作中的几点体会定时器这块我最大的感受是别怕看寄存器。库函数封装得再好出问题时你还是得回到寄存器层面看每一位的含义。我建议初学时用CubeMX生成一版配置然后对照生成的代码逐个寄存器看它配了什么、为什么这么配看几遍就通了。比单纯抄例程强太多。另外示波器是定时器调试的半条命。PWM看波形、捕获看信号、编码器看AB相没有示波器全靠猜效率低还容易误判。手边没示波器的话至少弄个逻辑分析仪几十块的那种测数字信号够用了。最后分享个小技巧调定时器参数时我习惯把PSC和ARR的推算过程写在注释里比如72MHz/721MHz, 1000计数1kHz过几个月回来看代码一眼就知道当时怎么想的。定时器参数这东西不写注释过阵子自己都看不懂这个习惯帮我省了很多重新推导的时间。

相关推荐

Linux内核安全:eBPF与io_uring的隐蔽攻击与防御
Linux内核安全:eBPF与io_uring的隐蔽攻击与防御

1. 项目概述:当现代Linux内核技术遇上隐蔽持久化最近在分析Linux系统安全时,发现一个值得警惕的趋势:攻击者开始将eBPF和io_uring这类本用于性能优化的内核技术武器化。去年某次应急响应中,我们就遇到过一个完全驻留在内核空间的恶… · 2026/11/3 14:06:59

FT60F02X 8位单片机C语言寄存器配置与外设自查清单
FT60F02X 8位单片机C语言寄存器配置与外设自查清单

简介:《辉芒微单片机C语言笔记》面向使用辉芒微8位MCU(如FT60F02X、FT61F023等)进行C语言开发的初学者与嵌入式工程师,定位为寄存器级编程的速查笔记与上手参考,重点解决头文件包含、引脚与寄存器未定义、系统时钟及外… · 2026/11/3 14:06:59

手写RAG后再读LangChain源码:从零理解检索增强生成
手写RAG后再读LangChain源码:从零理解检索增强生成

手写一遍 RAG,再回头看 LangChain 的源码,那种感觉就像自己先照着菜谱炒了一盘菜,再去米其林后厨看人家怎么标准化出餐——每一个封装、每一层抽象,你都能对上号。我最初接触 LangChain 的时候,被它那一堆 Chain、Retr… · 2026/11/3 14:06:59

先进成像与机器视觉:AIMV 2026技术风向与工程落地实践
先进成像与机器视觉:AIMV 2026技术风向与工程落地实践

2026年先进成像与机器视觉国际学术会议(AIMV 2026)这个标题,我第一眼看到的时候就特别想聊一聊。做机器视觉这行久了,你会发现圈内真正值得跑的会其实就那么几个,而AIMV这种把“先进成像”和“机器视觉”放在一起的会议… · 2026/11/3 16:15:33

大模型时代,国产AI芯片的全栈协同之战
大模型时代,国产AI芯片的全栈协同之战

大模型规模还在膨胀,国内AI芯片的竞争已经不止于算力指标,而是一场围绕全栈协同的系统工程。这两年我参与了不少国产芯片落地项目,一个感受很强烈:单看峰值性能,很多芯片已经追得很近,但真要跑一个大模型的… · 2026/11/3 16:15:33

中文大模型评测基线:C-EVAL 多级多学科评估实战指南
中文大模型评测基线:C-EVAL 多级多学科评估实战指南

简介:C-EVAL 是面向中文语境下基础模型评测的多层级、跨学科评估套件,适合自然语言处理与大模型评估方向的研究人员及技术从业者使用,用于系统分析各类大模型在中文环境中的知识储备与推理短板。套件按中学、高中、大学、专业四个难度层级组织… · 2026/11/3 16:15:33

OctaFuse 2.11.0:流式请求优化与用户折扣策略的网关级治理
OctaFuse 2.11.0:流式请求优化与用户折扣策略的网关级治理

1. OctaFuse Gateway 是什么:不是“又一个网关”,而是业务流量的智能调度中枢 很多人看到“OctaFuse Gateway”第一反应是:“哦,又一个 Spring Cloud Gateway 或 Envoy 的包装壳?”——这种理解在 2.11.0 版本之前或许… · 2026/11/3 16:15:33

Java开发者必备AI编程工具对比与实战指南
Java开发者必备AI编程工具对比与实战指南

1. Java开发者的AI辅助编程工具全景解析 作为一名深耕Java领域多年的开发者,我亲历了从纯手工编码到AI辅助开发的演进历程。当前主流的三大工具——Cursor、Claude Code和Kiro,各自在集成度、专业深度和安全性方面形成了差异化优势。本文将基于实际项目经… · 2026/11/3 16:15:33

RAG中Embedding优化的三重空间对齐工程
RAG中Embedding优化的三重空间对齐工程

1. 这个问题背后,藏着整个RAG落地的真实瓶颈 “Embedding RAG 还值得优化吗”——这句话不是技术讨论的起点,而是很多团队在跑通第一个RAG demo之后,深夜盯着QPS曲线和召回率报表时,真实脱口而出的困惑。我带过6个从零搭建知识库的… · 2026/11/3 16:14:30

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码