GD32H7睡眠模式时钟管理实战:AHB/APB总线外设时钟精细化配置指南
1. 项目概述为什么H7的睡眠模式时钟管理是个“技术活”最近在调试一块基于GD32H7系列MCU的便携式设备核心需求是极致省电。当我把主循环里的任务都挂起准备让MCU进入睡眠模式时发现功耗并没有降到预期的微安级别反而还在毫安级别徘徊。这让我不得不停下来重新审视一个看似简单、实则暗藏玄机的环节睡眠模式下的时钟管理尤其是AHB和APB总线上外设时钟的配置。对于许多从STM32或其他系列MCU转过来的工程师来说进入低功耗模式可能就是一个调用HAL_PWR_EnterSLEEPMode()或类似库函数的事情。但在GD32H7这类高性能Cortex-M7内核的MCU上事情远没有这么简单。H7系列拥有复杂且强大的时钟树以及对应的高速总线AHB和低速外设总线APB1/APB2。在进入睡眠模式SLEEP时内核时钟HCLK会停止但总线时钟PCLK1, PCLK2和部分外设时钟可能并不会自动关闭。如果此时总线上挂载的外设如未使用的USART、SPI、定时器等其时钟依然在运行即使它们没有进行数据传输其内部的逻辑电路和接口模块也会持续消耗可观的静态电流。因此标题中的“AHB/APB寄存器配置”绝非纸上谈兵而是实现有效低功耗的关键实操步骤。它要求开发者不仅知道如何让MCU“睡着”更要清晰地知道在“入睡前”需要关闭哪些“房间的灯”外设时钟以及如何安全、有序地关闭它们。这篇文章我就结合实际的调试经历拆解GD32H7进入睡眠模式前后对AHB/APB总线时钟寄存器进行精细化管理的完整流程、原理和那些容易踩进去的“坑”。2. GD32H7时钟树与睡眠模式原理深度解析要管理好睡眠时的时钟首先必须理解GD32H7的时钟架构以及睡眠模式到底改变了什么。这就像你要管理一栋大楼的电力总得先知道总闸、各楼层分闸以及每个房间开关的位置和关系。2.1 H7时钟树核心架构速览GD32H7的时钟源非常丰富包括高速外部HXTAL、高速内部IRC16M/48M、低速外部LXTAL和低速内部IRC32K等。这些时钟源经过一系列分频、倍频后驱动三个主要的时钟域系统时钟SYSCLK通常由PLL提供是MCU的主时钟。AHB总线时钟HCLK由SYSCLK分频得到用于Cortex-M7内核、DMA、内存Flash, SRAM以及连接到AHB总线上的外设如GPIO。APB总线时钟PCLK1, PCLK2由HCLK分频得到用于大多数外设。PCLK1通常用于低速外设如I2C, UARTPCLK2用于高速外设如SPI, TIMER。关键点在于外设的时钟使能信号例如RCU_APB1EN寄存器中的USART0EN位和总线时钟PCLK是“与”的关系。即使你通过RCU_APB1EN禁用了某个外设的时钟如果PCLK本身还在运行流向该外设模块的时钟路径上可能仍有残留的开关活动或门控电路功耗。而进入睡眠模式直接影响的是内核时钟HCLK。2.2 睡眠SLEEP模式对时钟树的影响根据Arm Cortex-M7内核架构和GD32H7的用户手册当执行WFI(Wait For Interrupt) 或WFE(Wait For Event) 指令进入睡眠模式时内核时钟HCLK停止Cortex-M7内核停止取指和执行这是功耗降低的主要来源。系统时钟SYSCLK可能停止或保持这取决于进入睡眠模式前的配置例如是否使能了时钟在睡眠模式下保持运行。AHB和APB总线时钟PCLK默认保持运行这是一个非常重要的细节总线时钟不会因为内核休眠而自动关闭。所有挂载在APB1、APB2总线上的外设只要其对应的PCLK还在跳动即使外设本身被禁用xxEN0其时钟输入引脚仍然有信号在翻转这会带来不必要的动态功耗。因此“进入睡眠模式”不等于“整颗芯片都睡了”。总线时钟就像大楼的走廊灯和公共区域电力内核睡了员工下班了但走廊灯还亮着依然在耗电。我们的目标就是在内核下班前有选择地关闭那些不需要的“公共区域灯光”。2.3 AHB/APB外设时钟使能寄存器的作用域在GD32H7中控制外设时钟的寄存器主要有RCU_AHBEN,RCU_APB1EN,RCU_APB2EN。我们需要像管理一个清单一样在进入睡眠前审视它们RCU_AHBEN控制连接到AHB总线的外设时钟如GPIO、DMA、CRC等。GPIO的时钟通常可以关闭但要注意如果某个GPIO用于唤醒中断EXTI则其对应的GPIO端口时钟不能关闭。RCU_APB1EN控制APB1总线上的外设如UART2/3, I2C0/1, SPI1, TIMER1/2等。RCU_APB2EN控制APB2总线上的外设如UART0/1, SPI0, ADC, TIMER0等。一个核心原则在睡眠模式下只保留那些为唤醒功能所必需的外设时钟其余一律关闭。例如如果计划通过RTC闹钟唤醒则RTC和其所在的时钟域通常是APB1必须保持运行如果通过外部引脚中断EXTI唤醒则对应的GPIO端口时钟和EXTI控制器时钟必须保持。3. 睡眠模式下的AHB/APB时钟配置实战流程理解了原理我们来看具体怎么做。下面是一个完整的、可复现的进入深度睡眠此处指通过优化时钟实现更低功耗的SLEEP模式的配置流程。请注意这不是一个简单的函数调用而是一系列有顺序的寄存器操作。3.1 第一步休眠前的外设状态保存与时钟审计在决定休眠前首先要“盘点家当”。保存关键外设上下文对于正在通信的外设如UART发送到一半需要先完成或中止当前操作并保存必要的寄存器状态如控制寄存器以便唤醒后恢复。审计当前时钟使能寄存器读取RCU_AHBEN,RCU_APB1EN,RCU_APB2EN寄存器的值并保存。这一步至关重要它记录了系统正常运行时的时钟状态。我们将在唤醒后依据这个备份来恢复时钟而不是想当然地重新开启所有时钟。// 示例保存时钟状态 uint32_t ahb_en_backup RCU_AHBEN; uint32_t apb1_en_backup RCU_APB1EN; uint32_t apb2_en_backup RCU_APB2EN;列出“必留”时钟清单根据你的唤醒源确定哪些外设时钟必须保持开启。例如唤醒源PA0引脚上的外部下降沿中断。必留时钟GPIOA时钟在RCU_AHBEN中、SYSCFG时钟用于EXTI配置通常在APB2、以及EXTI控制器本身所需的时钟。可关闭时钟所有USART、SPI、I2C、ADC、不必要的定时器、其他GPIO端口等。3.2 第二步关闭非必要外设时钟与配置唤醒源按照清单开始清理现场。关闭外设功能对于要关闭时钟的外设先确保其功能已禁用。例如关闭USART的发送和接收使能位USART_CTL0寄存器停止定时器TIMER_CTL0寄存器等。这比直接拉闸关时钟更安全可以避免外设在时钟消失瞬间产生错误状态。关闭外设时钟这是降低功耗的直接操作。对RCU_AHBEN,RCU_APB1EN,RCU_APB2EN寄存器进行“清零”操作只保留“必留”的时钟位。// 假设我们只保留GPIOA用于EXTI唤醒和SYSCFG的时钟关闭其他所有。 // 注意操作前最好先禁用全局中断防止在配置过程中被中断打断。 __disable_irq(); // 备份后直接写入目标值。这里是一个极简示例实际需根据你的“必留清单”计算掩码。 // 例如保留AHB上的GPIOA关闭其他。 RCU_AHBEN RCU_AHBEN_GPIOA; // 只使能GPIOA其他位写0即关闭 // 关闭APB1上所有外设时钟如果RTC等不需要的话 RCU_APB1EN 0x00000000; // 关闭APB2上所有外设时钟除了SYSCFG如果EXTI需要它 RCU_APB2EN RCU_APB2EN_SYSCFG; // 重新使能中断如果唤醒源是EXTI则需要中断是开启的 __enable_irq();注意直接给寄存器赋值会覆盖所有位。务必确保你写入的值精确地反映了“保留位1关闭位0”。使用 ~和|进行位操作通常是更安全的选择可以避免误改其他位。配置并使能唤醒源确保你的唤醒源如EXTI、RTC已经正确配置并处于待命状态。对于EXTI要配置好边沿检测并使能对应的NVIC中断。3.3 第三步执行睡眠指令与唤醒后的恢复一切准备就绪执行睡眠。设置内核睡眠特性可选通过系统控制块SCB的寄存器可以配置睡眠时是否保持调试器连接、是否使用睡眠深度等。对于GD32H7通常调用标准库函数__WFI()或__WFE()即可。执行WFI/WFE指令// 清除唤醒标志如果有然后进入睡眠 __WFI(); // 执行后内核停止程序暂停于此直到唤醒中断发生。唤醒后的第一件事——恢复时钟MCU被唤醒后会从__WFI()之后的下一条指令开始执行。此时必须立即恢复之前关闭的外设时钟否则后续任何依赖这些时钟的代码包括库函数都会导致硬件错误HardFault。// __WFI() 之后 // 恢复APB2时钟 RCU_APB2EN apb2_en_backup; // 恢复APB1时钟 RCU_APB1EN apb1_en_backup; // 恢复AHB时钟 RCU_AHBEN ahb_en_backup; // 注意恢复时钟后可能需要稍作延时等待时钟稳定特别是PLL相关的时钟。 // 然后恢复外设功能状态如果之前保存了的话。继续正常执行时钟恢复后系统就回到了休眠前的状态可以正常执行后续任务或者根据唤醒源进行特定的逻辑处理。4. 关键寄存器操作详解与避坑指南在实际操作寄存器时有很多细节需要注意一不留神就会导致系统异常或功耗优化无效。4.1 RCU时钟使能寄存器的读写特性与延迟GD32的RCU复位和时钟单元寄存器对时钟控制位的操作有一个重要特性写1使能写0无效对于使能位。这意味着你不能简单地通过向某位写0来关闭时钟。正确的做法是使能时钟RCU_APB1EN | RCU_APB1EN_USART2EN;禁用时钟需要操作另一个寄存器RCU_APB1RST复位寄存器或RCU_APB1DEN禁用寄存器如果存在。对于H7系列通常使用RCU_APB1DEN(Disable) 寄存器来关闭时钟。// 错误做法这并不能关闭USART2时钟 // RCU_APB1EN ~RCU_APB1EN_USART2EN; // 正确做法使用禁用寄存器 RCU_APB1DEN | RCU_APB1DEN_USART2DEN; // 禁用USART2时钟 // 同时为了使能再次生效可能需要清除“禁用”状态但通常直接操作EN寄存器即可重新使能。务必查阅最新的GD32H7用户手册中关于RCU章节的描述确认禁用时钟的正确寄存器是xxDEN还是需要通过xxRST先复位再关闭。这是我踩过的第一个坑想当然地用清零EN位来关时钟结果功耗丝毫没降。时钟稳定延迟在开启或切换重要的时钟源尤其是PLL后必须检查对应的时钟就绪标志位如RCU_CTL_PLLSTB等待其置位表示时钟已稳定。在睡眠唤醒后如果系统时钟源发生了变化也需要这个等待过程。4.2 关闭GPIO时钟的潜在风险与解决方案关闭未使用的GPIO端口时钟是省电的有效手段但风险很高。风险如果某个GPIO引脚被配置为输出高电平然后你关闭了该GPIO端口的时钟这个引脚的输出状态会变成什么可能是高阻态也可能是不可预测的电平。如果这个引脚恰好连接着一个外部器件如传感器使能脚可能会导致器件意外开启或关闭。解决方案休眠前统一配置在关闭GPIO时钟前将所有不用于唤醒的GPIO引脚设置为模拟输入模式。在这种模式下上下拉电阻断开输出驱动器禁用功耗最低且状态安全。// 例如将GPIOB所有引脚设为模拟输入 GPIO_CTL(GPIOB) 0x00000000; // 清除模式位 GPIO_OMODE(GPIOB) 0x00000000; // 推挽模式模拟输入时此寄存器无关但清零是好习惯 // 更规范的做法是调用库函数 gpio_mode_set() 为每个引脚设置 GPIO_MODE_ANALOG保留唤醒引脚的配置对于用于EXTI唤醒的引脚保持其时钟和输入配置不变。唤醒后恢复唤醒后根据备份的GPIO配置寄存器值恢复GPIO的工作状态。4.3 调试接口与睡眠模式的冲突处理在开发阶段我们常常通过SWDSerial Wire Debug接口连接调试器。这里有一个隐藏的坑某些调试器或IDE配置可能会阻止MCU进入深度睡眠或者进入后立即被唤醒。现象代码执行到__WFI()后MCU并没有真正休眠电流没有下降或者瞬间下降又立刻回升。原因调试器可能会周期性地发送调试包如DAP心跳包这些活动可能被MCU视为唤醒事件。排查与解决断开调试器测试最直接的方法将程序烧录后完全断开调试器与MCU的物理连接仅通过电源测量电流。这是验证低功耗是否生效的黄金标准。配置DBG模块GD32H7的DBGDebug模块有控制寄存器DBG_CTL可以配置在睡眠模式下是否保持调试器连接。有时需要允许调试器在睡眠下保持连接有时则需要禁止以减少干扰。需要根据调试需求进行配置。检查WFE与WFI如果你使用的是__WFE()它会被任何事件唤醒包括调试事件。而__WFI()只能被中断唤醒。在调试低功耗时优先使用__WFI()并确保只有你想要的唤醒中断是使能的。5. 功耗测量验证与优化闭环配置完了如何证明你的工作有效必须依靠精确的测量。5.1 搭建正确的功耗测量环境使用高精度万用表或电源分析仪普通万用表响应慢无法捕捉到MCU在运行、休眠、唤醒瞬间的电流变化。建议使用可以测量微安级电流且采样率高的设备或者带有电流量程的直流电源。串联测量法将电流表串联在MCU的供电回路中通常是VDD引脚。对于开发板可以找到为MCU核心供电的LDO或跳线在其路径上串联一个0欧姆电阻或测试点进行测量。排除外围电路影响确保测量的是MCU核心的电流可能包括片上Flash/SRAM。将板上所有不必要的外围器件如LED、传感器、通信接口的电源断开或将其置于最低功耗状态。5.2 分阶段测量与数据分析不要只看一个静态的睡眠电流值要观察动态过程全速运行电流Baseline让MCU运行一个简单的空循环记录电流值I_run。这代表了系统最大功耗的基准。配置后睡眠电流执行完上述时钟关闭流程后进入睡眠测量稳定的睡眠电流I_sleep。计算优化效果ΔI I_run - I_sleep。这个差值直观地体现了你的时钟管理策略节省了多少功耗。唤醒瞬态电流观察唤醒瞬间的电流尖峰。过高的尖峰可能意味着唤醒后同时开启了太多外设或者时钟恢复太快导致浪涌电流。可以考虑在唤醒后分步、延时恢复时钟和外设。5.3 基于测量结果的迭代优化如果测得的I_sleep仍然高于数据手册中标注的典型值例如手册说Sleep模式典型值50μA你测出来是500μA就需要进行第二轮排查逐个外设排查使用“二分法”或“逐一排除法”。先关闭所有你认为可以关闭的时钟测一个电流值。然后逐个重新使能你怀疑可能没关掉的外设时钟每次只使能一个观察电流是否显著增加。如果使能某个外设时钟后电流大增说明这个外设即使在禁用状态下也消耗了可观功耗需要检查其硬件电路或软件配置例如引脚是否处于输出状态驱动了外部负载。检查引脚漏电将所有未使用的GPIO引脚包括调试用的SWDIO/SWCLK如果产品中不用调试设置为模拟输入模式这是漏电流最小的状态。检查内部模块确认Flash是否进入了深度睡眠模式通过Flash控制寄存器配置确认备份域RTC、备份寄存器的功耗是否在预期内。通过“配置-测量-分析-再配置”的闭环你就能将GD32H7在睡眠模式下的功耗一点点压榨到数据手册标称值附近。这个过程虽然繁琐但对于电池供电的设备来说每一微安的节省都意味着更长的续航是嵌入式开发中极具价值的一项技能。

相关新闻

C++多线程性能优化:从锁竞争到无锁编程实战

C++多线程性能优化:从锁竞争到无锁编程实战

1. 为什么我们需要多线程性能优化?十年前我刚接触C多线程开发时,曾经犯过一个典型错误:在一个高频交易系统中简单粗暴地给所有共享数据加互斥锁。结果系统吞吐量直接从每秒5万笔暴跌到8千笔,那次事故让我深刻认识到——在多线程环…

2026/10/2 23:21:32 阅读更多 →
3分钟完成Blender与3D打印的无缝衔接:Blender3mfFormat插件终极指南

3分钟完成Blender与3D打印的无缝衔接:Blender3mfFormat插件终极指南

3分钟完成Blender与3D打印的无缝衔接:Blender3mfFormat插件终极指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为Blender无法直接处理3MF文件而烦恼…

2026/10/3 18:50:58 阅读更多 →
WorkshopDL终极指南:无需Steam账号下载1000+游戏模组的免费解决方案

WorkshopDL终极指南:无需Steam账号下载1000+游戏模组的免费解决方案

WorkshopDL终极指南:无需Steam账号下载1000游戏模组的免费解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法访问Steam创意工坊的精彩模组而烦恼吗…

2026/10/1 12:18:36 阅读更多 →

最新新闻

池化方法全解析:从经典MaxPool到Strip Pooling的工程选型指南

池化方法全解析:从经典MaxPool到Strip Pooling的工程选型指南

1. 为什么“池化”这个看似简单的操作,值得花一整篇来深挖?池化(Pooling)这个词,在卷积神经网络的入门课里,往往三分钟就讲完:它就是个下采样操作,把特征图变小、降维、抗干扰。但我…

2026/10/5 16:08:40 阅读更多 →
数据科学家 vs 数据工程师:一文说透岗位差异、技能栈与职业选型

数据科学家 vs 数据工程师:一文说透岗位差异、技能栈与职业选型

1. 先搞清楚这两类人每天都在解决什么问题 我面试过不少想转行数据领域的人,也带过好几个应届生,发现一个特别普遍的现象:大家张口闭口“数据科学家”“数据工程师”,但真要追问一句“你投的这个岗位具体干什么”,回答…

2026/10/5 16:08:40 阅读更多 →
pywebview实战指南:用Python和WebView构建轻量桌面应用

pywebview实战指南:用Python和WebView构建轻量桌面应用

用Python做桌面工具这件事,我一直有个执念:界面要好看、交互要流畅,但又不想为了一个小工具硬塞一个Electron外壳进去。直到我认真用了一轮pywebview,才发现自己之前绕了不少弯路——它本质上就是把系统自带的WebView引擎包装成一…

2026/10/5 16:08:39 阅读更多 →
含间隙铰关节机构动力学分析:从MATLAB编程到ADAMS联合验证

含间隙铰关节机构动力学分析:从MATLAB编程到ADAMS联合验证

先聊点实际的。我做含间隙铰关节机构的动力学分析,并不是因为它"时髦",而是被工程问题逼的:某机构样机在高速运转时出现了明显的冲击噪声和异常磨损,可无论怎么调驱动参数,理想铰模型下的ADAMS仿真结果都指向…

2026/10/5 16:08:39 阅读更多 →
原理图级EMC设计实战:电流路径与网络命名的硬核控制

原理图级EMC设计实战:电流路径与网络命名的硬核控制

1. 这不是教科书里的EMC,是焊完第一块PCB后被测试工程师叫去喝茶时才真正看懂的东西“【EMC电磁兼容】02.04——原理图的实战落地细节”这个标题乍看像某本教材的章节编号,但如果你在硬件开发一线干过三年以上,看到“02.04”这串数字心里会下…

2026/10/5 16:08:39 阅读更多 →
Jetson Nano/NX上部署麒麟ARM版向日葵远程控制实战

Jetson Nano/NX上部署麒麟ARM版向日葵远程控制实战

1. 项目概述:为什么在Jetson Nano/NX上跑麒麟ARM版向日葵,不是“能用就行”,而是“必须稳、必须快、必须不掉帧”你手头有一块Jetson Nano或NX开发板,系统刷的是银河麒麟V10 ARM版——这本身就是一个典型的国产化AI边缘计算组合&a…

2026/10/5 16:07:39 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型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/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

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/5 5:06:42 阅读更多 →
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/5 1:10:22 阅读更多 →
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/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 20:14:29 阅读更多 →