news 2026/10/24 4:54:11

PMIC+MCU协同实现动态调压与低功耗电源管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PMIC+MCU协同实现动态调压与低功耗电源管理

一直做带电池的便携设备,电源这部分迟早要从“能开机”走到“够省电、能调压、坏了自己会报”,这块短板不补,后面整个产品都会卡壳。最近我在一个项目里把电源管理整个拆开重做,主控换成 PIC18F4685,电源部分用 PCA9422 这颗 PMIC 来扛,做完之后最大的体会是:电源管理不是搭一个稳压电路,而是要把“供电策略”当成一段需要实时控制的逻辑来写。这篇文章就把这套方案从选型到代码再到调试排障的完整过程整理出来,给同样在折腾电池供电设备的朋友做个参考。

PCA9422 是一颗 I2C 可配置的电源管理 IC,内部集成了两路降压转换器和两路 LDO,还有动态电压调节(DVS)、电源状态监测、中断输出和看门狗。PIC18F4685 则是一颗带 MSSP 硬件 I2C 外设、10 位 ADC、多路定时器和 PWM 的 8 位单片机。把这两颗片子放一起,可以实现多路独立供电、按键开关机、高性能模式与低功耗模式之间的电压切换、异常掉电检测,以及通过总线远程查看每一路电源的状态。这篇文章面向的读者是正在做嵌入式硬件和驱动开发的人,尤其是那种“板子能跑但功耗降不下来、电压切换老出问题”的项目状态,相信这篇内容能把这一整套逻辑串起来。

1. 整体思路:为什么是“PMIC + MCU”而不是多颗 DC-DC

1.1 分离方案的核心收益

在正式写代码之前,得先搞清楚一个选型层面的问题:系统里同时存在 3.3V 逻辑电压、1.8V IO 电压,还有一个给传感器供电的 2.5V 电压,如果按传统做法,每路都放一颗独立的 LDO 或 DC-DC,电路是简单,但控制能力几乎为零。你既不能动态切换输出电压,也不能在待机时单独关掉某一路,更没法获取当前每路电源的工作状态。PCA9422 这类 PMIC 的价值就在这里:它把这些电压轨集成到一起,并且每一个输出通道都能通过 I2C 寄存器去配置使能、限流、输出电压档位和工作模式。

用一颗 MCU 去配合 PMIC,而不是用一颗专用的电源管理处理器,是出于灵活性的考虑。PCA9422 虽然在 PMIC 内部有状态机和 DVS 逻辑,但“什么时候切电压”“什么条件下进入低功耗模式”“电压切换失败后怎么恢复”这些决策必须放到系统层面来做。PIC18F4685 不仅跑主应用逻辑,还扮演电源策略控制器的角色。这种角色分工带来的直接好处是:系统从休眠到唤醒可以按预定义的时间序列去拉高各路电压,唤醒之后再根据当前任务需要动态调整 CPU 频率对应的核心电压,所有动作都在微秒到毫秒级别完成,而不会因为缺少控制层而变成一刀切的固定供电。

1.2 两器件配合的分工边界

PCA9422 负责执行,PIC18F4685 负责决策。PCA9422 侧需要关注的资源有这几块:

  • 两路 DC-DC 转换器:支持输入 2.3V 至 5.5V,输出范围可以根据寄存器选择,效率远高于 LDO,给主控和射频这类负载电流波动大的通道供电。
  • 两路 LDO:适合对纹波敏感的模拟电路,比如传感器模拟前端和音频部分。
  • I2C 从机接口:PMIC 作为从机挂在总线上,地址由对应引脚决定,读写时序需要按 16 位寄存器地址来处理。
  • 中断输出引脚(INTB):当输入电压跌落、输出电压欠压、热关断等事件发生时,PMIC 会拉低这个引脚通知 MCU。
  • 看门狗和使能逻辑:用于防止 PMIC 在异常状态下长期带载工作。

PIC18F4685 在系统中承担的任务包括:

  • 初始化 I2C 外设,完成对 PCA9422 的寄存器配置。
  • 通过 ADC 采集输入电压,判断当前电池电压是否支持负载切换。
  • 响应 INTB 中断,在中断服务程序中读取 PMIC 的状态寄存器,决定下一步动作。
  • 根据运行模式,在多个预设置的电压档位之间切换,完成 DVS 动作。
  • 在系统进入睡眠前,把 PMIC 中不使用的通道关掉,再把自身的休眠电流拉到最低。

这里有一个在设计初期就要明确的原则:不要把 PMIC 的每一个寄存器都交给 MCU 的应用程序去频繁改写,而是把“配置”和“控制”分开。配置类寄存器只在开机的时候写一次,例如限流值、开关频率、中断掩码、输出通道的默认工作模式;控制类是运行时要根据状态反复修改的,例如电压选择寄存器、通道使能位、省电模式位。这个分工直接决定了代码结构的抽象层次,后面讲到软件框架的时候会再展开。

1.3 电源域划分与流程设计

在做原理图之前,我把系统按工作状态分了四种:正常模式、低速模式、休眠模式、异常模式。每种模式对应一组 PCA9422 寄存器状态和 PIC18F4685 自身的工作状态。

  • 正常模式:系统全速运行,DC-DC1 输出 3.3V 给 MCU 和数字逻辑,DC-DC2 输出所需负载最高电压给射频部分,两路 LDO 分别给传感器模拟前端和通信接口。PIC18F4685 保持 16MHz 内部振荡器运行,I2C 通信按需进行。
  • 低速模式:把 CPU 主频降下来,同时把 DC-DC1 从 3.3V 切换到 2.8V。电压降低之后,数字逻辑的动态功耗按电压平方关系下降,这个档位在待机轮询场景下收益很明显。
  • 休眠模式:只保留一路 LDO 给唤醒电路和保持寄存器,PCA9422 其余通道全部关闭,PIC18F4685 进入 SLEEP,靠外部事件或定时唤醒。
  • 异常模式:输入电压偏低或 PMIC 检测到过流,MCU 先将所有非必要通道按顺序关闭,保持最低配置的运行通道,把状态记录到非易失存储后再决定是否完全断电。

把这些模式用一张状态表固化下来,后面的硬件设计和代码编写都会变得清晰。PMIC 不是越多功能越好,而是要把每一路电压轨的上下电时序和使用场景绑定清楚,才不会出现“所有功能都有但切换起来互相打架”的局面。

2. 硬件连接与关键外围设计

2.1 引脚分配与供电拓扑

我的做法是先从 PMIC 的输入侧开始规划。PCA9422 的输入可以直接接电池或者 USB 5V 经过防反接和滤波后的电源,输入电容按数据手册的推荐值放,我实际用了 10uF 陶瓷电容并联 0.1uF 高频电容。每路 DC-DC 的输出电感选择要根据负载电流和开关频率来定,我用的电感值是 2.2uH,饱和电流余量至少留 30%。输出电容按 22uF 加 0.1uF 组合,保证瞬态响应不会因为负载跳变导致输出电压跌落过多。

PIC18F4685 的供电由 PCA9422 的一路 DCDC 输出提供,这里有一点要注意:MCU 的 VDD 电压必须落在其规格范围内。我选择了 3.3V 这个档位给 MCU 供电,PCA9422 的默认输出档位也要对上,否则 MCU 一上电就可能工作在不稳定状态。多路输出电压在首次上电时会依次建立,如果 MCU 靠 PMIC 供电,但 PMIC 的 DVS 功能又把该路电压切到过低档位,MCU 会在运行中掉电,所以我把给 MCU 供电的那一路 DCDC 的 DVS 上下限锁定,不允许应用代码在运行时修改这一路的 DVS 档位。

引脚分配上,我建议至少留出以下连接:

  • SDA 和 SCL:连接 PCA9422 的 I2C 接口,需要接上拉电阻,我用了 2.2k 欧姆,总线速率配置 400kHz。
  • INTB:PCA9422 的中断输出,开漏结构,接 MCU 的 RB0 引脚并启用电平变化中断,同时在外部接 10k 上拉到 3.3V。
  • 输入电压监测:通过电阻分压把电池电压接到 PIC18F4685 的 AN0 通道,分压比要考虑 ADC 参考电压,我用的是 3:1 分压,因为电池最高电压略高于 3.3V*3。
  • 手动唤醒键:一个按键接另一个 IO,带内部弱上拉,用于从休眠模式唤醒。

2.2 I2C 总线注意事项

PCA9422 的 I2C 地址取决于某个引脚的状态,要仔细看数据手册确认。我在第一个版本的板子里就是因为上拉电阻位置不对,导致 PMIC 无法被扫描到,检查了很久才发现是 SDA 和 SCL 这两根线分别在两根排线上,信号完整性和上拉位置都对不上,后来把上拉电阻改成靠近 PMIC 一侧才稳定。I2C 总线在这里扮演的是电源策略控制通道,不能和其他传感器共享总线上的同一组上拉电阻配置,因为 PMIC 的地址固定,如果和某些地址相同的传感器挂一起,通信就会冲突。

在硬件设计阶段还有几个经验可以直接用:

  • I2C 上拉电阻不要用太小的阻值,例如 1k 可能导致边沿过冲,在长线上引起误码;但 4.7k 在 400kHz 下又可能信号上升沿太慢。我最终用的是 2.2k,实测波形最干净。
  • INTB 引脚最好接一个 100nF 电容到地,做简单去抖,因为 PMIC 在电压切换瞬间可能产生非常窄的毛刺中断,MCU 的中断如果太灵敏,容易被误触发。
  • 每一路电源输出对应的负载去耦电容要靠近负载放置,PMIC 输出的反馈采样点必须从输出电容后面取,不要从电感端直接飞线,这个细节对电源稳定性影响很大。

2.3 开关机与低功耗相关电路

完整电源管理还必须处理“怎么开机”和“怎么彻底关机”。我的设计是在 PCA9422 的输入侧放一个由 PMOS 管组成的负载开关,这颗 PMOS 的控制端接 PIC18F4685 的一个 IO 和按键逻辑。平时系统完全断电,按下按键后,电源先经过 PMOS 到达 PCA9422,PCA9422 上电默认输出配置打开一路给 MCU 供电,MCU 跑起来后把 PMOS 的控制脚拉高自锁。这样 MCU 只要在检测到长按关机事件时把该 IO 拉低,就能从头切断所有电源。

这套电路的难点在于 PMOS 的自锁逻辑和 MCU 掉电瞬间的时序。必须在 MCU 即将失去供电之前完成状态保存,也就是利用 PCA9422 的输出电容在掉电瞬间还能维持几十毫秒供电的特性,让 MCU 在这段时间里完成关闭 PMOS 的动作。我在软件里把掉电检测处理成了一个最高优先级的中断任务,只要输入电压监测值低于阈值,就立刻进入保存流程。这样比单纯看 PMIC 做输出欠压保护要可靠得多。

3. 软件框架与核心代码实现

3.1 I2C 驱动与寄存器读写封装

PCA9422 的寄存器访问采用 16 位寄存器地址模式。单片机初始化时要把 I2C 外设配置为主模式,地址长度和处理函数都和普通 EEPROM 不太一样。PIC18F4685 的 MSSP 模块在配置主模式时,需要设置波特率寄存器 SSPADD,例如使用 16MHz 指令周期时,要得到 400kHz 总线速率,正确配置是:

SSPADD = ((_XTAL_FREQ / 4) / I2C_CLK) - 1;

其中 _XTAL_FREQ 是振荡器频率,I2C_CLK 是目标总线频率。这样计算出来后,把 I2C 控制寄存器 SSPCON1 配置为主模式,并使能 SSPEN 位。

寄存器读写封装我写成这样的函数:

uint8_t pmic_read_reg(uint16_t reg_addr) { uint8_t val = 0; i2c_start(); i2c_write(PMIC_I2C_ADDR << 1 | 0); // 写地址 i2c_write((reg_addr >> 8) & 0xFF); // 寄存器地址高字节 i2c_write(reg_addr & 0xFF); // 寄存器地址低字节 i2c_restart(); i2c_write(PMIC_I2C_ADDR << 1 | 1); // 读地址 val = i2c_read_nack(); i2c_stop(); return val; }

写函数也类似,只是不需要 restart,直接发送数据即可。注意这里每个字节之间的应答检测不能省略,因为 PMIC 在内部处理寄存器写入时如果有任何异常,NACK 都能及时暴露。我通常在每一条 I2C 操作之后检查总线空闲状态,连续出错的次数超过 3 次就认为 PMIC 通信异常,进入复位流程。

3.2 初始化流程与开机时序

PCA9422 上电后有一个默认配置,但不一定符合系统需求。我的初始化流程是:

  • 读取芯片 ID 寄存器,确认器件存在。
  • 禁用所有不需要的中断源,只保留输入电压跌落、输出电压欠压和热关断三个中断。
  • 写限流寄存器,根据负载设定每一路输出通道的电流上限。
  • 配置 DCDC 开关频率,频率高一点纹波小,但效率会略低,我权衡后选了 1.5MHz。
  • 配置每路输出电压的默认档位和 DVS 上下限。
  • 配置看门狗超时时间。
  • 最后释放总中断使能位。

初始化顺序是从“确认通信”到“配置核心参数”,再到“打开输出使能”。先配置再使能,避免 PMIC 在错误配置下上电输出误动作。

开机时 MCU 自身的运行不能依赖 PMIC 的初始化时序。因为 PMIC 可能比 MCU 先完成上电,也可能后完成。我在处理这个顺序时,把 PMIC 初始化和系统自检放到了靠后的位置,前面先用内部振荡器跑一个精简的主循环,等待 PMIC 通信就绪标志。实测下来,这种等待加上超时机制,比直接阻塞在 I2C 上要稳得多。

3.3 DVS 动态调压的代码结构

动态调压是本项目最核心的功能。PCA9422 支持通过寄存器选择不同的输出电压档位,切换电压时 PMIC 内部的反馈回路会自动调整占空比。MCU 要做的事情很简单:写电压选择寄存器。

但简单的操作背后有一个关键问题:什么时候切。如果系统正在全速执行任务,突然把电压降下来,轻则 CPU 死机,重则逻辑电路工作异常。所以我在代码里定义了一个“电源档位结构体”:

typedef struct { uint8_t voltage_reg_dcdc1; uint8_t voltage_reg_dcdc2; uint8_t ldo1_state; uint8_t ldo2_state; uint8_t pllmode; } pmic_profile_t;

每一种运行模式对应一个 profile。切换时先停掉会产生大电流的负载,例如射频发射,再写 PMIC 寄存器,然后延时等待输出稳定,最后恢复负载。这个顺序被我封装成一个不完整的状态机,禁止在中断上下文里直接调用,因为延时等待不能出现在 ISR 中。

DVS 期间还需要监测输入电压。因为输出从 3.3V 降到 2.8V 时,输入电流会跟着变化,如果此时电池已经接近放电末端,过大的输入电流冲击可能把输入电压拉低到欠压阈值以下,导致 PMIC 直接关闭输出。所以我在切换函数里加入了一个前置判定:如果 ADC 采集到的输入电压低于某个值,就直接拒绝切换到更高性能档位。

4. 复杂系统集成:状态机设计与多事件协同

4.1 电源管理状态机的状态划分

如果把各种请求、中断、事件都堆在主循环里判断,代码很快就变成一坨绕不清的逻辑。我最后把电源管理部分单独实现成一个状态机,状态包括:

  • PMIC_STATE_OFF:完全关机,等待按键唤醒。
  • PMIC_STATE_ON_INIT:开机初始化中,等待 PMIC 握手完成。
  • PMIC_STATE_ACTIVE:正常运行,允许任务切换性能档位。
  • PMIC_STATE_SLEEP_REQUEST:收到休眠请求,正在保存上下文。
  • PMIC_STATE_SLEEP:休眠中,所有电压轨已按休眠配置调整。
  • PMIC_STATE_FAULT:故障状态,PMIC 或者 MCU 检测到异常,正在执行保护动作。

每一个状态在进入时都会执行一个特定的函数,离开时也有一个清理动作。这种写法的好处是,后续加新功能,比如加一路传感器电源管理,只需要新增状态或者在现有状态中加入新的处理项,不会牵动主循环。

4.2 中断与轮询的配合

PCA9422 的中断输出只会在事件发生时产生一个下降沿,MCU 必须在中断服务程序里尽快读取中断状态寄存器并清标志,否则 PMIC 不会拉高 INTB 引脚。我的 ISR 里没有放复杂的逻辑,只做三件事:关掉中断源、读取 PMIC 状态寄存器、置位一个事件标志,然后让主循环去处理。这样 ISR 的耗时控制在几十微秒以内。

输入电压监测我用的是轮询方式,每秒采样四次,平均后做阈值判断,因为输入电压变化相对缓慢,不需要中断。这样把快速事件和慢速事件分开处理,既发挥了中断的优点,又不会把 ISR 拖得不可控。

4.3 看门狗与安全策略

PCA9422 自带看门狗,会根据寄存器配置产生复位或者中断。我在实际使用中把它配置成中断模式,也就是看门狗超时后 PMIC 会通知 MCU,而不是直接切断输出。MCU 在正常运行时周期性喂狗,如果进入休眠,需要先关闭看门狗再睡眠,否则唤醒后马上就会因为超时触发告警。

更重要的安全逻辑是“启动失败回滚”。在系统切换到更高性能档位后,如果 MCU 检测到自己运行异常,例如看门狗复位导致重启,那么启动流程应该检查一个标志位,如果上次启动是因为电压升高后看门狗复位,就说明当前档位不稳定,应该重新把电压降到安全档位再启动。这个逻辑虽然简单,但能避免设备陷入“一上电就死机”的循环。实现时我把它放在初始化代码最前面:

if (RCON & 0x08) { // 检测看门狗复位标志 pmic_set_dcdc1_low(); pmic_set_dcdc2_low(); }

这样即使系统发生崩溃也至少能进入一个更保守的默认配置。

5. 调试验证与常见问题排查

5.1 I2C 通信异常的排查顺序

这类项目里调通的路上最常翻车的就是 I2C。我遇到过几次总线挂死,现象是第一次读取正常,第二次就卡在等待应答环节。排查经验按优先级排列是这样的:

先看总线上是否有设备把 SDA 拉死,这种情况下测 SDA 引脚应该是持续低电平,解决办法是给 PMIC 做一次上电复位或者在代码里让几个 I2C 时钟脉冲,把卡在传输中间的状态机退出来。

再看寄存器地址发送顺序。PCA9422 的寄存器地址是 16 位的,如果发送顺序反了,PMIC 会误解成别的地址空间,读出来的数据全是 0xFF 或者 0x00。我的调试函数里把每次读写都附带一个寄存器地址回读校验,如果校验失败立刻打印现场数据。

最后才是查上拉电阻值。随着总线长度增加,上拉电阻需要适当减小,但太小会导致信号过冲。用示波器查看 SCL 上升沿,如果超过 1000ns,就要考虑把上拉降到 1.8k 或者 1.5k。

5.2 电压切换时产生毛刺的处理

动态调压最容易出现的问题是切换瞬间输出电压过冲。我在第一次测试时用示波器观察 3.3V 到 2.8V 的过渡,发现切换后的瞬间有一个约 200mV 的毛刺,向上升而不是向下降。这其实不是 PMIC 的问题,而是负载端的去耦电容在电压下降时向输出端放电造成的。解决方法是让电压切换按照数据手册规定的 DVS 斜坡速率进行,PCA9422 支持设置切换速率,调到较慢的一档,毛刺就基本消失了。

还有就是切换顺序。DCDC1 的电压变化会影响下游的负载,所以在 DCDC1 准备降电压之前,先把依赖较高电压的外设关掉或者切换到备用电源。这个顺序在代码里要用注释写清楚,否则过几个月再回来改,完全想不起当时这个切换为什么要排在前面的位置。

5.3 中断丢失与状态不同步

PMIC 的中断信号是电平触发还是边沿触发,要参考数据手册的说明。PCA9422 的 INTB 是低电平有效,MCU 需要把对应引脚配置成下降沿触发中断,并在进入 ISR 之后把所有未处理的中断源状态寄存器全部读一遍,因为如果一次发生多个事件,PMIC 会把它们合并到一个 INTB 低电平周期里。少读一个寄存器就会导致清不掉中断标志,INTB 一直为低,MCU 即使再次触发中断也无法区分新事件。

这个问题的典型表现是:设备运行一段时间后,电源一切正常,但 MCU 频繁进入中断,系统功耗异常升高。排查方法就是先屏蔽全局中断,手动读取所有中断状态寄存器,观察哪个寄存器还有残留标志。处理方式是在 ISR 里无论当前状态如何,都读全并清除所有状态寄存器。

5.4 实测数据与调试心得

在一个实际的硬件平台上,我录过一组数据做对比:系统全速运行,DCDC1 输出 3.3V,整机电流在空闲时约 42mA;切到低速模式后,DCDC1 输出降到 2.8V,MCU 主频从 16MHz 降到 4MHz,整机电流降到 18mA;进入休眠模式后,所有不必要通道关闭,只有 LDO1 保持给唤醒逻辑供电,整机电流降到 4.2mA。功耗收益非常明显,但代价是电压切换的响应时间,从收到模式切换请求到电压稳定,大约是 1.5ms,这一点在高实时性应用里需要提前评估。

调试中还发现,如果 MCU 在睡眠状态的唤醒源配置不对,即使 PCA9422 的 LDO 还在工作,MCU 也醒不过来。我最初把唤醒源设置成仅外部中断,后来发现需要同时使能定时器唤醒用于周期性巡检。唤醒后的第一件事就是重新初始化 I2C 外设,因为 MCU 在休眠期间外设时钟被停掉了,不重新初始化的话 I2C 状态机处于不确定状态。

6. 实用扩展建议与经验总结

6.1 后续可以加的功能

这套方案硬件上已经留出了余量。想更完善的话,可以考虑在 MCU 中记录 PMIC 每次告警事件的时间戳,把这些信息通过 UART 或者长距离无线接口上报给上位机,当然正式产品要评估是否需要新增这颗料和无线链路成本。PCA9422 的电压监测精度还是够用的,如果要做电池电量估算,只需要把 MCU 的 ADC 采样做得更细,配合放电曲线查表即可。

另外一个实用扩展是把 DVS 和任务调度器联动起来。实时任务运行在高性能档位,后台批量任务运行在中间档位,空闲时进入低功耗档位。这种策略可以让设备在响应速度和功耗之间保持平衡,比单纯靠降压幅度显然效果更好。

6.2 我个人的一点体会

把 PCA9422 和 PIC18F4685 组合到一起做完整电源管理之后,我最大的感受是:电源管理项目里最花时间的往往不是原理图,也不是寄存器手册,而是“状态切换时所有外部肖件都在互相影响”这一步的权衡。PMIC 负责保证每路输出的稳态精度,MCU 负责决定每一路电压轨在什么时间做什么事,两者缺一不可。设计初期把状态机画清楚,调试时遇到的很多问题都能提前避免掉。

如果现在再让我做一遍,我仍然会选这套组合。PIC18F4685 虽然算不上一颗高性能 MCU,但它外设齐全,稳定性好,代码占用也不大;PCA9422 的功能密度和灵活性在同量级芯片里很有竞争力。下面我把一些关键配置直接放在表格里,方便参考:

功能项配置值/做法备注
I2C 速率400kHz上拉 2.2k
DCDC1 默认电压3.3V给 MCU 和数字逻辑
DCDC2 默认电压2.5V给传感器模块
LDO1 用途唤醒保持休眠时唯一持续供电通道
输入电压阈值3.0V低于此值拒绝升压切换
INTB 去抖100nF 电容防止窄毛刺误触发
DVS 切换速率中档实测毛刺最小

最后再讲一个小技巧:每次修改 PMIC 配置寄存器后,紧接着读回并对比,表面上多花了几十个微秒,但在调试早期能省下大量排查时间。把这一条写进代码规范里,后面接手项目的人也会少踩不少坑。

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

PMIC加单片机实现可编程电源管理:PCA9422与PIC18F4550动态调压实战

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

作者头像 李华
网站建设 2026/10/24 4:54:00

PCA9422+PIC18F4585电源管理系统设计与实战分解

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

作者头像 李华
网站建设 2026/10/24 4:52:58

无界鼠标实战指南:一套键鼠控制多台电脑的原理与配置

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

作者头像 李华
网站建设 2026/10/24 4:52:27

深度学习框架源码编译:Compute Capability与NVCC参数排查指南

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

作者头像 李华
网站建设 2026/10/24 4:52:19

Python爬虫+大模型+MATLAB:股票评论情绪分析与股价相关性实战

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

作者头像 李华