一.三种低功耗模式
STM32L0单片机最核心的三种低功耗模式是睡眠模式 (Sleep)、停止模式 (Stop) 和待机模式 (Standby)。

二.电路设计注意
1.推荐电路:在 PA0 (WKUP1) 和 VDD 之间接一个 10kΩ上拉电阻,并通过一个按键(或控制信号)连接到 GND。按下按键产生清晰的低电平,释放时产生清晰的上升沿。
核心原则:确保关机模式下(GPIO内部电路失效),PA0 引脚有确定的外部电平,绝不允许浮空。
三. 待机模式 代码实现
1.GPIO软件初始化
在 main() 函数或进入低功耗前的初始化代码中,配置 PA0 引脚。
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0; // PA0
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 必须为输入模式
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 内部下拉。若外部已上拉,此项可不设置或设为GPIO_NOPULL
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2.进入待机模式
void Enter_Standby_Mode(void)
{
//使能PWR时钟(部分型号HAL库会自动处理,但显式调用更安全)
__HAL_RCC_PWR_CLK_ENABLE();
//使能WKUP1引脚作为唤醒源
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //PA0
//(可选但建议)清除之前的待机/唤醒标志,避免误判
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除待机标志
// 执行进入待机模式的函数
HAL_PWR_EnterSTANDBYMode();
// 程序在此挂起,等待PA0上升沿唤醒...
}
3.完整逻辑代码
int main(void) {
HAL_Init();
SystemClock_Config(); // 必须重新配置系统时钟
// --- 关键:检查并处理唤醒标志 ---
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {
// 标志置位,表示本次复位是由关机/待机模式唤醒引起的
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 必须手动清除标志位
// 执行"唤醒恢复"初始化(例如:快速初始化部分外设)
Wakeup_From_Shutdown_Init();
} else {
// 标志未置位,表示是常规上电或复位
// 执行完整的系统初始化
System_Full_Init();
}
// ... 后续应用程序代码
while (1)
{
Enter_Standby_Mode(); //进入待机模式,需要PA0按键触发系统会重新初始化
}
}
四 .停止模式代码实现
1.GPIO软件初始化
在 main() 函数或进入低功耗前的初始化代码中,配置 PA0 引脚,配置为外部中断0:
GPIO_InitTypeDef GPIO_InitStruct;
/* Enable GPIOA clock */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure PA.0 as input with External interrupt */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Enable and set PA.0 EXTI Interrupt to the lowest priority */
NVIC_SetPriority((IRQn_Type)(EXTI0_1_IRQn), 0x00);
HAL_NVIC_EnableIRQ((IRQn_Type)(EXTI0_1_IRQn));
2.进入待机模式
static void Enter_Standby_Mode_Sub(void)
{
/* 清除可能存在的旧中断标志 */
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* Configures system clock after wake-up from STOP */
SystemClock_Config();
}
3.外部中断函数
//stop模式低功耗唤醒脚
void EXTI0_1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
Flag_Power = 1;
}
4.完整逻辑代码
int main(void) {
HAL_Init();
SystemClock_Config(); // 必须重新配置系统时钟
// 执行完整的系统初始化
System_Full_Init();
while (1)
{
Enter_Standby_Mode(); //进入待机模式,需要PA0按键中断触发,触发后从进入stop模式的代码处继续执行
}
}