STM32 Sleep mode(睡眠)、stop mode(停止)、Standby mode(待机)实验

本文详细描述了使用STM32F103RBT6开发板进行的三种低功耗模式(Sleep、Stop和Standby)实验,包括代码示例和实验现象,重点展示了在不同模式下电源电流的变化以及LED的控制。
摘要由CSDN通过智能技术生成

1.硬件准备

        实验使用STM32F103RBT6最小系统板,实物与原理图如下图,飞线使用外部3.3V电源连接LDO后端VCC_3V3。

2.低功耗模式说明

3. Sleep mode实验

使用PC13驱动LED D2亮灭提示程序正在运行,PA0外部中断唤醒MCU。

实验代码:

void pwr_key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();    

    gpio_init_struct.Pin = GPIO_PIN_0;             
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;           /* 中断,下降沿 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOA, &gpio_init_struct);  

    HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2); 
    HAL_NVIC_EnableIRQ(EXTI0_IRQn); 
}
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    pwr_key_init();
    MX_GPIO_Init();

    while (1)
    {
        for (uint32_t i = 0; i < 20; i++)
        {
          HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
          HAL_Delay(500);
        }
        HAL_SuspendTick();//防止SysTick中断,触发MCU退出Sleep模式
        HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); 
        HAL_ResumeTick();
    }
}

实验现象:

        上电后LED闪烁10次,然后停止;

        连接PA0到GND一下,LED重新开始闪烁10次,然后停止。

实验结果:

Sleep模式下3.3V电流0mA,有可能是电源电流测量精度不够,如下图:

运行模式下3.3V电流9~10mA,如下图:

4. stop mode实验

使用PC13驱动LED D2亮灭提示程序正在运行,PA0外部中断唤醒MCU。

实验代码:

void pwr_key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();    

    gpio_init_struct.Pin = GPIO_PIN_0;             
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;           /* 中断,下降沿 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOA, &gpio_init_struct);  

    HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2); 
    HAL_NVIC_EnableIRQ(EXTI0_IRQn); 
}
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    pwr_key_init();
    MX_GPIO_Init();

    while (1)
    {
        for (uint32_t i = 0; i < 20; i++)
        {
          HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
          HAL_Delay(500);
        }
        /*
         * 使用Stop mode不必禁用SysTick中断,因为Stop mode中 All 1.8V domain clocks OFF
         * 退出Stop mode后,HSI作为系统时钟,需要重新调用SystemClock_Config()恢复MUC时钟配置
         */
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); 
        SystemClock_Config();
        
    }
}

实验现象:

        上电后LED闪烁10次,然后停止;

        连接PA0到GND一下,LED重新开始闪烁10次,然后停止。

5. standy mode实验

使用PC13驱动LED D2亮灭提示程序正在运行,PA0-WKUP唤醒MCU。

实验代码:

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    while (1)
    {
        for (uint32_t i = 0; i < 20; i++)
        {
          HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
          HAL_Delay(500);
        }

/***********************Standby模式实验***************************************/       
        HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);           /* 设置WKUP用于唤醒 */
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);                  /* 清除Wake_UP标志 */              
        HAL_PWR_EnterSTANDBYMode();                         /* 进入待机模式 */
        
    }
}

 实验现象:

        上电后LED闪烁10次,然后停止;

        连接PA0到3.3V一下,LED重新开始闪烁10次,然后停止。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值