Tiva C系列GPTM定时器B模式寄存器配置与应用实战
1. GPTM定时器B模式寄存器深度解析在嵌入式开发中定时器是驱动一切时序逻辑的“心跳”。无论是精确的延时、PWM信号生成还是捕获外部事件的脉宽都离不开对定时器寄存器的精准操控。Tiva™ C系列微控制器的通用定时器模块功能强大但也因其灵活性而略显复杂。很多开发者初次接触GPTMTBMRGPTM Timer B Mode Register时面对密密麻麻的位字段往往感到无从下手。今天我们就抛开数据手册的冰冷描述从实际应用的角度深入剖析GPTMTBMR寄存器的每一个关键位并结合GPTMCTL、GPTMSYNC等关联寄存器手把手带你构建一个清晰、可靠的定时器B配置框架。GPTMTBMR寄存器是控制定时器B工作模式的核心。它的地址偏移是0x008这意味着如果你操作的是Timer1基地址0x4003.1000那么GPTMTBMR的绝对地址就是0x4003.1008。这个寄存器只有在定时器A和B独立工作时才有效当它们级联成32位定时器时定时器B的模式将由GPTMTAMR统一控制。寄存器中绝大多数位除了TCACT都必须在定时器B禁用GPTMCTL寄存器的TBEN位为0时才能修改这是一个至关重要的安全准则违反它可能导致不可预测的定时器行为。1.1 核心模式选择位TBMR与TBAMS寄存器的低两位TBMR是模式选择的基石。它定义了定时器B的基础运行框架0x0保留。通常不使用。0x1单次触发模式。定时器从装载值GPTMTBILR开始计数达到超时条件通常为0后产生一次中断或触发然后停止。适用于需要精确单次延迟的场景比如按键消抖后执行一次动作。0x2周期定时器模式。定时器在超时后自动重载初始值并继续运行周而复始。这是最常用的模式用于产生固定周期的中断作为系统的时基。0x3输入捕获模式。定时器在此模式下转变为“秒表”用于测量外部信号的脉宽或频率。此时TBMR位与TBAMS、TBCMR位共同作用。TBAMS位是“交替模式选择”位它像一个模式切换开关0启用捕获或比较模式。当TBMR0x3时此设置激活输入捕获功能。1启用PWM模式。此时定时器B将能够产生脉宽调制信号。特别注意要成功启用PWM模式必须同时满足三个条件1) 设置TBAMS12) 清除TBCMR位置03) 配置TBMR字段为0x1或0x2。很多新手配置PWM不成功往往是因为漏掉了其中一步。1.2 捕获模式细化与计数方向当TBMR0x3且TBAMS0时定时器进入捕获模式。此时TBCMR位进一步定义了捕获的细节0边沿计数模式。定时器记录的是在指定边沿上升沿、下降沿或双边沿上发生的事件次数。这常用于简单的频率测量或事件计数。1边沿时间模式。这是更强大的功能定时器会捕获事件发生时自身的计数值从而可以精确计算出两个事件之间的时间间隔。这是测量脉冲宽度或信号周期的标准方法。TBCDIR位控制计数方向0向下计数。从装载值递减到0。1向上计数。从0递增到装载值。 在PWM或RTC模式下此位被忽略。PWM模式固定为向下计数这是为了与比较匹配逻辑相配合实现可预测的占空比控制而RTC模式固定为向上计数。1.3 中断、触发与高级控制位TBMIE是匹配中断使能位。在单次或周期模式下当计数器值GPTMTBR与匹配寄存器值GPTMTBMATCHR相等时如果此位置1则会产生中断。这里有一个关键点即使你在GPTMDMAEV或GPTMADCEV寄存器中使能了DMA或ADC的匹配事件触发如果TBMIE位为0那么DMA或ADC请求也不会被发出。这意味着中断使能位在某些情况下也充当了触发信号的门控。TBWOT是“等待触发”位。这是一个用于实现定时器硬件级联或同步的高级功能。当TBWOT1时即使TBEN1使能了定时器B它也不会开始计数直到接收到来自“前级”定时器在硬件菊花链中的超时触发信号。这可以用于创建精确的、无软件延迟的级联定时序列例如实现超长定时或复杂的多相位PWM。TBSNAPS是快照模式位仅在周期模式下有效。当TBSNAPS1时在每次超时事件发生时定时器B自由运行的当前值会被自动捕获并加载到GPTMTBR寄存器中。这有什么用呢想象一下你在调试一个实时性要求极高的系统你想知道中断服务例程的精确执行时间。你可以在中断入口和出口分别读取GPTMTBR两者的差值就近似是中断耗时。快照模式可以确保你读取到的是事件发生瞬间的“冻结”值而不是正在变化的值提高了测量的准确性。TBILD是间隔加载控制位。它决定了重载值GPTMTBILR和GPTMTBPR何时更新到实际计数器GPTMTBR和GPTMTBPS。0立即更新。在下一个时钟周期生效。1超时更新。在下一个超时事件时生效。 选择“超时更新”可以避免在定时器运行中途修改周期值导致的当前计数周期长度异常使周期切换更加平滑特别是在需要动态调整PWM频率的应用中。2. 关联寄存器协同配置实战定时器B的模式寄存器不是孤立工作的它必须与GPTM配置寄存器、控制寄存器等协同配置才能形成一个完整的功能单元。2.1 与GPTMCTL控制寄存器的联动GPTMCTL寄存器是定时器的“总开关”和“精细调谐器”。在配置GPTMTBMR之前务必先通过GPTMCTL的TBEN位禁用定时器B。配置完成后再通过置位TBEN来启动它。这是所有操作的前提。TBEVENT字段位11:10在PWM模式下与TBPWMIE位协同工作定义了在哪个边沿产生捕获事件中断。例如TBEVENT0x0上升沿且TBPWMIE1则PWM输出信号的上升沿会触发中断。这里有一个容易踩坑的细节如果同时使能了PWM输出反转TBPWML1那么边沿检测的中断行为也会随之反转。原本设定在上升沿触发实际会在下降沿触发。这一点在调试PWM输入捕获或基于边沿的中断应用时需要特别注意。TBOTE位是输出触发使能位。当它置1时定时器B的超时或匹配事件可以作为一个硬件触发信号直接启动ADC的转换序列无需CPU干预。这对于需要定时采集模拟信号如音频采样、传感器巡检的应用至关重要能实现极高精度的采样定时。别忘了要使此功能生效ADC模块本身必须使能并且在ADC事件多路选择器ADCEMUX寄存器中需要将对应的触发源选择为这个定时器。2.2 同步与中断管理GPTMSYNC寄存器提供了强大的硬件同步能力。通过向对应的SYNCTn位字段写入特定值软件可以一次性触发多个定时器的超时事件。例如向SYNCT1写入0x3可以同时触发Timer1的A和B两个子定时器的超时。这在需要多个PWM通道完全同步启动或者创建复杂定时序列时非常有用。它能消除软件先后使能定时器带来的微小时间差。中断的管理涉及三个寄存器GPTMIMR中断屏蔽、GPTMRIS原始中断状态和GPTMMIS已屏蔽中断状态。GPTMIMR用于使能或禁用特定中断源。例如设置TBMIM位为1使能定时器B的匹配中断。GPTMRIS这是中断的“源头”。无论GPTMIMR是否屏蔽只要硬件事件发生对应的位就会被置1。它反映了最原始的中断状态。GPTMMIS这是最终送达NVIC嵌套向量中断控制器的中断状态。只有GPTMIMR中使能即未屏蔽且GPTMRIS中已置位的中断才会在GPTMMIS中显示为1并产生中断请求。清除中断标志的标准操作是向GPTMICR中断清除寄存器的对应位写1。一个重要的实践提醒在应用中如果需要禁用后再重新使能定时器例如为了改变频率最好先读取并清除GPTMRIS中的相关状态位。因为定时器禁用时已发生但未处理的事件状态可能被保留重新使能后可能立即触发一次非预期的中断。3. 典型应用场景配置示例理解了各个位的含义我们通过几个具体场景来串联配置流程。3.1 配置定时器B为周期中断模式系统滴答假设我们需要一个1ms的周期性中断作为系统时基。系统时钟为80MHz我们使用16位向下计数模式。确定装载值周期 (装载值 1) / 时钟频率。1ms 0.001s所以装载值 0.001 * 80,000,000 - 1 79999。这个值超过了16位最大值65535因此我们需要使用预分频器。假设预分频值设为79则定时器时钟为80MHz / (791) 1MHz。此时装载值 0.001 * 1,000,000 - 1 999。禁用定时器向GPTMCTL寄存器写值清除TBEN位确保位8为0。配置GPTMCFG设置为0x4表示16位定时器模式。配置GPTMTBMRTBMR 0x2 (周期模式)TBAMS 0 (非PWM模式)TBCMR 0 (无关)TBCDIR 0 (向下计数)TBMIE 1 (使能匹配中断不这里我们需要的是超时中断。匹配中断是用于GPTMTBMATCHR的。对于简单的周期中断我们使用超时事件。因此TBMIE保持0我们需要在GPTMIMR中使能TBTOIM)。其他位如TBWOT, TBSNAPS, TBILD等根据需求设置通常保持0。设置间隔加载寄存器向GPTMTBILR写入999。设置预分频寄存器向GPTMTBPR写入79。使能中断在GPTMIMR寄存器中将TBTOIM位设置为1。使能定时器最后在GPTMCTL寄存器中将TBEN位置1定时器开始计数。3.2 配置定时器B为PWM输出模式假设我们需要在某个引脚上产生一个频率为1kHz占空比为30%的PWM信号。使用16位向下计数系统时钟80MHz。计算周期和匹配值PWM频率 定时器时钟 / (装载值 1)。设定预分频为0不分频定时器时钟80MHz。则装载值 80,000,000 / 1,000 - 1 79999。占空比 (装载值 - 匹配值) / (装载值 1)。30%占空比意味着高电平时间占30%。对于向下计数模式当计数器值等于匹配值时输出电平翻转。要得到30%占空比匹配值应设置为 装载值 * (1 - 0.3) 79999 * 0.7 ≈ 55999。禁用定时器清除GPTMCTL的TBEN位。配置GPTMCFG设置为0x4 (16位模式)。配置GPTMTBMRTBMR 0x2 (周期模式PWM模式必须基于周期或单次模式)TBAMS 1 (启用PWM模式)TBCMR 0 (必须清零以启用PWM)TBCDIR 0 (PWM模式固定向下计数此位忽略但建议设为0)TBPWMIE 0 (本例不需要PWM边沿中断)TBPLO 0 (输出极性0表示装载值重载时输出低即匹配时输出变高。这样我们的匹配值55999对应高电平结束点符合计算)。设置周期与匹配值向GPTMTBILR写入79999 (周期)。向GPTMTBMATCHR写入55999 (匹配值)。配置GPIO将对应的CCP捕获/比较/PWM引脚配置为外设功能通常是AFSEL置1并选择正确的定时器外设编号通过PCTL寄存器。使能定时器置位GPTMCTL的TBEN位。验证与调整用示波器观察引脚输出。如果占空比反了70%可以修改TBPLO位为1进行反转或者调整匹配值的计算逻辑。3.3 配置定时器B为输入捕获模式测量脉宽假设我们要测量一个外部信号的脉冲高电平宽度。禁用定时器清除GPTMCTL的TBEN位。配置GPTMCFG设置为0x4 (16位模式)。配置GPTMTBMRTBMR 0x3 (捕获模式)TBAMS 0 (捕获/比较模式)TBCMR 1 (边沿时间模式)TBCDIR 1 (向上计数方便计算时间差)配置GPTMCTLTBEVENT 0x3 (双边沿捕获。我们将在中断中判断是上升沿还是下降沿)。暂时保持TBEN0。设置初始值将GPTMTBILR设置为0xFFFF向上计数最大值或者根据预期最大脉宽设置一个值。使能中断在GPTMIMR中使能CBEIM捕获事件中断。使能定时器置位GPTMCTL的TBEN位。编写中断服务程序在捕获中断中读取GPTMCTL的TB事件状态以判断是上升沿还是下降沿触发。如果是上升沿记录当前计数器值GPTMTBR作为起始时间T_start。如果是下降沿记录当前值作为结束时间T_end。脉宽 (T_end - T_start) * 时钟周期。最后不要忘记清除GPTMICR中对应的中断标志位CBECINT。4. 调试技巧与常见问题排查即使按照手册配置也难免会遇到问题。以下是一些实战中总结的排查思路。问题一定时器根本无法启动没有计数。检查时钟首先确认对应定时器模块的外设时钟是否使能通过SYSCTL-RCGCTIMER寄存器。这是最容易被忽略的一步。检查使能位确认GPTMCTL中的TBEN位是否已置1。务必记住修改GPTMTBMR等配置寄存器前TBEN位必须为0修改完成后再将其置1。检查模式配置确认GPTMCFG、GPTMTBMR中的TBMR/TBAMS/TBCMR组合是有效的、一致的。例如PWM模式必须同时满足TBAMS1, TBCMR0, TBMR0x1或0x2。问题二PWM没有输出或者输出电平不对。检查GPIO配置确认对应引脚已配置为外设功能AFSEL1并且外设选择寄存器PCTL选择了正确的定时器模块。检查输出使能有些引脚可能还需要将方向寄存器DIR设置为输出虽然作为外设功能但某些MCU的PWM输出仍需此设置并且通过DEN寄存器使能数字功能。检查极性检查GPTMTBMR中的TBPLO位和GPTMCTL中的TBPWML位。这两个位共同决定了输出信号的初始极性和有效极性。一个计算好的占空比可能因为极性设置反了而得到完全相反的结果。最稳妥的方法是用示波器观察并根据结果调整这两个位。验证匹配值与装载值确保GPTMTBMATCHR的值小于GPTMTBILR的值向下计数模式。如果匹配值大于或等于装载值可能无法产生有效的电平翻转。问题三中断无法进入或者进入一次后不再进入。检查中断使能层层递进检查定时器本地中断使能GPTMIMR寄存器中对应的位如TBTOIM, TBMIM, CBEIM等是否置1NVIC中断使能在CMSIS-core中使用NVIC_EnableIRQ(TIMER1B_IRQn)以Timer1B为例使能对应的中断线。检查中断标志清除在中断服务程序ISR中是否清除了GPTMICR中对应的中断标志位如果不清除中断标志会一直存在导致中断持续触发或后续中断被屏蔽。检查优先级中断优先级是否被其他更高优先级的中断长时间阻塞单次模式注意如果配置单次模式TBMR0x1定时器超时一次后会自动停止。如果需要再次触发需要软件重新使能定时器先清除TBEN再设置装载值最后置位TBEN。问题四测量值捕获或PWM周期不准确。时钟源精度检查系统时钟配置。如果使用内部振荡器精度可能不如外部晶振。对于高精度定时应用推荐使用外部晶振。预分频器计算确认预分频寄存器GPTMTBPR的值计算正确。预分频器是N分频写入寄存器的值是N-1。中断延迟对于输入捕获中断响应时间从边沿发生到进入ISR会引入误差。对于高频率信号这种误差不可忽略。可以考虑使用DMA将捕获值直接传输到内存或者使用定时器的“快照”功能TBSNAPS与DMA结合实现极低抖动的测量。计数器溢出在向上捕获模式中如果脉冲宽度超过计数器从0到最大值如0xFFFF的时间会发生溢出。需要在中断中处理溢出计数否则测量结果会出错。可以结合定时器溢出中断来扩展测量范围。问题五多个定时器无法同步。使用GPTMSYNC对于需要硬同步的场合如多路PWM同时启动务必使用GPTMSYNC寄存器的同步触发功能。先配置好所有定时器的参数并保持禁用状态然后通过一次写GPTMSYNC操作同时触发它们的启动。软件启动顺序如果不用硬件同步而用软件依次使能即使代码紧接着由于指令执行时间也会引入纳秒到微秒级的偏差。对于高精度同步这不是可靠的方法。配置Tiva™的GPTM定时器尤其是模式寄存器就像在组装一个精密的机械表。每一个齿轮寄存器位都必须放在正确的位置。理解每个位的“物理意义”而不仅仅是它的名字是成功的关键。从最简单的周期中断开始逐步尝试PWM输出和输入捕获在调试中结合示波器和调试器观察寄存器值的变化是掌握这门技能的最快路径。希望这篇深入的解析能成为你手边可靠的参考让你在下次面对GPTMTBMR时能够胸有成竹精准配置。

相关新闻

2026高端门窗品牌怎么选?主流门窗品牌选购指南

2026高端门窗品牌怎么选?主流门窗品牌选购指南

门窗是家装中的基础硬装构件,直接影响居室隔音、隔热、防风防水等居住体验,关乎室内空间质感与居住安全。随着家装需求不断升级,传统门窗的基础性能已无法适配现代住宅的居住需求,工艺精良、性能稳定、设计简约的高端系统门窗&…

2026/9/28 7:43:08 阅读更多 →
2026木纹砖十大品牌全新发布,优质瓷砖十大品牌盘点

2026木纹砖十大品牌全新发布,优质瓷砖十大品牌盘点

新房整装、旧房翻新、工装空间装修中,地面建材的选择直接影响空间质感与长期使用体验。相较于传统木地板易受潮变形、起拱发霉、养护繁琐的短板,木纹砖依托自然原木外观、防水防滑、耐磨耐造、无甲醛、易清洁的特性,广泛适配原木风、极简风、…

2026/10/3 7:15:53 阅读更多 →
RocketMQ顺序消息原理与电商系统实践

RocketMQ顺序消息原理与电商系统实践

1. 项目背景与问题概述 去年我们电商平台在双十一大促期间,由于订单处理系统的消息乱序问题,导致价值超过50万的优惠券被错误发放。事后排查发现,问题根源在于RocketMQ顺序消息的使用不当。这个惨痛教训促使我深入研究了RocketMQ顺序消息的实…

2026/10/3 6:57:35 阅读更多 →

最新新闻

插件机制深度解析:从加载失败到生命周期排查实战

插件机制深度解析:从加载失败到生命周期排查实战

如果你常年混迹技术社区,会发现“plugins”这个词的出现频率高得吓人——有人问 IAR plugins 是干什么的,有人贴出failed to load plugins web boot: 2 entries did not activate linxin666/dsh-p这种报错求助,还有人讨论 MusicFree 的插件到…

2026/10/4 14:53:41 阅读更多 →
插件系统工作原理与加载失败排查:从日志到实战

插件系统工作原理与加载失败排查:从日志到实战

我昨天帮一个朋友排查他本地开发环境的问题,打开他的应用日志,一排一模一样的红字:failed to load plugins web boot: 2 entries did not activate。他问我这到底什么意思,是不是电脑中毒了。我解释了半天,后来发现不仅…

2026/10/4 14:53:41 阅读更多 →
第三方软件测评全解析:测什么、怎么看、怎么选

第三方软件测评全解析:测什么、怎么看、怎么选

1. 软件被自夸坑过的人,才懂第三方测评的价值软件测评这行干得久了,你会明白一个道理:一款软件好不好,开发方说了不算,老板说了也不算,最终能服众的,是利益相关方之外的第三方站出来说句话。这就…

2026/10/4 14:53:41 阅读更多 →
cppcheck invalidPrintfArgType_n 检查器深入解析:printf `%n` 实参必须是可写指针

cppcheck invalidPrintfArgType_n 检查器深入解析:printf `%n` 实参必须是可写指针

开发工具静态分析代码质量质量保障 【免费下载链接】cppcheck static analysis of C/C code 项目地址: https://gitcode.com/gh_mirrors/cpp/cppcheck 点击查看 免费下载 本篇文章围绕 cppcheck 静态分析器中的 invalidPrintfArgType_n 检查器展开:它专…

2026/10/4 14:53:41 阅读更多 →
Spring Boot全栈实践:敦煌文化旅游管理系统的设计与实现

Spring Boot全栈实践:敦煌文化旅游管理系统的设计与实现

做毕设或者练手项目选管理系统的人很多,但真正能把一个系统做成"有的讲、拿得出手、面试能聊"的,其实不多。今天想拆解的这个敦煌文化旅游管理系统,就是典型的Spring Boot全栈项目——围绕敦煌这一个大IP,把旅游攻略、酒…

2026/10/4 14:53:41 阅读更多 →
基于springboot + vue人力资源管理系统(源码+数据库+文档)

基于springboot + vue人力资源管理系统(源码+数据库+文档)

人力资源管理系统 目录 基于springboot vue人力资源管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue人力资源管理系统 一、前言 博主介绍&…

2026/10/4 14:52:41 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →