STM32 低功耗-睡眠模式

STM32 睡眠模式


文章目录

  • [STM32 睡眠模式](#STM32 睡眠模式)
  • [第1章 低功耗模式简介](#第1章 低功耗模式简介)
  • [第2章 睡眠模式简介](#第2章 睡眠模式简介)
    • [2.1 进入睡眠模式](#2.1 进入睡眠模式)
    • [2.1 退出睡眠模式](#2.1 退出睡眠模式)
  • [第3章 睡眠模式代码示例](#第3章 睡眠模式代码示例)
  • 总结

第1章 低功耗模式简介

在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止和待机模式。

在系统或电源复位以后,微控制器处于运行状态,当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗。这些低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同。

例如等待某个外部事件时,用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,所以需要根据自身的需要选定一个最佳的低功耗模式。

STM32F1有三种低功耗模式:

1、 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)。

2、 停止模式(所有的时钟都已停止)。

3、 待机模式(1.8V电源关闭)。

各种低功耗模式的对比如下表:

说明:

WFI和WFE都是系统指令,WFI是表示中断,WFE表示事件。

第2章 睡眠模式简介

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

2.1 进入睡眠模式

进入睡眠模式:

通过执行WFI或WFE指令进入睡眠状态。根据Cortex™ M3系统控制寄存器中的SLEEPONEXIT位的值,有两种选项可用于选择睡眠模式进入机制:

1、SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进入睡眠模式。

2、SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。

两种进入睡眠模式的模式 WFI 和 WFE:

WFI(Wait for interrupt)和 WFE(Wait for event)都是内核指令,会调用对应汇编指令,具体描述可以查看**《CM3 权威指南》**。

进入睡眠模式,内核时钟关闭,内核停止,所有外设包括 Cortex M3 核心的外设,如 NVIC、系统时钟(SysTick)等仍在运行,保留睡眠前的寄存器数据、内存数据等。

2.1 退出睡眠模式

退出睡眠模式:

如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。

如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。

如何进入和退出睡眠模式,细节参考如下表:

第3章 睡眠模式代码示例

代码如下:

c 复制代码
main.c

KEYUP_Init();
while(1)
{
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
    {
        LED1 = 0;
        __WFI();/* 进入睡眠模式 */
        LED1 = 1;
    }
}
c 复制代码
void KEYUP_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);       /* 使能复用功能时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);      /* 使能按键端口时钟 */

    /* PA0端口配置 */
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;                 /* WK_UP引脚 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;              /* 下拉输入 */
    GPIO_Init(GPIOA, &GPIO_InitStructure);                     /* 初始化WK_UP按键端口 */

    /* PA0 中断线以及中断初始化配置    WK_UP */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;               
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;    
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                  /* 使能中断线 */
    EXTI_Init(&EXTI_InitStructure);                     

    /* 外部中断0 NVIC 配置 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;         
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
    NVIC_Init(&NVIC_InitStructure);                      
}
c 复制代码
void EXTI0_IRQHandler(void)
{
    delay_ms(20);                      /* 延时消抖 */
    if(EXTI_GetFlagStatus(EXTI_Line0) == SET)
    {
        printf("退出睡眠模式\r\n");
    }
    EXTI_ClearITPendingBit(EXTI_Line0);/* 清除LINE0上的中断标志位 */
}

总结

实验现象:当按键按下后,进入睡眠模式,LED1点亮,PA0所在外部中断触发后退出睡眠模式,LED1熄灭。

睡眠模式相对比较简单些,直接调用一下系统指令__WFI就可以进入睡眠了,退出只需一个任意外部中断即可。

相关推荐
国科安芯11 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
梁朝辉15 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
崇山峻岭之间17 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious17 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng21 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32
wuyk5552 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机