×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-21 发布时间:
|

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

    }

}


关键字:stm32  rt-thread上  PWR  电源管理 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些