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

}

}

相关推荐
单片机杂货铺25 分钟前
【单片机毕业设计选题】基于单片机的西瓜大棚控制
stm32·单片机·嵌入式硬件·51单片机·硬件工程
西城微科方案开发1 小时前
SIC8P370D2L:高集成低功耗8位通用OTP MCU
单片机·嵌入式硬件
LCG元1 小时前
STM32F103 ADC 多通道 DMA 采集与滤波算法对比:从滑动平均到卡尔曼滤波
stm32·嵌入式硬件·算法
@松2 小时前
STM32F103C8-GPIO—位带操作学习
stm32·嵌入式硬件·学习
鹿屿二向箔2 小时前
keil5.39版本使用AC6编译器不能位域操作的BUG使用STM32U385系列MCU
stm32·单片机·bug
zlinear数据采集卡2 小时前
D223的DDS信号发生器:10000点查找表与4通道16位DAC波形输出
arm开发·嵌入式硬件·fpga开发·开源
捷瑞电子工坊13 小时前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
大爱编程♡14 小时前
GPIO-I2C
stm32·单片机·嵌入式硬件
振南的单片机世界16 小时前
PVD掉电中断——让单片机“咽气前”写完遗书
arm开发·stm32·单片机·嵌入式硬件
续写烂尾18 小时前
SD NAND存储实测:正点原子STM32精英板SDIO读写验证全流程
stm32·单片机·嵌入式硬件