[应用相关] stm32低功耗模式

[复制链接]
486|2
 楼主| Zhiniaocun 发表于 2025-4-17 20:15 | 显示全部楼层 |阅读模式
stm32低功耗模式
stm32有三种低功耗模式——睡眠,停止,待机。

睡眠模式:内核时钟关闭,不影响外设和存储器的运行。

停止模式:内核时钟关闭,关闭内核逻辑电路的所有时钟,关闭时钟系统。

待机模式:内核时钟关闭,关闭内核逻辑电路的所有时钟,关闭时钟系统,关闭电压调节器。

待机模式节能效果最好但是程序会复位,少数条件才能唤醒。

7390868005740d91ef.png

1841868005747b0edd.png


那么相关模式怎么配置呢?其实很简单,首先我们可以将三个模式的唤醒均设为WKUP唤醒,之后再分别对三个模式设置

睡眠模式:
1。直接进入睡眠模式就可以,直接调用HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI)。

停止模式:
1.进入停止模式:HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI)。

2.等待WKUP外部中断唤醒

3.重新设置时钟、重新选择滴答时钟源、失能systick中断。

sys_stm32_clock_init(RCC_PLL_MUL9); /* 重新设置时钟, 72Mhz */

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);

HAL_SuspendTick();

待机模式:
1.使能电源时钟__HAL_RCC_PWR_CLK_ENABLE()。

2.使能WKUP的唤醒功能HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1)。

3.清除唤醒标记WUF__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU)。

4.进入待机模式HAL_PWR_EnterSTANDBYMode()。

附一份正点原子程序代码,能更好的理解

int main(void)
{
    uint8_t key;
    uint8_t t = 0;

    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化 */
    led_init();                             /* 初始化LED */
    key_init();                             /* 初始化按键 */
    pwr_wkup_key_init();                    /* WKUP引脚初始化 */
    pwr_pvd_init();                         /* PVD配置 */

    printf("Enter to LowPower Test \r\n");

    while(1)
    {
        key = key_scan(0);                  /* 得到键值 */

        if (key)
        {
            switch (key)
            {
                /* 进入待机模式 */
                case KEY2_PRES:

                    /* 使能电源时钟 */
                    __HAL_RCC_PWR_CLK_ENABLE();

                    /* 使能WKUP上升沿的唤醒功能 */
                    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

                    /* 清除唤醒标记 */
                    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

                    printf("Enter STANDBY Mode \r\n");

                    HAL_PWR_EnterSTANDBYMode();

                    printf("Exit STANDBY Mode \r\n");

                    break;

                /* 进入停止模式 */
                case KEY1_PRES:

                    LED1(0);        /* 点亮绿灯,提示进入停止模式 */

                    printf("Enter STOP Mode \r\n");
                    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);

                    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 重新设置时钟, 72Mhz */
                    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
                    HAL_SuspendTick();

                    printf("Exit STOP Mode \r\n");

                    LED1(1);
                    break;

                /* 进入睡眠模式 */
                case KEY0_PRES:

                    printf("Enter SLEEP Mode \r\n");
                    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
                    printf("Exit SLEEP Mode \r\n");

                    break;
            }
        }

        if ((t % 20) == 0)
        {
            LED0_TOGGLE();              /* 每200ms,翻转一次LED0 */
        }

        delay_ms(10);
        t++;

    }
}



      LED0_TOGGLE();              /* 每200ms,翻转一次LED0 */
    }

    delay_ms(10);
    t++;

}
}



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2302_77864418/article/details/146921844

xiyaoko2365 发表于 2025-4-30 23:34 | 显示全部楼层
这些模式有助于在不需要高性能时减少系统功耗。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

240

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部