通过查找数据手册,发现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);
}
}