低功耗实验

通过查找数据手册,发现stm32在低功耗模式有以下三种:睡眠模式,停止模式,待机模式。

通过观察表格又可以发现,这三种模式都可以通过WakeUp按键上升沿触发,能耗方面:睡眠>停机>待机。

下面贴上相关代码

lpwr.c
//lpwr.c
#include "lpwr.h"
#include "led.h"
void lpwr_init(void)
{
     GPIO_InitTypeDef  GPIO_InitStructure;
     __HAL_RCC_GPIOA_CLK_ENABLE();
     
     GPIO_InitStructure.Mode=GPIO_MODE_IT_RISING;  //根据手册,待机模式触发是上升沿触发
     GPIO_InitStructure.Pin=GPIO_PIN_0;
     GPIO_InitStructure.Pull=GPIO_PULLUP;   //上拉
     GPIO_InitStructure.Speed=GPIO_SPEED_HIGH;
     
     HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
    
     HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);
     HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
void enter_sleep_mode(void)
{
     HAL_SuspendTick();  //暂停系统时钟(滴答定时器)
     HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //进入睡眠模式
}
void enter_stop_mode(void)
{
   //1.暂停系统时钟
    HAL_SuspendTick();
    //2.开启LED2,表示进入停止模式
    led2_on();
    //3.进入停机模式
    HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
    //4.关闭LED2,表示退出停止模式
    led2_off();
    //5.重新将系统时钟设定为72MHZ
    stm32_clock_init(RCC_PLL_MUL9);
}
void enter_standby_mode(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();  //1.开启电源时钟,(关闭电压调节)
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);  //2.使能WakeUp引脚
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);   //清除唤醒标志,否则一直处于唤醒状态
    HAL_PWR_EnterSTANDBYMode();  //进入待机模式
    
    //测试部分代码,测试是否能进入下面代码
    led2_on();
   
    
}
lpwr.h
#ifndef __LPWR_H__
#define __LPWR_H__

#include "sys.h"

void lpwr_init(void);
void enter_sleep_mode(void);
void enter_stop_mode(void);
void enter_standby_mode(void);

#endif
key.c
#include "key.h"

void key_init(void)
{
    
    __HAL_RCC_GPIOA_CLK_ENABLE();  
   
    GPIO_InitTypeDef   GPIO_InitStructure;
    GPIO_InitStructure.Mode  = GPIO_MODE_INPUT; 
    GPIO_InitStructure.Pin   = KEY_PIN_Close ;
    GPIO_InitStructure.Pull  = GPIO_PULLUP; 
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; 
    
    HAL_GPIO_Init(KEY_PIN_Source, &GPIO_InitStructure);
    
    HAL_GPIO_WritePin(KEY_PIN_Source, KEY_PIN_Open, GPIO_PIN_SET);
    HAL_GPIO_WritePin(KEY_PIN_Source, KEY_PIN_Close, GPIO_PIN_SET);
}

uint8_t key_scanf(void)
{

    
    if( HAL_GPIO_ReadPin(KEY_PIN_Source, KEY_PIN_Close) ==GPIO_PIN_RESET  )  //close 按键被按下
    {
        delay_ms(10);  //消抖
        if( HAL_GPIO_ReadPin(KEY_PIN_Source, KEY_PIN_Close) ==GPIO_PIN_RESET  )  //再次检测close按键被按下
        {  
            while(HAL_GPIO_ReadPin(KEY_PIN_Source, KEY_PIN_Close) ==GPIO_PIN_RESET);
                return KEY_CLOSE_PRESS;
        }
     
    }
     return NO_KEY_PRESS;
}
key.h
#ifndef __KEY_H__
#define __KEY_H__


#define KEY_PIN_Source  GPIOA
#define KEY_PIN_Open    GPIO_PIN_0
#define KEY_PIN_Close   GPIO_PIN_1

#define NO_KEY_PRESS    0
#define KEY_OPEN_PRESS  1
#define KEY_CLOSE_PRESS 2


#include "sys.h"
#include "delay.h"

void key_init(void);

uint8_t key_scanf(void);
 



#endif
main.c
#include "sys.h"
#include "uart1.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "lpwr.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led1_init();
    beep_init();
    key_init();
    lpwr_init();
    uint8_t i=0; 
    while(1)
    { 
     
        if(key_scanf()==KEY_CLOSE_PRESS)
        {
//              enter_sleep_mode();
//              enter_stop_mode();
//              enter_standby_mode();
        }
          if(i%20==0)
                   led1_toggle();  //电平反转
          delay_ms(20);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值