STM32L0单片机低功耗用法

一.三种低功耗模式

STM32L0单片机最核心的三种低功耗模式是睡眠模式 (Sleep)、停止模式 (Stop) 和待机模式 (Standby)。

二.电路设计注意

1.推荐电路:在 PA0 (WKUP1) 和 VDD 之间接一个 10kΩ上拉电阻,并通过一个按键(或控制信号)连接到 GND。按下按键产生清晰的低电平,释放时产生清晰的上升沿。

核心原则:确保关机模式下(GPIO内部电路失效),PA0 引脚有确定的外部电平,绝不允许浮空。

三. 待机模式 代码实现

1.GPIO软件初始化

在 main() 函数或进入低功耗前的初始化代码中,配置 PA0 引脚。

// 使能GPIOA时钟

__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct = {0};

GPIO_InitStruct.Pin = GPIO_PIN_0; // PA0

GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 必须为输入模式

GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 内部下拉。若外部已上拉,此项可不设置或设为GPIO_NOPULL

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

2.进入待机模式

void Enter_Standby_Mode(void)

{

//使能PWR时钟(部分型号HAL库会自动处理,但显式调用更安全)

__HAL_RCC_PWR_CLK_ENABLE();

//使能WKUP1引脚作为唤醒源

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //PA0

//(可选但建议)清除之前的待机/唤醒标志,避免误判

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除待机标志

// 执行进入待机模式的函数

HAL_PWR_EnterSTANDBYMode();

// 程序在此挂起,等待PA0上升沿唤醒...

}

3.完整逻辑代码

int main(void) {

HAL_Init();

SystemClock_Config(); // 必须重新配置系统时钟

// --- 关键:检查并处理唤醒标志 ---

if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {

// 标志置位,表示本次复位是由关机/待机模式唤醒引起的

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 必须手动清除标志位

// 执行"唤醒恢复"初始化(例如:快速初始化部分外设)

Wakeup_From_Shutdown_Init();

} else {

// 标志未置位,表示是常规上电或复位

// 执行完整的系统初始化

System_Full_Init();

}

// ... 后续应用程序代码

while (1)

{

Enter_Standby_Mode(); //进入待机模式,需要PA0按键触发系统会重新初始化

}

}

.停止模式代码实现

1.GPIO软件初始化

在 main() 函数或进入低功耗前的初始化代码中,配置 PA0 引脚,配置为外部中断0:

GPIO_InitTypeDef GPIO_InitStruct;

/* Enable GPIOA clock */

__HAL_RCC_GPIOA_CLK_ENABLE();

/* Configure PA.0 as input with External interrupt */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Pull = GPIO_PULLUP;

GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* Enable and set PA.0 EXTI Interrupt to the lowest priority */

NVIC_SetPriority((IRQn_Type)(EXTI0_1_IRQn), 0x00);

HAL_NVIC_EnableIRQ((IRQn_Type)(EXTI0_1_IRQn));

2.进入待机模式

static void Enter_Standby_Mode_Sub(void)

{

/* 清除可能存在的旧中断标志 */

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);

/* Enable Power Control clock */

__HAL_RCC_PWR_CLK_ENABLE();

/* Enter Stop Mode */

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

/* Configures system clock after wake-up from STOP */

SystemClock_Config();

}

3.外部中断函数

//stop模式低功耗唤醒脚

void EXTI0_1_IRQHandler(void)

{

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

Flag_Power = 1;

}

4.完整逻辑代码

int main(void) {

HAL_Init();

SystemClock_Config(); // 必须重新配置系统时钟

// 执行完整的系统初始化

System_Full_Init();

while (1)

{

Enter_Standby_Mode(); //进入待机模式,需要PA0按键中断触发,触发后从进入stop模式的代码处继续执行

}

}

相关推荐
LCG元2 小时前
以太网通信实战:STM32F407+LAN8720A+LwIP,TCP/IP协议栈应用
stm32·嵌入式硬件·tcp/ip
笨笨没好名字2 小时前
# 单片机入门:51单片机与开发板介绍
单片机·嵌入式硬件·51单片机
我在人间贩卖青春2 小时前
认识MCU
单片机·嵌入式硬件
WYH2873 小时前
STM32无感无刷电调实现方法
stm32·单片机·嵌入式硬件
风痕天际3 小时前
ESP32-S3开发教程9:扣子智能体快速搭建与API调用例程使用讲解
单片机·esp32-s3·esp-idf·智能体·扣子
三佛科技-134163842124 小时前
HN15N10DA_TO-252封装100V 15A 增强MOSFET场效应管详细分析(HN15N10DA在小家电的应用)
嵌入式硬件·物联网·智能家居·pcb工艺
逐步前行4 小时前
STM32_时钟树
stm32·单片机·嵌入式硬件
lljss20204 小时前
ADC通道切换在GD32和PY32(STM32)区别
stm32·单片机·嵌入式硬件
森利威尔电子-4 小时前
5V到100V+通吃!森利威尔SL4008B升压芯片,电源设计的“万能钥匙”
嵌入式硬件·集成电路·芯片·电源芯片