stm32低功耗模式

stm32有三种低功耗模式——睡眠,停止,待机。

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

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

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

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

在这里插入图片描述
在这里插入图片描述

那么相关模式怎么配置呢?其实很简单,首先我们可以将三个模式的唤醒均设为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++;

}

}


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐