stm32单片机低功耗模式共有3种,下来对3种低功耗进行分析测试。
先看手册上相关低功耗资料介绍:

先来分析睡眠模式:


进入睡眠模式比较简单,只需一条指令即可。唤醒睡眠模式,我们使用串口中断来唤醒,通过对串口发送数据。利用串口RXD引脚来唤醒睡眠模式,代码如下:

//进入睡眠模式 任意中断唤醒  WKUP不能唤醒
void sleep_mode_wfi(void)
{__WFI();                                                   //WFI指令进入睡眠
}
//进入睡眠模式 唤醒事件唤醒  WKUP 不能唤醒
void sleep_mode_wfe(void)
{__WFE();
}

通过调用这两个函数就可以直接进入睡眠模式,给串口发送数据可以退出睡眠模式。睡眠模式退出后,程序会从进入睡眠模式的下一行代码继续执行。相当于程序被暂停了。
下来看停止模式:


停止模式通过调用库函数PWR_EnterSTOPMode(),可进入停止模式,停止模式唤醒需要用外部中断,将串口的RXT引脚设置为外部中断,上升沿触发,这样当串口接收到数据时,就会触发RXD引脚的外部中断。这样可通过串口直接唤醒停止模式。相关代码如下:

void EXIT_UART_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line10;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line10) != RESET){EXTI_ClearITPendingBit(EXTI_Line10);__set_FAULTMASK(1);     //关闭所有中断NVIC_SystemReset();  //系统复位}}//进入停止模式   任意外部中断唤醒  WKUP不能唤醒
void enter_stop_mode(void)
{EXIT_UART_Init();                                          //RX引脚配置为外部中断RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //开电源管理时钟PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);        //进入停机模式
}

进入停止模式后,所有IO口保持为当前状态。当退出停止模式后,HSI RC振荡器会被选为系统时钟,而开发版用的是外部时钟,需要重新设置系统时钟。为了避免重新设置时钟的麻烦,在中断程序中,直接执行系统软件复位命令。直接对系统重新进行复位。如果在实际项目中需要外部IO口状态保持不变,就不能用系统复位命令,需要自己重新配置系统时钟和其他外设的时钟。

下来看待机模式:


进入待机模式后系统功耗最低,外部IO口都会处于高阻状态。退出待机模式后,系统会重新初始化,相当于按下了复位按键。相关代码如下:

void Sys_Standby(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //使能PWR外设时钟PWR_WakeUpPinCmd(ENABLE);                                    //使能唤醒管脚功能  WKUPPWR_EnterSTANDBYMode();                                     //进入待机(standby)模式
}//系统进入待机模式   WKUP引脚上升沿、RTC脑子、NRST复位、IWDG复位 唤醒  中断不能唤醒
void Sys_Enter_Standby(void)
{RCC_APB2PeriphResetCmd(0X01FC, DISABLE);                   //复位所有IO口,屏蔽这条语句也没有看到什么影响Sys_Standby();
}

为了方便测试,用了WKUP唤醒。进入低功耗模式后,按下WKUP按键,系统会被唤醒,唤醒后系统复位,程序重新开始执行。
主函数测试代码如下:

int main(void)
{u8 i = 0, j = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init();                                             //延时函数初始化LED_Init();                                                //初始化与LED连接的硬件接口KEY_Init();uart_init(9600);LED = 1;delay_ms(500);printf("low power test! \r\n\r\n");while(1){i =  KEY_Scan(1);switch(i){case 0:break;case 1:printf("进入停机模式\r\n\r\n");enter_stop_mode();                                   //唤醒后从程序开始位置执行printf("退出停机模式\r\n\r\n");                   //执行不到这块break;case 2:printf("进入待机模式\r\n\r\n");                Sys_Enter_Standby();                                //唤醒后从程序开始位置执行printf("退出待机模式\r\n\r\n");                       //执行不到这块break;case 3:printf("进入睡眠模式 中断唤醒 \r\n\r\n");sleep_mode_wfi();                                 //唤醒后接着下一条语句执行printf("退出睡眠模式 中断唤醒 \r\n\r\n");             //唤醒后执行当前语句break;case 4:printf("进入睡眠模式 事件唤醒 \r\n\r\n");sleep_mode_wfe();                                  //唤醒后接着下一条语句执行printf("退出睡眠模式 事件唤醒 \r\n\r\n");             //唤醒后执行当前语句break;}j++;if(j > 5){j = 0;LED = !LED;}delay_ms(10);}
}

通过LED闪烁指示程序执行状态,进入低功耗模式后,LED灯停止闪烁。退出低功耗模式后,LED灯继续闪烁,用串口输出相关信息,便于观察。

STM32低功耗模式测试相关推荐

  1. STM32低功耗模式与烟雾报警器触发信号电路设计

    STM32低功耗模式与烟雾报警器触发信号电路设计 https://www.cnblogs.com/kanite/p/5352642.html 1.STM32的3种低功耗模式 STM32有3种低功耗模式 ...

  2. STM32低功耗模式下GPIO如何配置最节能?

    目录 1.将未使用的GPIO 配置为模拟输入模式 2.调节GPIO 速度 3.GPIO不使用时禁用寄存器时钟 4.避免悬空未使用的引脚 STM32低功耗模式下GPIO如何配置最节能,这里总结了一下四点 ...

  3. STM32低功耗模式解读

    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单. 一.STM32芯片性能 使用芯片型号:stm32f030f4, ...

  4. STM32低功耗模式

    STM32 的低功耗模式有 3种: 1)睡眠模式(CM3内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机(standby)模式(1.8V内核电源关闭) 从待机模式唤醒后的代码执行等同 ...

  5. stm32低功耗模式下mcu的实际功耗(ST芯片手册)

    STM32F103xC. STM32F103xD和STM32F103xE增强型产品支持三种低功耗模式,可以在要求低 功耗.短启动时间和多种唤醒事件之间达到最佳的平衡. ● 睡眠模式 在睡眠模式,只有C ...

  6. FreeRTOS 低功耗模式设计 STM32平台

    1. STM32F105RBT6 的三种低功耗模式 1.1 sleep睡眠模式.stop停机模式.standby 待机模式 1.2 STM32中文参考手册有介绍STM32 低功耗模式的介绍 2. Fr ...

  7. 【STM32】HAL库-电源控制(低功耗模式)

    电源框图 STM32 的电源系统主要分为备份域电路.内核电路以及 ADC 电路三部分 备份域电路 STM32 的 LSE 振荡器.RTC.备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部 ...

  8. STM32睡眠模式低功耗(停止模式)

    目前stm32已经非常流行了,那么本文讨论下stm32低功耗模式,不多说先上手册内容! 这是英文文档 不好看懂是吧,下面看中文文档! 我对比了 STM32F0 和 STM32F1 两者进入低功耗是一样 ...

  9. STM32停止模式唤醒不恢复时钟的后果

    关于STM32的低功耗详细解析请在 STM32低功耗模式解读中查看,在里面讲到当STM32在停止模式时,芯片1.8V区域时钟别关闭,HSI,HSE时钟也被关闭,当某个使能的中断或事件发生后,STM32 ...

最新文章

  1. 曲苑杂坛--收缩数据库文件
  2. c语言 swap交换函数_C语言经典100题(14)
  3. LeetCode-数组-704. 二分查找
  4. MySQL对于表中数据的增删改查
  5. soap和web services
  6. Java Web学习总结(26)——Servlet不同版本之间的区别
  7. vs不想运行某个项目_Creo二次开发--项目搭建
  8. 日志查看_实时查看容器日志
  9. phpmyadmin的config-default-php文件中各个配置参数的详细说明
  10. [Bzoj2120]数颜色
  11. PLC编程过程中需要注意的事项
  12. WPS ppt添加幻灯片编号无反应
  13. 【科研人应该知道的网站】查阅文献+学习+代码+开发+其他——研究生必备学习网站,研究生应该知道的学习网站
  14. keepalived IP漂移技术
  15. php属相对应年份博客,十二生肖对应年份表
  16. JDK源码解析---Short
  17. android 背景 投影,Android ImageView投影
  18. 通过伴随矩阵怎么求逆矩阵
  19. Redis的初步使用教程
  20. ubuntu 8.04 中文输入法 中文撑持

热门文章

  1. JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)
  2. IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑
  3. Jquery操作对控件的取值、赋值
  4. Delphi 两种类的声明方法
  5. 字符设备驱动程序之poll机制(韦大仙)
  6. 阅读bulid to win感想
  7. DevExpress学习笔记之如何获取Repository Item的值
  8. Qt信号槽中槽函数为虚函数的一些感想
  9. 研磨设计模式之 工厂方法模式-3
  10. SQL2005迁移账户密码粗鲁设置