Low-power modes有三种Sleep mode、Stop mode、Standby mode,实现如下:
void SYSCLKConfig_START(void)
{
ErrorStatus HSEStartUpStatus;
/* 使能 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待 HSE 准备就绪 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 准备就绪 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* 选择 PLL 作为系统时钟源 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待 PLL 被选择为系统时钟源 */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
void sysTick_init(void)
{
/* Configure the SysTick */
SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );
}
void sysTick_Cmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if(ENABLE == NewState)
{
SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;
}
else
{
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
}
void pwr_control(PowerMode NewState)
{
/* Check the parameters */
assert_param(IS_POWERMODE_STATE(NewState));
if(SLEEP == NewState)
{
/* enter Sleep mode */
/* SysTick_Handler() 会自增rt_tick,需要DISABLE。否则无法进入睡眠 */
sysTick_Cmd(DISABLE);
__WFI();
/* exit Sleep mode */
/* 单纯使用sysTick_Cmd(ENABLE)不能正常,rt_thread_delay()也会有影响 */
sysTick_init();
}
else if(STOP == NewState)
{
/* enter Stop mode */
sysTick_Cmd(DISABLE);
PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
/* exit Sleep mode */
/* HSE和HSI已关闭需重启开启 */
sysTick_init();
SYSCLKConfig_START();
}
else
{
/* 使能电源管理单元的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
/* ALARM唤醒后不被置为SET */
if(SET == PWR_GetFlagStatus(PWR_FLAG_WU))
{
PWR_ClearFlag(PWR_FLAG_WU);
}
/* Standby mode */
PWR_EnterSTANDBYMode();
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』