stm32在rt-thread上的PWR(电源管理)

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();
    }
}

你可能感兴趣的:(RT-thread,STM32)