1.1 STM32待机模式简介
STM32单片机具有低功耗模式,包括睡眠、停止和待机三种。
运行状态下,HCLK为CPU提供时钟。HCLK由AHB预分频器分频后直接输出得到。
低功耗模式选择需考虑电源消耗、启动时间和唤醒源。
睡眠模式停CPU不停外设时钟;
停止模式停所有时钟;
待机模式关闭1.8V内核电源。留备份电路和待机电路供电。
- 睡眠模式
- 进入:WFI/WFE
- 唤醒:任一中断/事件
- 时钟:CPU时钟关,其他不受影响
- 电压调节器:开
- 停机模式
- 进入:PDDS+LPDS+SLEEPDEEP+WFI/WFE
- 唤醒:外部中断
- 时钟:1.8V区域时钟关,HSI/HSE振荡器关
- 电压调节器:无(关闭状态)
- 待机模式
- 进入:PDDS+SLEEPDEEP+WFI/WFE
- 唤醒:WKUP引脚、RTC警告、NRST复位、IWDG复位
- 时钟:1.8V区域时钟关,HSI/HSE振荡器关
- 电压调节器:关
低功耗模式下,电源控制寄存器PWR_CR可设置开/关
STM32 低功耗一览表
待机模式功耗最低,仅需约2uA电流;
停机模式次之,典型消耗约20uA;
睡眠模式功耗相对较高。
用户可根据需求选择适合的低功耗模式。
STM32待机模式是最低功耗模式,关闭电压调节器,1.8V供电区断电,PLL、HSI、HSE振荡器停止,SRAM和寄存器内容不保,仅备份寄存器和待机电路保持供电。
待机模式流程
可通过外部复位、独立看门狗复位、WKUP引脚上升沿或RTC闹钟事件退出待机。
唤醒后,除PWR_CSR外所有寄存器复位,执行流程与复位后相同。
PWR_CSR指示由待机状态退出。
待机时,仅复位、TAMPER(特定配置下)及使能的WK_UP引脚有效,其余IO引脚高阻。
进入待机模式涉及到电源控制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。
可通过设置电源控制寄存器PWR_CR的PDDS位,使CPU进入深度睡眠时进待机模式。
同时可通过 CWUF位,清除之前的唤醒位。
电源控制寄存器PWR_CR
1.2 待机模式配置
1)使能电源时钟:
cpp
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
2)设置 WK_UP 引脚作为唤醒源:
cpp
PWR_WakeUpPinCmd(ENABLE);
3)进入待机模式:
设置 SLEEPDEEP 位。
设置 PDDS 位。
执行 WFI 指令。
cpp
void PWR_EnterSTANDBYMode(void) {
// 设置 SLEEPDEEP 位(SCB->SCR 的第 2 位)
SCB->SCR |= SCB_SCR_SLEEPDEEP;
// 设置 PDDS 位(进入深度睡眠时进入待机模式)
PWR->CR |= PWR_CR_PDDS;
// 执行 WFI 指令进入待机模式
__WFI();
}
4)编写 WK_UP 中断函数:
实现开机与进入待机模式的逻辑。
长按 WK_UP 按键(PA0)开机,DS0 闪烁指示程序运行。
再次长按则进入待机模式,DS0 关闭。
cpp
void EXTI0_IRQHandler(void) {
static uint32_t press_time = 0;
static uint8_t is_running = 0;
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 检测按键按下时间
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {
press_time++;
} else {
if (press_time > 300) { // 假设 3 秒为长按
if (is_running) {
// 进入待机模式
PWR_EnterSTANDBYMode();
} else {
// 开机,DS0 闪烁指示程序运行
is_running = 1;
while (1) {
GPIO_ToggleBits(GPIOD, GPIO_Pin_0);
for (volatile int i = 0; i < 1000000; i++);
}
}
}
press_time = 0;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}