(24)STM32——待机唤醒(低功耗)笔记
目录
学习目标
运行结果
待机唤醒
模式
待机模式
寄存器
配置
代码
总结
学习目标
本节我们讲解的是有关待机唤醒的知识,这部分知识在51中并未涉及到,我感觉还是有点意思的,有点类似与我们手机的锁屏功能和关机功能,只是选择了不同的低功耗模式。好了,接下来我们就来介绍一下待机唤醒的相关知识吧!
运行结果
待机唤醒1
待机唤醒2
待机唤醒
在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行 时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。
模式
- 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
- 停止模式:所有时钟都已停止。1.8V内核电源工作。PLL,HIS和HSE RC振荡器功能禁止。寄存器和SRAM内容保留。
- 待机模式:1.8V内核电源关闭。只有备份寄存器和待机电路维持供电。寄存器和SRAM内容全部丢失。实现最低功耗。
在运行模式下,可以通过下面方式降低功耗:
1、降低系统时钟。
2、关闭APB和AHB总线上未被使用的外设时钟。
这三种模式的功耗是逐渐降低的,特别是待机模式,功耗特别低,最低只需要 2.2uA 左右的电流。停机模式是次低功耗的,其典型的电流消耗在 350uA 左右。最后就是睡眠模式了。根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式。
待机模式
F407的待机模式可实现 STM32F4 的最低功耗。该模式是在 CM4 深睡眠模式时关闭电压调节器。整个 1.2V 供电区域被断电。PLL、 HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。除备份域(RTC 寄存器、RTC 备份 寄存器和备份 SRAM)和待机电路中的寄存器外,SRAM 和寄存器内容都将丢失。而且有一个重要的点就是F407需要清零对应的RTC标志。
寄存器
还是一样,不做详细介绍。
配置
我们前面说了F407需要清除相应的标志位才能开启待机模式。
- 禁止 RTC 中断(ALRAIE、ALRBIE、WUTIE、TAMPIE 和 TSIE 等)。
- 清零对应中断标志位。
- 清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。
- 重新使能 RTC 对应中断。
- 进入低功耗模式。
1、使能电源时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能 PWR 外设时钟
2、设置 WK_UP 引脚作为唤醒源。
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
3、设置 SLEEPDEEP 位,设置 PDDS 位,执行 WFI 指令,进入待机模式。
PWR_EnterSTANDBYMode(void);
4、最后编写 WK_UP 中断函数。
代码
实验一的代码。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //初始化延时函数uart_init(115200); //初始化串口波特率为115200LED_Init(); //初始化LED KEY_Init();LED0 = 0;while(1){if(KEY_Scan(0) == KEY0_PRES){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE );PWR_BackupAccessCmd(ENABLE);//后备区域访问使能//这里我们就直接关闭相关RTC中断RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。PWR_WakeUpPinCmd(ENABLE ); PWR_ClearFlag(PWR_FLAG_WU); PWR_EnterSTANDBYMode();}}
}
实验二的代码。
#include "wkup.h"
#include "led.h"
#include "delay.h"
#include "usart.h" //系统进入待机模式
void Sys_Enter_Standby(void)
{ while(WKUP_KD); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟 PWR_BackupAccessCmd(ENABLE);//后备区域访问使能//这里我们就直接关闭相关RTC中断RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒PWR_EnterSTANDBYMode(); //进入待机模式}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
// 0:错误的触发
u8 Check_WKUP(void)
{u8 t=0;u8 tx=0;//记录松开的次数LED0=0; //亮灯DS0 while(1){if(WKUP_KD)//已经按下了{t++;tx=0;}else {tx++; if(tx>3)//超过90ms内没有WKUP信号{LED0=1;return 0;//错误的按键,按下次数不够}}delay_ms(30);if(t>=100)//按下超过3秒钟{LED0=0; //点亮DS0 return 1; //按下3s以上了}}
}
//中断,检测到PA0脚的一个上升沿.
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{ EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位if(Check_WKUP())//关机?{ Sys_Enter_Standby(); //进入待机模式 }
} //PA0 WKUP唤醒初始化
void WKUP_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 //(检查是否是正常开)机 if(Check_WKUP()==0){Sys_Enter_Standby(); //不是开机,进入待机模式 }SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道NVIC_Init(&NVIC_InitStructure);//配置NVIC}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "wkup.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //初始化延时函数uart_init(115200); //初始化串口波特率为115200LED_Init(); //初始化LED WKUP_Init(); //待机唤醒初始化 while(1){LED0=!LED0;delay_ms(250);//延时250ms}
}
总结
本节介绍的是低功耗模式,主要介绍了待机模式,希望对大家有所帮助,谢谢大家了!
(24)STM32——待机唤醒(低功耗)笔记相关推荐
- STM32——待机唤醒实验-低功耗-M4
一.低功耗模式介绍 低功耗模式:在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码.当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发 ...
- 【玩转STM32】:串口唤醒低功耗的三种方式/低功耗下打印数据
在使用STM32做低功耗项目时,大概率会遇到一个问题:低功耗模式下想打印数据怎么办? 今天,学长给大家另辟蹊径,介绍一种使用串口唤醒低功耗的案例.方法.可设置三种唤醒方式:检测到起始位唤醒.检测到 R ...
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...
- STM32之待机唤醒
前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...
- STM32开发,HAL函数实现待机唤醒功能以及SVN使用简介
STM32开发,HAL函数实现待机唤醒功能以及SVN简介 1 概述 1.1 资源概述 1.2 实现功能 2 程序实现 2.1实现原理 2.2 程序源码 3 SVN简介 4官方例程库driver精简 5 ...
- stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...
1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第十九章 待机唤醒实验 本章我们将向 ...
- STM32F407待机唤醒
疑问 在做待机唤醒实验时,会有这样的疑问:只有进入待机模式的代码,那么唤醒是如何唤醒的? 原理 (此节主要针对待机唤醒原理进行简单介绍,可以根据自己情况自动略过) STM32F4待机模式 在系统或电源 ...
- stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...
- Android 功耗(12)---如何查找待机唤醒源
如何查找待机唤醒源 系统场景的唤醒源:EINT/CONN/CLDMA EINT: PMIC的唤醒. a.Powerkey 唤醒后面的log会有pwrkey_int_handler b. rtc ala ...
最新文章
- GitHub开源的最全中文诗歌古典文集数据库
- 服务器性能优化的正确姿势
- sample, batch, epoch 分别是什么?
- SAP PM 入门系列18 - IP25为维护计划 Set Deletion Flag
- Hadoop学习之HDFS架构(二)
- cmd ibm服务器型号,ibm gpfs
- Thanks, TuSimple!
- Mac OS使用ll、la、l等ls的别名命令
- 正反观点验证2010年10大安全挑战
- tempdb数据库清理_tempdb数据库,简介和建议
- 使用Ecliplse时,对导入package的顺序进行设定
- [WCF编程]8.服务实例的生命周期
- selenium调用edge driver的坑
- (13.3)Latex参考文献引用及常规引用
- 人类和海洋动物的相似之处
- linux终端玩fc游戏,在UBuntu下玩FC和街机模拟器
- YouTube引流技巧教程!
- 怎么查看电脑主板最大支持多大的内存
- android+仿ios+音乐播放器,iOS简单的音乐播放器(仿QQ音乐)
- 使用 js 将图片进行转Base64转码
热门文章
- arduino UNO利用74hc595级联控制16个LED状态
- iis服务器部署项目,IIS环境下部署项目的详细教程
- 从轻测到上线,WeTest与《一起来捉妖》测试方案大公开
- 用计算机好还是自己算好作文,计算机考试后感优秀作文
- 【题解】食物链(并查集)
- 计算机c盘空间满了应该怎么办,C盘空间满了怎么办?我来教你你如何解决
- 上位机使用python/matlab通过网线VISA/SCPI编程远程控制旧版A.06.04.32的安捷伦agilent矢量网络分析仪(VNA)采集S21参数
- Spring Boot使用宝兰德BES进行改造和部署
- 使用viewer.js实现在线浏览Office文档
- Junos设备密码恢复