一、低功耗休眠模式
| 模式 | 内核 | 外设时钟 | 功耗 | 唤醒速度 | 唤醒方式 | 唤醒后操作 |
|---|---|---|---|---|---|---|
| Sleep(睡眠) | 停止 | 开启 | 7~14mA | <1us | 任意中断 / 事件 | 继续运行 |
| Stop(停机) | 停止 | 关闭 | 240~320uA | <10us | EXTI 外部中断、RTC、看门狗 | 重配系统时钟 |
| Standby(待机) | 断电 | 全部关掉 | 1.8~4uA | 300~500us | WKUP 引脚、RTC 闹钟、复位、IWDG | 重新初始化 |
二、功能代码实现
1. 睡眠模式 - Sleep
由于睡眠模式可以通过任意中断唤醒,所以在进入睡眠模式前,把非唤醒中断关闭,唤醒后再恢复对应的中断。
c
//进入睡眠模式:任意中断可唤醒
void SYS_enter_sleep_mode(void)
{
//暂停滴答计数
HAL_SuspendTick();// 暂停 SysTick,防止频繁唤醒
// 清除唤醒标记
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 如果使用WK-UP引脚唤醒那么需要使能
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入SLEEP模式
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
//恢复滴答计数器
HAL_ResumeTick();
}
2. 停机模式 - Stop
c
//进入停机模式
void SYS_enter_stop_mode(void)
{
//暂停滴答计数
HAL_SuspendTick();
// 清除唤醒标记
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 如果使用WK-UP引脚唤醒那么需要使能
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入STOP模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后:重新初始化系统时钟
SystemClock_Config();
//恢复滴答计数器
HAL_ResumeTick();
}
3. 待机模式 - Standby
c
//进入待机模式
void SYS_enter_standby_mode(void)
{
// 清除唤醒标记
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 如果使用WK-UP引脚唤醒那么需要使能
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
}