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模式的代码处继续执行

}

}

相关推荐
chao1898441 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
不会武功的火柴2 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
猫猫的小茶馆4 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
feifeigo1234 小时前
STM32矩阵键盘驱动(库函数版)实现
stm32·矩阵·计算机外设
嵌入式小站5 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
czhaii5 小时前
跟我动手学FX系列PLC GX2环境
嵌入式硬件
拾知_H6 小时前
STM32/Delay延时函数编程思路
stm32·单片机·时钟·延时
2zcode7 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz8 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
冉卓电子9 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件