登录/注册

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会继续执行进入睡眠后的代码
    }
}

关键说明:

  1. 硬件连接

    • LED:PC13(低电平点亮,常见开发板配置)
    • 唤醒按键:PA0(接地按键,下降沿触发)
  2. 睡眠模式特性

    • 使用 WFI (Wait For Interrupt) 指令进入睡眠
    • CPU时钟停止,外设仍可运行
    • 唤醒源:外部中断、RTC事件、USB唤醒等
    • 唤醒后从进入睡眠的下一条指令继续执行
  3. 功耗对比

    • 运行模式:约5-20mA(取决于主频)
    • 睡眠模式:约1-3mA(保留SRAM和寄存器)
    • 停止模式:微安级(需更多配置)
  4. 增强建议

    // 进入睡眠前关闭外设时钟可进一步降低功耗
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, DISABLE);
    // 唤醒后需重新使能时钟
  5. 唤醒源扩展

    • RTC闹钟唤醒:配置RTC并启用闹钟中断
    • 串口唤醒:配置USART并启用空闲中断
    • ADC阈值唤醒:配置模拟看门狗

调试技巧:

  1. 使用示波器观察PC13引脚状态
  2. 测量VDD电流验证睡眠功耗
  3. 在唤醒中断服务函数中设置断点
  4. 使用 __WFI() 内联汇编直接调用WFI指令

注意:不同STM32系列配置略有差异,请根据具体型号参考参考手册(RM0008)和库文件。对于HAL库用户,可使用HAL_PWR_EnterSLEEPMode()函数实现类似功能。

基于STM32+微波雷达设计的非接触式睡眠监控系统

本项目开发一种非接触式的睡眠监控系统,该系统利用先进的60GHz毫米波雷达技术和STM32微控制器,实现了对人体在睡眠过程中的存在感知、运动感知

2024-10-12 14:13:12

STM32完整启动流程分析

STM32的完整启动流程分析

2023-10-25 16:00:29

基于STM32开发板点亮LCD例程

网络上配套STM32开发板有很多LCD例程,主要是TFT LCD跟OLED的。从这些例程,大家都能学会如何点亮一个LCD。但这代码都有下面这些问

2023-09-24 11:54:15

STM32的ADC代码例程

STM32的ADC代码例程(普德新星电源技术有限公司怎么样)- STM32的ADC代码

资料下载 vinww特烦恼 2021-09-23 09:53:19

STM32F4 DAC数模转换实验例程

STM32F4 DAC数模转换实验例程(现代电源技术试卷西建大)-STM32F4 DAC数模转换实验

资料下载 佚名 2021-09-16 10:18:15

STM32F4 PWM-DAC实验例程

STM32F4 PWM-DAC实验例程(电源技术是sci吗)-STM32F4 PWM-DAC实验

资料下载 佚名 2021-09-16 10:14:07

STM32F4内部Flash实验例程

STM32F4内部Flash实验例程(嵌入式开发版哪个好)-STM32F4内部Flash实验

资料下载 无人岛 2021-07-30 15:58:01

STM32F4 FLASH字库实验例程

STM32F4 FLASH字库实验例程(嵌入式开发实验仪LED电灯(显示数字)-STM32F4 FLASH字库实验

资料下载 佚名 2021-07-30 15:54:52

如和让STM8S与STM8L安全地进入睡眠状态呢?

:STM32 通过调用“发送事件”指令(在出现标志的地方)来处理该问题,从而防止入睡。AVR 有单独的位用于“睡眠启用”,该位可以在 IRQ 例程

2022-12-08 06:12:41

STM32CUBEIDE(2)----生成简单的例程

使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板。

2022-11-22 10:18:40

移植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的睡眠例程

2022-04-19 15:31:53

介绍STM32低功耗睡眠模式事件唤醒的实现

STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化1. 介绍STM32具有多种低功耗模式,当前以

2022-02-23 06:02:29

STM32F401在睡眠模式下的电流是怎样的

STM32F401在睡眠模式下的电流是怎样的?

2021-10-14 09:24:14
7天热门专题 换一换
相关标签