news 2026/10/24 3:32:01

基于PCA9422 PMIC与ATmega324P的低功耗电池系统电源管理方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于PCA9422 PMIC与ATmega324P的低功耗电池系统电源管理方案

去年做一款手持环境监测设备,锂电池供电,系统里同时存在 3.3V 逻辑轨、1.8V 接口电平轨、5V 传感器偏置轨,还有一个需要动态关断的负载开关。最初用的是分立 DC-DC 加 LDO 的传统做法,结果被上电时序、纹波和待机功耗来回折腾,项目一度卡了两个星期。后来换成了 PCA9422 这类 PMIC 配合 ATmega324P 的方案,一次打样就把问题收敛了。这个组合是我个人在低功耗电池系统里比较满意的一套方案,也踩过一些手册里不会写的坑。这篇把完整的硬件链路、固件配置流程、低功耗状态设计和调试心得都梳理一遍,适合正在做电池供电产品、想用 PMIC 替代分立电源方案的嵌入式工程师参考。

1. 为什么是 PCA9422 + ATmega324P:这套方案解决的核心问题

先说选型逻辑。PCA9422 是一颗可编程电源管理芯片,内部集成多路 DC-DC 降压转换器、LDO 和负载开关,输出电平和通断时序都能通过 I2C 接口配置。ATmega324P 则是 AVR 家族里的 8 位 MCU,最大的特点是有 PicoPower 低功耗技术,多个睡眠模式可以把工作电流压到微安级。它的 TWI(即 I2C)接口、外部中断和定时器资源都足够应付电源管理这种“低频逻辑”。

把两者放在一起,本质上是把电源管理从“一堆分立元件”变成了“一个可编程外设+一颗主控”。传统做法的痛点我相信很多硬件工程师都遇到过:

  • 多路 DC-DC 的反馈电阻、补偿网络、电感参数都需要单独计算,物料一多,BOM 成本和 PCB 面积都失控。
  • 各路输出的上电时序要靠 RC 延时或者专门的电源时序芯片去排,想调整顺序只能改板。
  • 待机时想让某一路完全关断,需要加 MOSFET 开关和控制逻辑,漏电流一多,整机功耗就压不下去。
  • 电压调节基本是硬件固定值,想在运行模式和低功耗模式之间切换电压,几乎不可能。

PCA9422 把这些问题集中到了一个芯片里。我常用的配置是:两路同步降压输出,一路 LDO,一路负载开关。其中降压转换器可以动态调节输出电压,工作模式下给主控和传感器供 3.3V,待机时降成 1.8V,配合 MCU 进入睡眠模式,整机功耗能降一个数量级。负载开关用来切断传感器偏置电源,待机时把漏电流彻底隔离。

ATmega324P 在这里不是“主控顺便管电源”,而是专职的电源状态管理者。它负责三件事:初始化时通过 I2C 写寄存器配置 PCA9422;运行时根据系统状态切换 PCA9422 的输出模式;异常时通过 PCA9422 的中断脚感知过流、过温、欠压,并做保护动作。选择 ATmega324P 还有一个原因:它自带 TWI 硬件模块,不需要软件模拟 I2C,时序稳定;外部中断引脚多,可以直接接 PMIC 的 INT 输出;PicoPower 模式下的 Power-down 电流在微安级别,不会拖累整机功耗预算。

这个方案适合的场景也很明确:电池供电或者能量收集类设备,对体积和功耗敏感,同时需要多路电源轨、动态电压调节和灵活的上电时序。如果你做的是工业 24V 供电、对功耗不敏感的设备,社区里有人直接用一颗 MCU 加几个开关电源也够用,倒不用上 PMIC 这套组合。

当时这个手持监测设备的功耗要求是:运行状态整机电流不超过 120mA@3.3V,待机状态不超过 50μA。用分立方案模拟计算,光是待机漏电流就已经接近 30μA,加上 MCU 最低功耗,勉强压线但没有任何余量。换上 PCA9422 之后,PMIC 自身的静态电流远比几个 DC-DC 芯片并联要低,再配合负载开关和动态电压,待机功耗做到了 9μA 左右,余量一下子就出来了。

1.1 各个模块的功能边界

要理解 PCA9422 和 ATmega324P 的关系,可以看成“配电柜和电工”的关系:PCA9422 负责把电池的电压转换成各路设备能用的电压,提供过流、过温、欠压保护,相当于配电柜;ATmega324P 负责根据系统状态决定“什么时候送电、送多少伏、哪一路先送”,相当于配电柜旁边盯着仪表盘的电工。

这个边界划分很重要,不要让 MCU 去干 PMIC 的活。比如有些工程师为了省一个芯片,用 MCU 的 PWM 输出做简易降压电路,结果电压纹波大、响应慢,还要占用大量 CPU 时间。PCA9422 这类 PMIC 内置了补偿网络和同步整流驱动,纹波和效率都是经过优化的,MCU 只需要写寄存器就能控制输出,省下的 GPIO 和定时器资源可以做别的事。

2. 硬件设计:从锂电池到四路电压轨的完整链路

先画一下整套系统的电源拓扑。以某手持环境监测仪为例,电池是单节 3.7V 锂电池,容量 2000mAh。PCA9422 从电池取电,输出四路:

电源轨电压/电流能力用途
VOUT1 降压轨3.3V / 1AATmega324P 和数字逻辑电路
VOUT2 降压轨1.8V / 500mA外部接口电平转换、存储卡供电
LDO15.0V / 200mA传感器偏置和模拟前端
SW1 负载开关未调节传感器偏置的独立开关控制

ATmega324P 直接由 VOUT1 供电,这样当 PCA9422 进入低功耗模式并把 VOUT1 降到 1.8V 时,MCU 也能同步进入低功耗状态,不需要额外的电平转换。传感器的 5V 偏置由 PCA9422 升压或者由负载开关控制外部升压电路提供,具体看传感器手册。

2.1 降压电感与电容的估算方法

PCA9422 的降压转换器内部有固定的开关频率,通常不需要像设计分立 DC-DC 那样调补偿网络,但输出电感和电容还是要按手册推荐的取值范围来选择。我习惯按电感纹波电流为最大负载电流的 30% 来估算:

L = (Vin - Vout) × Vout / (Vin × f × ΔI)

以 VOUT2 为例:Vin=3.7V,Vout=1.8V,最大负载 500mA,取 f=1.5MHz,ΔI=0.3×0.5=0.15A:

L = (3.7 - 1.8) × 1.8 / (3.7 × 1.5e6 × 0.15) ≈ 4.1μH

取标准值 4.7μH。注意电感的饱和电流要留至少 30% 余量,否则瞬态大电流时电感量会掉,输出电压会塌。

输出电容的选择主要看负载瞬态响应要求。对 MCU 这类负载,10μF 陶瓷电容通常是起步值,我一般放 2 个 10μF 并联,ESR 低、响应快。陶瓷电容的 DC-bias 特性容易忽视,小尺寸的 10μF 在 3.7V 下实际容值可能只有标称的 60%,可以选 0805 封装或者更高耐压等级来缓解。

2.2 I2C 与中断引脚的接线细节

PCA9422 的 I2C 地址芯片有多个可选地址,通过地址引脚电平来配置。这里最大的坑是上拉电阻阻值。PCA9422 是标准 I2C 从机,总线速度通常 400kHz 以内,ATmega324P 的 TWI 引脚是开漏,需要外部上拉。上拉电阻的计算很简单:

  • 最小上拉电阻:保证 SDA 低电平能被拉到 VIL 以下,Rmin = (Vcc - 0.4V) / 3mA。3.3V 供电下约等于 1kΩ。
  • 最大上拉电阻:保证上升时间不超过 I2C 规范,Rmax = tr / (0.8473 × Cbus)。总线电容按 200pF 估算、tr = 300ns(400kHz 模式)时约 1.8kΩ。

所以 1.8kΩ 到 2.2kΩ 之间比较稳妥。我实测下来 2.2kΩ 在 400kHz 下波形干净,再提高电阻值就要降速了。

INT 中断输出引脚接到 ATmega324P 的外部中断输入上。这里要注意 PCA9422 的 INT 脚可能是开漏输出,必须接上拉电阻,否则电平浮空会导致 MCU 误触发中断。我把 INT 脚上拉了 10kΩ,并在 MCU 端开了内部上拉作为冗余,双重保险。

2.3 PCB 布线的几个关键点

电源管理电路的 PCB 布线比原理图更影响实际表现。PCA9422 的输入电容要尽量靠近芯片的 VIN 引脚,降压转换器的电流回路要小,地线用独立的地平面或者加粗的敷铜。我画板时把降压电感放在芯片和输出电容构成的回路中央,反馈采样点从输出电容正极单独拉线到芯片的反馈引脚,避免采样线上叠加大电流噪声。

ATmega324P 的供电脚旁边放 100nF 和 10μF 各一个,数字地和电源地单点连接或者用磁珠隔开,能有效降低传感器数据的毛刺。这次打样之后,稳压输出纹波在满载条件下测到约 15mV 峰峰值,对 MCU 和传感器都足够干净。

3. 固件侧的核心:I2C 配置顺序决定上电时序是否可靠

硬件设计到位了,固件就是决定成败的地方。PCA9422 是“上电默认输出 + I2C 覆盖配置”的工作方式。上电瞬间芯片会用默认配置输出预设电压,保障系统能启动;之后 ATmega324P 再通过 I2C 把各路输出、限流值、软启动时间、保护阈值改成最终需要的参数。

这个分级设计非常实用,它解决了“先有鸡还是先有蛋”的问题:MCU 自己没有电的时候怎么配置 PMIC?所以 PCA9422 必须能在默认配置下独立启动,等 MCU 跑起来之后再接管。这要求 PMIC 的默认输出必须能支撑 MCU 启动,硬件设计时要格外留意默认电压和 MCU 的工作电压匹配。

3.1 TWI 驱动的实现要点

ATmega324P 的 TWI 模块是硬件 I2C 控制器,比 GPIO 模拟要可靠得多。初始化时设置波特率为 400kHz:

void twi_init(void) { // 设置 TWI 波特率,F_CPU = 8MHz, TWBR = 12, TWSR = 0x01 TWSR = 0x01; // prescaler = 4 TWBR = 12; // SCL = 400kHz TWCR = (1 << TWEN); // 使能 TWI }

读写函数的要点是处理总线状态码。每次操作后都要读 TWSR 寄存器确认状态等于预期值,否则就复位总线重新初始化。我第一次写驱动时偷懒没有校验状态,结果偶尔出现“写寄存器成功但配置没生效”的诡异现象,其实就是总线仲裁失败没有被发现。

uint8_t twi_write_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t data) { // 发送 START TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); if ((TWSR & 0xF8) != 0x08) return 1; // 发送从机地址 + 写 TWDR = (dev_addr << 1) | 0; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); if ((TWSR & 0xF8) != 0x18) return 1; // 发送寄存器地址 TWDR = reg_addr; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); if ((TWSR & 0xF8) != 0x28) return 1; // 发送数据 TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); if ((TWSR & 0xF8) != 0x28) return 1; // 发送 STOP TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); return 0; }

3.2 寄存器配置的三个阶段

PCA9422 的寄存器配置可以分成三批,顺序不能乱:

第一阶段是基础模式配置。包括开关频率、PWM/PFM 模式选择、软启动时间。这阶段配置的是“芯片以什么方式工作”,必须在任何输出使能之前完成。

第二阶段是输出电压和限流保护。把 VOUT1、VOUT2、LDO1 的目标电压写入对应寄存器,同时设置过流保护阈值。我这边把 VOUT1 设成 3.3V,限流 1.2A(留 20% 余量);VOUT2 设成 1.8V,限流 600mA;LDO1 设成 5.0V,限流 250mA。

第三阶段才是使能输出。每个转换器有独立的使能位,按系统需求的顺序依次打开。我以“模拟前端先上电、数字逻辑后上电”的顺序操作:先使能 LDO1 给传感器偏置,等 50ms 稳定之后再使能 VOUT1 和 VOUT2 给 MCU 与逻辑电路。实现如下:

void pmic_configure(void) { // 阶段一:基础模式配置 twi_write_reg(PCA9422_ADDR, REG_CTRL_MODE, 0x03); // PWM/PFM 自动切换 twi_write_reg(PCA9422_ADDR, REG_SOFT_START, 0x05); // 软启动 2ms // 阶段二:输出电压和限流 twi_write_reg(PCA9422_ADDR, REG_VOUT1, 0x33); // 3.3V twi_write_reg(PCA9422_ADDR, REG_VOUT1_LIMIT, 0xC0); // 1.2A twi_write_reg(PCA9422_ADDR, REG_VOUT2, 0x18); // 1.8V twi_write_reg(PCA9422_ADDR, REG_VOUT2_LIMIT, 0xA0); // 600mA twi_write_reg(PCA9422_ADDR, REG_LDO1, 0x50); // 5.0V twi_write_reg(PCA9422_ADDR, REG_LDO1_LIMIT, 0x80); // 250mA // 阶段三:按顺序使能输出 twi_write_reg(PCA9422_ADDR, REG_ENABLE, 0x01); // 先开 LDO1 _delay_ms(50); twi_write_reg(PCA9422_ADDR, REG_ENABLE, 0x07); // 再开 VOUT1 + VOUT2 }

实际的寄存器地址和数值要以你那颗芯片的数据手册为准,这里给出的是配置思路。核心不是背寄存器,而是理解这三阶段的逻辑:先定工作模式,再设输出参数,最后按需使能。

3.3 上电时序的实测现象与调整

最开始我把三路输出同时使能,结果模拟前端芯片配置的时候读到的寄存器是乱的。原因是 5V 偏置还没稳定,传感器内部的上电复位电路还没完成,MCU 这边已经通过 I2C 去访问它了。加上 50ms 延时后问题消失。

如果发现自己的系统有类似“I2C 访问外设失败但电平正常”的问题,不要急着怀疑代码,先用示波器看各电源轨的上电时序:每一路从 10% 升到 90% 需要多少时间,各路之间的间隔是多少,外设的复位输出有没有置位。电源管理的问题大多数是时序问题,时序对了,很多诡异毛病自动消失。

4. 低功耗模式:如何把整机待机电流压到微安级

硬件和基础固件跑通之后,接下来的重点就是功耗。手持设备的待机电流直接决定续航时间,这也是 PCA9422 + ATmega324P 这套组合最出彩的地方。

4.1 ATmega324P 睡眠模式与 PCA9422 低功耗模式的匹配

ATmega324P 有多个睡眠模式,其中 Power-down 模式功耗最低,会关闭大多数外设时钟,只有外部中断、TWI 地址匹配和看门狗能唤醒。它在 3.3V、25℃ 条件下的典型电流在 1μA 左右,实测我这块板子在 3.3V 下是 1.2μA,和手册数据基本一致。

PCA9422 这边则要配置进入低功耗模式。这一步容易被忽略——很多人让 MCU 睡了,PMIC 还在满负荷运行,静态电流白白流失。PCA9422 的低功耗模式通常包含两个动作:一是降压转换器从 PWM 模式切换到 PFM 模式,轻载时降低开关频率;二是关闭不需要的输出轨和负载开关。

我设计的待机流程是:

  1. 传感器通过负载开关断电,LDO1 关闭。
  2. PCA9422 把 VOUT1 从 3.3V 降到 1.8V。
  3. PCA9422 进入低功耗模式,VOUT2 关闭。
  4. ATmega324P 配置外部中断唤醒源后进入 Power-down 模式。

唤醒流程则相反:MCU 被外部事件唤醒 -> 唤醒 PCA9422 -> 恢复 VOUT1 到 3.3V -> 打开 LDO1 和 VOUT2 -> 等待各轨稳定 -> 系统进入正常工作状态。整个过程用状态机实现,elapsed time 大约 15ms,对监测设备来说完全可接受。

4.2 动态电压调节的实际收益

动态电压调节(DVS)是这套方案里最值钱的功能。运行状态给 MCU 供 3.3V 是保证性能,待机状态降到 1.8V 则是降低漏电和动态功耗。

举一个实际例子:ATmega324P 在 3.3V 供电时 Power-down 电流是 1.2μA,如果我把电压降到 1.8V,Power-down 电流可以再降一半左右,大约 0.6μA。单个 MCU 省下来的电流不算大,但如果系统里有多片数字芯片、接口芯片,它们都有漏电流,而且漏电流跟供电电压正相关,整板节省的效果就非常可观了。

同时,PCA9422 的降压转换器在轻载 PFM 模式下效率更高。它在 PFM 模式下的静态电流通常比亚纳安培级更低,这个特性对长时间待机的电池产品太关键了。

4.3 功耗实测数据与续航估算

实测待机状态下整机电流是 9μA(3.7V 输入),分解如下:

模块待机电流
ATmega324P Power-down1.2μA
PCA9422 静态电流1.5μA
负载开关漏电流0.8μA
上拉电阻漏电流3.2μA
其他因素2.3μA

2000mAh 电池,理论上待机时间是 2000mAh / 0.009mA ≈ 222222 小时,约 25 年。实际上锂电池自放电一个月约 3%,所以待机续航其实是被电池自放电限制的,不是被系统功耗限制。运行状态下整机电流 95mA(3.3V),折算功率约 313mW,满电 7.4Wh,可运行约 23 小时。这个数据说明待机功耗已经不再是瓶颈,真正的设计核心回到了传感器功耗和无线通信功耗上。

如果待机上拉电阻导致的漏电流降不下去,可以做成“待机时 MCU 先把 SDA/SCL 和 INT 引脚配制成输入高阻态”,让上拉电阻失去回路,这一项能省 2μA 左右。不过要注意,高阻态之后 PMIC 的中断信号就传不到 MCU 了,适合纯定时唤醒的场景。

5. 实测中踩过的三个坑:从 I2C 无应答到唤醒死机

这部分是手册里不会写的实战记录,也是我把这套方案从“能跑”做到“能可靠跑”的关键。希望这些排查思路能帮你少走弯路。

5.1 坑一:配置写不进去,I2C 总线无应答

现象:ATmega324P 初始化时调用 twi_write_reg 总是返回超时,TWSR 状态码显示在发送地址阶段就收到了 NACK。

排查过程:先怀疑是芯片地址问题,把地址引脚从低到高全试了一遍,没用;又怀疑是焊接问题,用示波器量 SDA/SCL 波形,发现 SCL 有脉冲,但 SDA 在地址发送后一直是高电平。

最后定位到根因:MCU 的 TWI 引脚虽然硬件上是开漏,但寄存器初始化时把 PORT 位设成了输出高电平,加上 PCA9422 的 SDA 也是开漏,两个开漏引脚推不动外部的 2.2kΩ 上拉电阻,总线被锁死在中间电平附近。

解决方式:检查 PORT 寄存器和 DDR 寄存器的配置,确保 TWI 引脚方向设置为开漏输出,同时关闭内部上拉。AVR 的 TWI 引脚在初始化时不要写 PORTA 输出寄存器,或者显式写 0。

这个坑在旧项目里出现过三次,都是“示波器有波形但通信不稳定”的症状,每次排查都要花半天。现在我的 TWI 初始化函数里第一件事就是清 PORT 寄存器:

TWSR = 0x01; TWBR = 12; // 关键:确保 SDA/SCL 引脚方向为开漏输出 DDRD &= ~(1 << PIND0); // 输入方向 PORTD &= ~(1 << PIND0); // 关闭内部上拉 DDRD |= (1 << PIND1); // SCL 输出 PORTD &= ~(1 << PIND1); TWCR = (1 << TWEN);

5.2 坑二:输出电压偏低,储能电感在“偷懒”

现象:VOUT1 配置为 3.3V,空载时测量是 3.31V,但接上 MCU 和逻辑电路后掉到 3.12V,离下限只有 80mV 余量,系统偶尔复位。

排查过程:第一反应是反馈电阻的问题,但 PCA9422 的反馈是内部集成的,没得调;又怀疑是输出电容不够,并了更多电容还是没改善。最后用电流探头看电感电流,发现进入电感饱和了——负载瞬态电流接近 1.3A,超过了电感饱和电流 1.5A 的标称值,电感量往下掉,输出自然撑不住。

解决方式:把电感换成饱和电流 2.5A 的型号,同时调整 PCA9422 的限流保护阈值从 1.2A 提到 1.5A。之后输出在满载下稳定在 3.28V,纹波 16mV。

教训:选电感不能只看额定电流,要看饱和电流。标称饱和电流 1.5A 的电感,在老化、高温之后实际饱和点还会继续下降,至少留 40% 以上余量才安全。

5.3 坑三:唤醒后外设访问异常,时序没给足

现象:系统从待机唤醒后,MCU 恢复得很快,但访问外部传感器时经常读到 0xFF,甚至 I2C 无应答。

排查过程:这个现象和“上电时序”问题很像。用逻辑分析仪抓唤醒过程,发现 MCU 的唤醒中断触发后,PCA9422 的 VOUT1 还在从 1.8V 往 3.3V 爬升,MCU 已经跑完初始化开始访问外设了。PMIC 的软启动需要时间,MCU 跑起来之后不能马上假设所有电源轨都到位。

解决方式:在唤醒流程里增加等待 VOUT1 稳定的步骤。我采用“查询 PCA9422 状态寄存器 + 固定延时兜底”的双保险机制:先读状态寄存器确认 VOUT1 达到目标电压,再延时 5ms,最后才去操作外设。这里推荐固定写一个pmic_wait_vout_stable()函数,所有电源状态切换之后必须调用它,避免以后加新功能时忘了等待。

调试这个坑给我最大的收获是:做电源管理的固件,时序观念要贯彻到底。每个人都会写“初始化”,但不是每个人都会想“初始化的每一行代码运行时,系统电源是不是真的已经就绪了”。

6. 一点个人体会与后续扩展

整套方案跑了几个月后,我的体会是:PCA9422 + ATmega324P 的组合特别适合“对功耗和响应都敏感”的电池设备。PMIC 解决了电源转换和保护的问题,MCU 解决了电源策略调度的问题,两者各司其职,比把电源逻辑硬塞给一颗主控或者用纯硬件时序电路都要灵活。最后分享一个我现在还在用的小技巧:把 PCA9422 的配置寄存器表放在 MCU 的 Flash 里,每次开机都重新写一遍,而不是依赖芯片的默认值。这样不同批次芯片的默认配置差异不影响系统行为,出问题也容易排查。如果后续要把方案扩展到更复杂的场景,可以考虑给 PCA9422 加一颗 RTC,让唤醒源从外部事件扩展到定时唤醒,能进一步降低待机功耗;或者在 PCA9422 的某一路未用的降压输出上再接一个负压电荷泵,给模拟前端提供双电源,这套架构仍然能支撑。

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

SpringBoot实现Excel导入:从EasyExcel到批量入库的完整方案

/* 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 3:27:08

超高速ADC比较器ADCMP572:150ps延迟与8GHz带宽的工程实践

/* 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 3:27:07

PIC18LF45K40与PCA9422低功耗电源管理设计实战

/* 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 3:26:43

Android教学管理系统开发:考勤与作业管理实践

1. 项目背景与核心需求在高校教学管理中&#xff0c;课程考勤和作业收集一直是教务工作的痛点。传统纸质签到存在代签、统计效率低等问题&#xff0c;而作业提交则经常面临格式混乱、收集不及时等困扰。基于Android平台的移动端解决方案&#xff0c;能够充分利用智能手机的便携…

作者头像 李华
网站建设 2026/10/24 3:26:33

PCA9422+PIC24FJ:电池供电设备低功耗电源管理方案实战

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

作者头像 李华