MSI时钟,Multispeed internal RC oscillator,多频率内部RC振荡器,能够提供12种频率,Datasheet和RM种有详细说明,在CubeMx种配置如图1所示:

本文主要是测试四种低功耗模式,唤醒有WFI(中断唤醒)和WFE(事件唤醒),本文预使用按键中断,Reset引脚或者设置按键为专用的唤醒引脚用来唤醒低功耗状态。
在CubeMx种配置好时钟和引脚,首先测试Sleep模式,引脚配置如2所示:

使用PA5 LED作为反馈显示,使用key中断作为唤醒中断(WFI)引脚,主程序代码如下所示:
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
Sleep_Mode ();
/*Sleep mode*/
void Sleep_Mode(void)
{
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode (PWR_MAINREGULATOR_ON ,PWR_SLEEPENTRY_WFI );
HAL_ResumeTick ();
}
LED闪烁三下,进入Sleep模式,按下按键唤醒,效果如图3所示:

在进入低功耗模式后,是无法使用debug的,唤醒后再debug是可以的。
Stop 模式设置函数如下:
/*Stop mode*/
void Stop_Mode(void)
{
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode (PWR_MAINREGULATOR_ON ,PWR_STOPENTRY_WFI );
//唤醒后需要重新配置RCC时钟
SystemClock_Config();
HAL_ResumeTick ();
}
Standby和Shutdown模式,将key引脚设置为唤醒引脚,如图4所示:

两种模式的执行函数如下:
/*standby mode*/
void Enter_Standby(void)
{
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2 );
__HAL_PWR_CLEAR_FLAG (PWR_FLAG_WU);
HAL_PWR_EnterSTANDBYMode ();
}
/*shutdown mode*/
void Enter_Shutdown(void)
{
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_LOW );
__HAL_PWR_CLEAR_FLAG (PWR_FLAG_WU );
HAL_PWR_EnterSHUTDOWNMode ();
}
实际测试过程中,手接近按键或Reset按键的时候就唤醒了,对外部干扰的影响,还需要继续测试。
相信每种低功耗模式都有优秀的表现~~~~~~~~~~
嗯,超低功耗在电池供电设备中还是很重要的