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

}

}

相关推荐
421!4 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
cmpxr_8 小时前
【单片机】STM32的启动流程(Keil)
stm32·单片机·嵌入式硬件
广药门徒8 小时前
嵌入式常用通信协议速率对比及布线要点全解析
单片机·嵌入式硬件
cmpxr_10 小时前
【单片机】RAM和ROM
单片机·嵌入式硬件
信息安全专家11 小时前
sigmastar SSD222D编译问题总结2-dash问题
linux·嵌入式硬件·dash
yong999012 小时前
可自动调整的24V步进电机设计方案
单片机·嵌入式硬件
R6bandito_13 小时前
自实现FLASH读取函数中的隐式类型转换bug踩坑记录
c语言·开发语言·经验分享·stm32·单片机·mcu·bug
Bin Watson13 小时前
STM32 HRTIM 学习心得(3):SVPWM 输出
stm32·单片机·嵌入式硬件
perseverance5214 小时前
MCU串口实现串行flash编程器功能
单片机·flash编程
421!14 小时前
C 语言学习笔记——11(函数指针与指针函数)
c语言·开发语言·笔记·单片机·学习