关于 low-power-embedded
面向嵌入式开发 Agent 的低功耗固件指导,涵盖 MCU 睡眠模式、唤醒源、时钟门控和电流测量,并提供 STM32 相关实践。
主要功能
- 01比较 Sleep、Stop 和 Standby 模式
- 02配置 Cortex-M 的 WFI/WFE 睡眠
- 03设置 EXTI、RTC 等唤醒源
- 04检查外设时钟与低功耗状态
- 05测量电流并排查唤醒问题
适用场景
- 01为电池供电固件降低功耗
- 02权衡唤醒延迟与电流消耗
- 03排查睡眠后无法唤醒的问题
- 04在发布前检查 RTOS 空闲睡眠
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill low-power-embedded安装后在 Claude Code 中输入/low-power-embedded确认已加载。
详细介绍
低功耗嵌入式系统
用途
指导 Agent 使用 MCU 低功耗模式:休眠与深度休眠(停止/待机)、外设和总线时钟门控、唤醒源配置以及实用的电流测量,并提供 Cortex-M WFI/WFE 和厂商 PWR 示例(以 STM32 为主的模式也适用于其他平台)。
适用场景
- 电池供电固件未达到功耗预算
- 权衡唤醒延迟与功耗
- 调试“设备无法唤醒”或“休眠时电流仍有数 mA”
- 发布 RTOS 空闲钩子或裸机主循环休眠前
- 与
skills/baremetal/interrupts-and-exceptions-baremetal交叉引用
工作流
1. 电源模式层级(STM32 风格)
| 模式 | CPU | 外设 | RAM | 唤醒源 | 相对电流 |
|---|---|---|---|---|---|
| 运行 | 开 | 开 | 开 | — | 最高 |
| 休眠 | 关 | 开 | 开 | 任意 IRQ | 中等 |
| 停止 | 关 | 大多数关闭 | 开 | EXTI、RTC、UART | 低 |
| 待机 | 关 | 关 | 丢失* | WKUP 引脚、RTC | 最低 |
* 待机会清除大部分 SRAM;状态请存入备份域或外部 EEPROM。
2. 进入休眠(WFI)
/* Cortex-M — sleep until interrupt */
__disable_irq();
/* configure wake source (e.g. EXTI, RTC alarm) */
__enable_irq();
__WFI(); /* or __WFE() for event-based wake */
在执行 WFI 前,确保已清除待处理中断,否则可能立即唤醒。
3. STM32 停止模式模式
#include "stm32f4xx.h"
void enter_stop_mode(void)
{
/* Gate clocks you do not need */
RCC->AHB1ENR &= ~RCC_AHB1ENR_GPIOAEN; /* example — only if safe */
PWR->CR |= PWR_CR_CWUF; /* clear wake flags */
PWR->CR |= PWR_CR_PDDS; /* deep sleep = Stop */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI();
/* After wake: re-enable HSE/PLL — clocks lost in Stop on many parts */
SystemInit();
}
退出停止模式后,重新初始化寄存器已丢失的时钟和外设。
4. 时钟门控检查清单
Before sleep
├── Disable unused peripheral clocks (RCC xENR)
├── Disable ADC/DAC continuous modes
├── Stop DMA channels
├── Enter peripheral low-power (UART mute, SPI off)
└── Configure lowest viable regulator scale (Voltage Scale 2/3)
5. 唤醒源
| 来源 | 配置 |
|---|---|
| EXTI GPIO | SYSCFG + EXTI IMR,边沿触发 |
| RTC 闹钟 | RTC WUT/WAKEUP |
| UART | 起始位检测(部分 MCU) |
| IWDG | 不是唤醒源——会复位设备 |
6. 测量技巧
- 将电流表串联到 VDDA/VDD;使用较短的采样窗口测量 uA
- 使用 DWT 周期计数器对唤醒延迟进行基准测试
- 记录并确保运行与休眠电流的对比采用相同的时钟树
7. RTOS 说明
FreeRTOS 的 configUSE_TICKLESS_IDLE 会映射到 WFI/停止模式——请与 skills/embedded/freertos 协调。
8. Agent 用法
/low-power-embedded Configure STM32 Stop mode with EXTI0 wake and PLL restore
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
| “休眠”时电流仍有数 mA | 调试接口(SWD)仍处于活动状态 | 断开调试器;禁用 DBGMCU |
| 执行 WFI 后立即唤醒 | NVIC IRQ 仍待处理 | 执行 WFI 前清除标志 |
| 唤醒后状态丢失 | 进入了待机模式,而非停止模式 | 若 RAM 必须保留,请使用停止模式 |
| 唤醒后 UART 无法工作 | 时钟树未恢复 | 调用 SystemInit() 路径 |
| 电流高于数据手册标示的 uA | GPIO 悬空 | 将未使用的引脚设为模拟模式或配置上拉 |
相关技能
skills/baremetal/interrupts-and-exceptions-baremetal— EXTI 唤醒 IRQskills/baremetal/gpio-baremetal— 用于控制漏电的引脚模式skills/baremetal/stm32-baremetal— RCC 和 PWR 寄存器skills/baremetal/timers-pwm-baremetal— 休眠前停止定时器skills/embedded/freertos— Tickless 空闲集成
评论
支持 Markdown