STM32 睡眠完整例程
STM32 睡眠完整例程
以下是一个基于STM32标准外设库的完整睡眠模式例程(以STM32F103为例),包含按键唤醒功能,代码已添加详细注释:
#include "stm32f10x.h"
// 函数声明
void SleepMode_Enter(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
// 初始化系统时钟(使用默认HSI 8MHz)
SystemInit();
// 配置GPIO(LED指示灯和唤醒按键)
GPIO_Configuration();
// 配置外部中断
EXTI_Configuration();
// 配置NVIC中断控制器
NVIC_Configuration();
// 点亮LED表示系统启动
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮PC13 LED(低电平点亮)
while(1)
{
// 进入睡眠模式(等待中断唤醒)
SleepMode_Enter();
// 唤醒后执行的操作
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮LED
// 简单延时(模拟任务执行)
for(volatile uint32_t i=0; i<1000000; i++);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭LED
}
}
/**
* @brief 配置GPIO:PC13为LED,PA0为唤醒按键
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
// 配置PC13为推挽输出(开发板常见LED引脚)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置PA0为浮空输入(按键唤醒引脚)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @brief 配置外部中断(PA0按键)
*/
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
// 连接PA0到EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
// 配置EXTI0下降沿触发(按键按下)
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/**
* @brief 配置NVIC中断优先级
*/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置EXTI0中断优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 进入睡眠模式函数
*/
void SleepMode_Enter(void)
{
// 1. 清除唤醒标志
PWR_ClearFlag(PWR_FLAG_WU);
// 2. 请求进入睡眠模式(使用WFI指令)
PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI);
// 执行WFI后MCU在此处暂停,直到外部中断唤醒
}
/**
* @brief EXTI0中断服务函数(PA0按键唤醒)
*/
void EXTI0_IRQHandler(void)
{
// 检查中断标志
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// 清除中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
// 唤醒后不需要特殊操作,MCU会继续执行进入睡眠后的代码
}
}
关键说明:
-
硬件连接:
- LED:PC13(低电平点亮,常见开发板配置)
- 唤醒按键:PA0(接地按键,下降沿触发)
-
睡眠模式特性:
- 使用
WFI(Wait For Interrupt) 指令进入睡眠 - CPU时钟停止,外设仍可运行
- 唤醒源:外部中断、RTC事件、USB唤醒等
- 唤醒后从进入睡眠的下一条指令继续执行
- 使用
-
功耗对比:
- 运行模式:约5-20mA(取决于主频)
- 睡眠模式:约1-3mA(保留SRAM和寄存器)
- 停止模式:微安级(需更多配置)
-
增强建议:
// 进入睡眠前关闭外设时钟可进一步降低功耗 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, DISABLE); // 唤醒后需重新使能时钟 -
唤醒源扩展:
- RTC闹钟唤醒:配置RTC并启用闹钟中断
- 串口唤醒:配置USART并启用空闲中断
- ADC阈值唤醒:配置模拟看门狗
调试技巧:
- 使用示波器观察PC13引脚状态
- 测量VDD电流验证睡眠功耗
- 在唤醒中断服务函数中设置断点
- 使用
__WFI()内联汇编直接调用WFI指令
注意:不同STM32系列配置略有差异,请根据具体型号参考参考手册(RM0008)和库文件。对于HAL库用户,可使用
HAL_PWR_EnterSLEEPMode()函数实现类似功能。
基于STM32+微波雷达设计的非接触式睡眠监控系统
本项目开发一种非接触式的睡眠监控系统,该系统利用先进的60GHz毫米波雷达技术和STM32微控制器,实现了对人体在睡眠过程中的存在感知、运动感知
2024-10-12 14:13:12
基于STM32开发板点亮LCD例程
网络上配套STM32开发板有很多LCD例程,主要是TFT LCD跟OLED的。从这些例程,大家都能学会如何点亮一个LCD。但这代码都有下面这些问
2023-09-24 11:54:15
STM32F4 FLASH字库实验例程
STM32F4 FLASH字库实验例程(嵌入式开发实验仪LED电灯(显示数字)-STM32F4 FLASH字库实验
资料下载
佚名
2021-07-30 15:54:52
如和让STM8S与STM8L安全地进入睡眠状态呢?
:STM32 通过调用“发送事件”指令(在出现标志的地方)来处理该问题,从而防止入睡。AVR 有单独的位用于“睡眠启用”,该位可以在 IRQ 例程
移植RT-Thread到STM32开发板的详细步骤例程
本章开始,先新建一个基于野火STM32全系列(包含M3/4/7)开发板的的RT-Thread的工程模板,让RT-Thread先跑起来。以后所有的RT- Thread相关的例程我们都在此模板上修改
2022-05-18 09:14:54
STM32使用教程 基于STM32F103RBT6的例程 STM32控制OLED例程
STM32使用教程 提供基于STM32F103RBT6的例程 硬件连接 我们提供的例程
2022-05-05 19:44:07
CS32G020的PD协议进入深度睡眠模式2后,只有在放电时能唤醒,而在充电时唤醒不了是什么原因?我参考的是V1.7的睡眠例程
CS32G020的PD协议进入深度睡眠模式2后,只有在放电时能唤醒,而在充电时唤醒不了是什么原因?我参考的是V1.7的睡眠例程
介绍STM32低功耗睡眠模式事件唤醒的实现
STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化1. 介绍STM32具有多种低功耗模式,当前以
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览