第50讲:低功耗固件Spec——休眠条件、唤醒源、功耗约束

发布时间:2026/11/12 0:54:15

第50讲:低功耗固件Spec——休眠条件、唤醒源、功耗约束 CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第50讲低功耗固件Spec——休眠条件、唤醒源、功耗约束一、低功耗固件Spec的重要性低功耗是电池供电设备的关键指标必须通过Spec严格约束休眠和唤醒机制。1.1 为什么需要低功耗Spec原因一电池寿命要求电池寿命计算电池容量1000mAh平均功耗1mA电池寿命1000小时≈42天功耗降低10倍电池寿命延长10倍原因二功耗优化复杂功耗优化涉及硬件选择低功耗器件休眠模式多种休眠模式选择唤醒机制唤醒源配置软件优化减少CPU运行时间必须系统化设计才能达到低功耗目标原因三功耗与功能平衡功耗与功能矛盾休眠深功耗低但唤醒慢、功能受限休眠浅功耗高但唤醒快、功能完整必须根据应用场景选择合适的休眠模式1.2 低功耗Spec的组成低功耗Spec休眠模式定义休眠模式类型休眠条件休眠进入流程唤醒源定义唤醒源类型唤醒条件唤醒流程功耗约束各模式功耗平均功耗峰值功耗低功耗策略外设管理时钟管理唤醒后处理二、休眠模式定义Spec2.1 休眠模式定义Spec模板## 休眠模式定义Spec ### 2.1 休眠模式类型 - DES-001[休眠模式名称] - 模式类型[睡眠/停止/待机] - 功耗[功耗值] - 唤醒时间[唤醒时间] - 可用功能[可用功能列表] ### 2.2 休眠条件 - DES-002休眠条件 - 条件1[条件] - 条件2[条件] - 条件3[条件] ### 2.3 休眠进入流程 - DES-003休眠流程 - 步骤1[步骤] - 步骤2[步骤] - 步骤3[步骤]2.2 休眠模式定义Spec示例STM32示例一STM32休眠模式## 休眠模式定义SpecSTM32F103 ### 2.1 休眠模式类型 #### 2.1.1 睡眠模式Sleep - DES-001睡眠模式 - 模式类型睡眠模式Sleep Mode - 功耗约2mA3.3V72MHz - 唤醒时间1us - 可用功能 - CPU停止运行 - 所有外设继续运行 - SRAM和寄存器内容保持 - 唤醒源任何中断 #### 2.1.2 停止模式Stop - DES-002停止模式 - 模式类型停止模式Stop Mode - 功耗约20uA3.3V - 唤醒时间约10us - 可用功能 - CPU停止运行 - 所有时钟停止 - SRAM和寄存器内容保持 - RTC、外部中断可用 - 唤醒源外部中断、RTC闹钟、USB唤醒 #### 2.1.3 待机模式Standby - DES-003待机模式 - 模式类型待机模式Standby Mode - 功耗约2uA3.3V - 唤醒时间约50ms - 可用功能 - CPU停止运行 - 所有时钟停止 - SRAM和寄存器内容丢失除备份域 - 仅RTC、外部复位、WKUP引脚可用 - 唤醒源WKUP引脚、RTC闹钟、外部复位、看门狗复位 ### 2.2 休眠条件 #### 2.2.1 睡眠模式条件 - DES-004睡眠模式条件 - 条件1无任务需要执行 - 条件2等待中断唤醒 - 条件3需要快速唤醒1us #### 2.2.2 停止模式条件 - DES-005停止模式条件 - 条件1长时间无任务100ms - 条件2允许唤醒延迟~10us - 条件3需要保持SRAM内容 #### 2.2.3 待机模式条件 - DES-006待机模式条件 - 条件1极长时间无任务1s - 条件2允许唤醒延迟~50ms - 条件3允许SRAM内容丢失 ### 2.3 休眠进入流程 #### 2.3.1 睡眠模式流程 - DES-007睡眠模式流程 c void Enter_Sleep_Mode(void) { // 清除SLEEPDEEP位 SCB-SCR ~SCB_SCR_SLEEPDEEP_Msk; // 进入睡眠模式 __WFI(); // 或 __WFE() }2.3.2 停止模式流程DES-008停止模式流程voidEnter_Stop_Mode(void){// 关闭不必要的外设RCC-APB2ENR~(RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPBEN);// 设置SLEEPDEEP位SCB-SCR|SCB_SCR_SLEEPDEEP_Msk;// 选择电压调节器为低功耗模式PWR-CR|PWR_CR_LPDS;// 进入停止模式__WFI();// 唤醒后重新初始化时钟SystemClock_Config();}2.3.3 待机模式流程DES-009待机模式流程voidEnter_Standby_Mode(void){// 使能WKUP引脚PWR-CSR|PWR_CSR_EWUP;// 清除唤醒标志PWR-CR|PWR_CR_CWUF;// 设置SLEEPDEEP位SCB-SCR|SCB_SCR_SLEEPDEEP_Msk;// 进入待机模式PWR-CR|PWR_CR_PDDS;__WFI();// 唤醒后系统复位重新启动}## 三、唤醒源定义Spec ### 3.1 唤醒源定义Spec模板 markdown ## 唤醒源定义Spec ### 3.1 唤醒源类型 - DES-001[唤醒源名称] - 唤醒源类型[外部中断/RTC/串口/...] - 支持的休眠模式[模式列表] - 唤醒延迟[延迟时间] ### 3.2 唤醒条件 - DES-002唤醒条件 - 触发条件[条件] - 触发方式[上升沿/下降沿/电平] ### 3.3 唤醒流程 - DES-003唤醒流程 - 步骤1[步骤] - 步骤2[步骤] - 步骤3[步骤]3.2 唤醒源定义Spec示例示例一外部中断唤醒## 唤醒源定义Spec外部中断唤醒 ### 3.1 唤醒源类型 - DES-001EXTI0唤醒 - 唤醒源类型外部中断EXTI0 - 支持的休眠模式睡眠模式、停止模式 - 唤醒延迟1us睡眠模式~10us停止模式 ### 3.2 唤醒条件 - DES-002唤醒条件 - 触发源PA0引脚按键 - 触发方式上升沿按键按下 ### 3.3 唤醒配置 - DES-003唤醒配置代码 c void EXTI0_Wakeup_Init(void) { // 配置PA0为输入 RCC-APB2ENR | RCC_APB2ENR_IOPAEN; GPIOA-CRL ~GPIO_CRL_MODE0; // 输入模式 GPIOA-CRL ~GPIO_CRL_CNF0; // 浮空输入 // 配置EXTI0 RCC-APB2ENR | RCC_APB2ENR_AFIOEN; AFIO-EXTICR[0] | AFIO_EXTICR1_EXTI0_PA; // PA0 EXTI-IMR | EXTI_IMR_IM0; // 使能中断线0 EXTI-RTSR | EXTI_RTSR_RT0; // 上升沿触发 // 配置NVIC停止模式唤醒不需要使能中断 // NVIC_EnableIRQ(EXTI0_IRQn); }**示例二RTC闹钟唤醒** markdown ## 唤醒源定义SpecRTC闹钟唤醒 ### 3.1 唤醒源类型 - DES-001RTC闹钟唤醒 - 唤醒源类型RTC闹钟 - 支持的休眠模式睡眠模式、停止模式、待机模式 - 唤醒延迟1us睡眠~10us停止~50ms待机 ### 3.2 唤醒条件 - DES-002唤醒条件 - 触发源RTC闹钟 - 触发方式RTC计数器等于闹钟值 ### 3.3 唤醒配置 - DES-003唤醒配置代码 c void RTC_Alarm_Wakeup_Init(void) { // 使能PWR和BKP时钟 RCC-APB1ENR | RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN; // 使能RTC和备份域写访问 PWR-CR | PWR_CR_DBP; // 配置RTC RCC-BDCR | RCC_BDCR_RTCEN; // 使能RTC // 设置RTC预分频 RTC-PRLH 0; RTC-PRLL 32768 - 1; // 1Hz // 设置闹钟10秒后唤醒 RTC-ALRH 0; RTC-ALRL RTC-CNTH 16 | RTC-CNTL 10; // 使能闹钟中断 RTC-CRH | RTC_CRH_ALRIE; // 配置NVIC NVIC_EnableIRQ(RTCAlarm_IRQn); // 使能RTC闹钟唤醒待机模式 PWR-CSR | PWR_CSR_EWUP; }**示例三串口唤醒** markdown ## 唤醒源定义SpecUSART唤醒 ### 3.1 唤醒源类型 - DES-001USART唤醒 - 唤醒源类型USART接收中断 - 支持的休眠模式睡眠模式、停止模式 - 唤醒延迟1us睡眠~10us停止 ### 3.2 唤醒条件 - DES-002唤醒条件 - 触发源USART接收寄存器非空 - 触发方式接收到数据 ### 3.3 唤醒配置 - DES-003唤醒配置代码 c void USART_Wakeup_Init(void) { // 配置USART USART1-CR1 | USART_CR1_RXNEIE; // 使能接收中断 // 配置NVIC停止模式唤醒需要使能中断 NVIC_EnableIRQ(USART1_IRQn); }## 四、功耗约束Spec ### 4.1 功耗约束Spec模板 markdown ## 功耗约束Spec ### 4.1 各模式功耗 - DES-001[模式名称]功耗 - 典型功耗[功耗值] - 最大功耗[功耗值] - 测量条件[条件] ### 4.2 平均功耗 - DES-002平均功耗 - 计算方法[方法] - 目标功耗[目标值] - 实际功耗[实际值] ### 4.3 峰值功耗 - DES-003峰值功耗 - 峰值场景[场景] - 峰值功耗[功耗值] - 持续时间[时间]4.2 功耗约束Spec示例示例一温湿度传感器节点功耗## 功耗约束Spec温湿度传感器节点 ### 4.1 各模式功耗 #### 4.1.1 运行模式功耗 - DES-001运行模式功耗 - 典型功耗10mA3.3V - 最大功耗15mA3.3V全速运行 - 测量条件CPU运行72MHz外设全开 #### 4.1.2 睡眠模式功耗 - DES-002睡眠模式功耗 - 典型功耗2mA3.3V - 最大功耗3mA3.3V - 测量条件CPU休眠外设运行 #### 4.1.3 停止模式功耗 - DES-003停止模式功耗 - 典型功耗20uA3.3V - 最大功耗50uA3.3V - 测量条件CPU和时钟停止RTC运行 #### 4.1.4 待机模式功耗 - DES-004待机模式功耗 - 典型功耗2uA3.3V - 最大功耗5uA3.3V - 测量条件仅RTC和WKUP引脚可用 ### 4.2 平均功耗计算 #### 4.2.1 工作模式 - DES-005工作模式 - 采集周期10秒 - 采集时间100ms读取传感器发送数据 - 休眠时间9.9秒停止模式 #### 4.2.2 平均功耗计算 - DES-006平均功耗 - 运行功耗10mA × 100ms 1mA·s - 休眠功耗20uA × 9900ms 198uA·s - 平均功耗(1mA·s 198uA·s) / 10s 118uA - 目标功耗200uA - 结论满足要求 #### 4.2.3 电池寿命估算 - DES-007电池寿命 - 电池容量1000mAhCR2032 - 平均功耗118uA - 电池寿命1000mAh / 0.118mA ≈ 8475小时 ≈ 353天 - 目标寿命1年 - 结论满足要求 ### 4.3 峰值功耗 #### 4.3.1 峰值场景 - DES-008峰值场景 - 场景发送数据时 - 峰值功耗15mA运行模式 20mA无线发送 35mA - 持续时间50ms - 电源承受能力需确保电源能提供35mA峰值电流五、低功耗策略Spec5.1 低功耗策略Spec模板## 低功耗策略Spec ### 5.1 外设管理 - DES-001外设管理策略 - 策略[策略描述] - 外设列表[外设列表] - 管理方法[方法] ### 5.2 时钟管理 - DES-002时钟管理策略 - 策略[策略描述] - 时钟配置[配置] - 切换方法[方法] ### 5.3 唤醒后处理 - DES-003唤醒后处理 - 处理流程[流程] - 恢复操作[操作]5.2 低功耗策略Spec示例示例一外设管理策略## 低功耗策略Spec外设管理 ### 5.1 外设管理策略 - DES-001外设管理策略 - 策略进入休眠前关闭不必要的外设唤醒后重新初始化 - 外设列表 - GPIO保持必要引脚配置 - USART休眠前关闭唤醒后重新初始化 - SPI休眠前关闭唤醒后重新初始化 - I2C休眠前关闭唤醒后重新初始化 - ADC休眠前关闭唤醒后重新初始化 - TIM保持RTC定时器关闭其他定时器 ### 5.2 外设关闭代码 c void Disable_Peripherals(void) { // 关闭USART1 USART1-CR1 ~USART_CR1_UE; RCC-APB2ENR ~RCC_APB2ENR_USART1EN; // 关闭SPI1 SPI1-CR1 ~SPI_CR1_SPE; RCC-APB2ENR ~RCC_APB2ENR_SPI1EN; // 关闭I2C1 I2C1-CR1 ~I2C_CR1_PE; RCC-APB1ENR ~RCC_APB1ENR_I2C1EN; // 关闭ADC1 ADC1-CR2 ~ADC_CR2_ADON; RCC-APB2ENR ~RCC_APB2ENR_ADC1EN; // 关闭TIM2、TIM3 TIM2-CR1 ~TIM_CR1_CEN; TIM3-CR1 ~TIM_CR1_CEN; RCC-APB1ENR ~(RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN); }5.3 外设恢复代码voidEnable_Peripherals(void){// 重新初始化外设USART_Init();SPI_Init();I2C_Init();ADC_Init();TIM_Init();}**示例二时钟管理策略** markdown ## 低功耗策略Spec时钟管理 ### 5.1 时钟管理策略 - DES-001时钟管理策略 - 策略运行时使用HSEPLL72MHz休眠时切换到HSI8MHz - 时钟配置 - 运行时钟HSE8MHz PLL×9 72MHz - 休眠时钟HSI8MHz - 切换方法进入休眠前切换到HSI唤醒后切换回PLL ### 5.2 时钟切换代码 c void Switch_To_HSI(void) { // 使能HSI RCC-CR | RCC_CR_HSION; while ((RCC-CR RCC_CR_HSIRDY) 0); // 切换系统时钟到HSI RCC-CFGR (RCC-CFGR ~RCC_CFGR_SW) | RCC_CFGR_SW_HSI; while ((RCC-CFGR RCC_CFGR_SWS) ! RCC_CFGR_SWS_HSI); // 关闭PLL RCC-CR ~RCC_CR_PLLON; } void Switch_To_PLL(void) { // 使能HSE RCC-CR | RCC_CR_HSEON; while ((RCC-CR RCC_CR_HSERDY) 0); // 配置PLL RCC-CFGR | RCC_CFGR_PLLSRC; RCC-CFGR | RCC_CFGR_PLLMULL9; // 使能PLL RCC-CR | RCC_CR_PLLON; while ((RCC-CR RCC_CR_PLLRDY) 0); // 切换系统时钟到PLL RCC-CFGR (RCC-CFGR ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL; while ((RCC-CFGR RCC_CFGR_SWS) ! RCC_CFGR_SWS_PLL); }**示例三唤醒后处理** markdown ## 低功耗策略Spec唤醒后处理 ### 5.1 唤醒后处理流程 - DES-001唤醒后处理流程 - 步骤1恢复时钟如果是停止模式 - 步骤2重新初始化外设 - 步骤3恢复系统状态 - 步骤4执行唤醒任务 ### 5.2 唤醒处理代码 c void Wakeup_Handler(void) { // 判断唤醒源 if (PWR-CSR PWR_CSR_WUF) { // 清除唤醒标志 PWR-CR | PWR_CR_CWUF; // 恢复时钟 Switch_To_PLL(); // 重新初始化外设 Enable_Peripherals(); // 恢复系统状态 Restore_System_State(); // 执行唤醒任务 Execute_Wakeup_Task(); } }## 六、低功耗固件Spec完整示例 ### 6.1 完整低功耗固件Spec温湿度传感器节点 markdown ## 低功耗固件Spec温湿度传感器节点 ### 1. 休眠模式定义 #### 1.1 主要休眠模式 - DES-001停止模式 - 模式类型停止模式Stop Mode - 功耗约20uA - 唤醒时间约10us - 唤醒源RTC闹钟 ### 2. 唤醒源定义 #### 2.1 RTC闹钟唤醒 - DES-002RTC闹钟唤醒 - 唤醒周期10秒 - 唤醒任务读取传感器数据并发送 ### 3. 功耗约束 #### 3.1 目标功耗 - DES-003目标功耗 - 平均功耗200uA - 电池寿命1年CR2032电池 #### 3.2 实际功耗 - DES-004实际功耗 - 运行功耗10mA100ms - 休眠功耗20uA9.9s - 平均功耗118uA - 电池寿命353天 ### 4. 低功耗策略 #### 4.1 外设管理 - DES-005外设管理 - 休眠前关闭所有外设 - 唤醒后重新初始化必要外设 #### 4.2 时钟管理 - DES-006时钟管理 - 休眠前切换到HSI8MHz - 唤醒后切换到PLL72MHz ### 5. 完整工作流程代码 c void LowPower_Main(void) { // 初始化 System_Init(); RTC_Alarm_Wakeup_Init(); while (1) { // 读取传感器数据 float temperature, humidity; SHT30_Read(temperature, humidity); // 发送数据 Wireless_Send(temperature, humidity); // 关闭外设 Disable_Peripherals(); // 切换到低频时钟 Switch_To_HSI(); // 设置RTC闹钟10秒后唤醒 RTC_SetAlarm(10); // 进入停止模式 Enter_Stop_Mode(); // 唤醒后处理 // 恢复时钟 Switch_To_PLL(); // 重新初始化外设 Enable_Peripherals(); } }## 七、本讲核心要点 ### 7.1 记住这三句话 1. **低功耗Spec定义休眠机制休眠模式、唤醒源、功耗约束、低功耗策略** 2. **选择合适休眠模式平衡功耗、唤醒时间、功能可用性** 3. **功耗优化系统化外设管理、时钟管理、唤醒后处理** ### 7.2 实践建议 **对于新手** - 学习STM32低功耗模式 - 学习唤醒源配置 - 学习功耗测量方法 **对于有经验工程师** - 建立低功耗Spec模板 - 使用Spec约束低功耗设计 - 使用Spec指导功耗优化 **对于团队负责人** - 建立低功耗Spec编写规范 - 培训团队低功耗设计方法 - 建立功耗审查流程 ### 7.3 下讲预告 第51讲将详细讲解**工控固件安全Spec禁止野指针、禁止死循环、看门狗约束** 如何定义工控固件安全Spec、保证系统安全下一讲将详细讲解。
延伸阅读

更多相关文章

2026/11/10 16:31:59

大模型Agent技术架构与金融领域实践指南

1. 大模型Agent技术全景解析最近半年,大模型Agent技术突然成为AI领域最炙手可热的研究方向。作为同时具备大模型理解能力和自主行动能力的智能体,Agent正在彻底改变人机交互的方式。我在实际项目中发现,一个设计良好的Agent系统可以替代传统工…

2026/11/11 20:02:00

2026数字化决策的隐性黑盒:为什么静态后视镜报表在引发决策时滞

在多源数据爆发与业务高频迭代的现代决策语境下,许多企业与敏捷团队都曾陷入过一种典型的“数据失真与决策时滞”困境:数据报表看似堆叠得满满当当,但面对突发的技术故障、市场异动或用户行为骤变,团队依然只能依赖静态的离线周报…

2026/11/10 22:10:39

C#学习路线图:从基础语法到项目实战的完整指南

1. 从“Hello World”到独立项目:一份不走弯路的C#学习路线图 如果你在搜索引擎里输入“C#学习路线”,大概率会看到一堆堆砌着“基础语法”、“面向对象”、“.NET框架”的清单,或者是一张复杂到让人望而生畏的思维导图。这些内容本身没错&am…

2026/11/12 0:54:06

考验高级电工证怎么考?考前押题能帮你少走弯路

考验高级电工证怎么考?考前押题能帮你少走弯路 你是不是也遇到过这种情况:手头有活儿干,可就是缺个特种作业证,连门都进不去?别急,今天咱们就聊聊【考验高级电工证怎么考】这事儿,从报考流程、考试重点到考前押题怎么用,一网打尽,看完你就知道值不值…

2026/11/12 0:54:06

大同电工证在哪?怎么考?多少钱?别被中介坑了

大同电工证在哪?怎么考?多少钱?别被中介坑了 你是不是也这样? 不知道去哪报名怕被中介坑 ,听说电工证要考,但一打听就懵了,各种培训机构、线上平台、线下报名点,价格不一,信息混杂,搞得人一头雾水, 多少钱…

2026/11/12 0:54:06

特种电工证的作用官方回应学历不高也能考

特种电工证的作用官方回应学历不高也能考 你是不是也担心学历不高,报不了特种电工证?别急, 官方回应 来了,郑州市应急管理局明确表示,特种电工证的报考并不以学历为硬性门槛,只要满足年龄、健康等基本条件,就能报名参加考试。这给了很多想转行或者提…

2026/11/12 0:54:06

在上海哪里办电工证实操考试考什么

上海哪里办电工证多少钱 工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这不是个别现象,是很多一线施工人员的真实写照。我认识的周口小伙老王,就是其中之一。他刚来上海打工两年,想考个电工证,但总被工地的活儿拖着走,复习进度一直跟不上。…

2026/11/12 0:54:06

电工证快速办理潮州怎么报名,别再被中介坑了!

电工证快速办理潮州怎么报名,别再被中介坑了! 你是不是正为 电工证快速办理潮州怎么报名 发愁?怕被中介骗钱,又不知道从哪开始?别急,今天我手把手带你搞清楚整个流程,省心又省钱,不再被坑!…

2026/11/12 0:49:04

新手拿什么电工证有用 外省证能转过来吗多少钱

新手拿什么电工证有用 外省证能转过来吗多少钱 之前考的证在外省能不能转过来?这是很多打工人的共同疑问,尤其是像郑州这样的建筑大市,很多电工证是在外地考的,回来之后发现不能直接使用,还得重新报名、考试,既浪费时间又增加成本。那么,…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑