一。STM32低功耗模式讲解

50.待机唤醒实验

有些设备比如可穿戴设备对功耗的要求非常高,比如手表,我在看时间或者获取数据的时候就需要正常的执行,

但有的时候比如晚上或有时候不需要使用它,但我们并不需要关机,可以通过低功耗模式让它更加省电,就延长了它的使用时间。

50.待机唤醒实验
1. 睡眠模式: 内核停止,但是它的外设比如中断管理NVIC,系统的时钟Systick仍在运行。

2. 停止模式:比睡眠模式更加低功耗,所有的时钟都停止,但是1.8V的内核电源还在工作,但是其他的时钟比如                     PLL,HIS和HSE RC振荡器功能全部禁止了。

                    寄存器和SRAM的内容保留。

3. 待机模式:功耗更低,内核1.8V的电源关闭,只有备份寄存器和待机电路维持供电。

                    寄存器和SRAM内容全部丢失,实现最低功耗。

运行模式,有些场景我们还是需要系统能正常运行,我们要降低功耗的话可以采取以下方式:

1. 降低系统时钟

2. 关闭APB和AHB总线上未被使用的外设的时钟。

STM32的三种低功耗模式

要进入这三种低功耗模式或者从三种低功耗模式退出的方法:

50.待机唤醒实验
1. 睡眠模式:进入的方法:(1)执行WFI指令或WFE指令,只需要调用一个函数就OK了。

                    唤醒的方法: 对于WFI进入:任一个中断

                                         对于WFE进入:唤醒事件

2. 停机模式: 进入的方法:PDDS和LPDS位 + SLEEPDEEP位都需要设置,然后再用WFI或WFE指令。

                     唤醒的方法:任何一种外部中断都可以(在外部中断寄存器中设置)

3. 待机模式: 进入的方法: PDDS位+SLEEPDEEP位设置,清除WUF位,然后再用WFI或WFE指令进入

                     唤醒的方法:通过WKUP引脚的上升沿(PA0引脚),或者RTC闹钟事件,或者NRST引脚上的外                                            部复位,独立看门狗IWDG复位。常用的是闹钟事件或者外部WKUP引脚。

实验程序用WKUP引脚(PA0)唤醒。

实验采用待机模式:

50.待机唤醒实验
待机模式下大部分引脚都处于高阻状态。

在待机模式下F1只需要2uA的电流,非常低。

二。寄存器和库函数配置

1. PWR_CR电源控制寄存器

50.待机唤醒实验

位1: PDDS,在进入待机模式要置1

SLEEPDEEP在系统控制寄存器SCB中置1。

清除PWR_CSR寄存器中的WUF位。

2. PWR_CSR 电源控制/状态寄存器

50.待机唤醒实验

退出待机模式有几种方法,如果要用WKUP引脚唤醒怎么配置?

PWR_CSR寄存器位8,EWUP使能WKUP引脚。

固件库中低功耗操作函数

50.待机唤醒实验
调用 void PWR_EnterSTANDBYMode(void);  //进入待机模式

这个函数中执行了四个操作:1. PDDS位置1

                                            2. SLEEPDEEP位置1

                                            3. 清除WUF位

                                            4. 执行WFI()指令,当然也可以执行WFE()指令

待机唤醒的配置步骤

50.待机唤醒实验

三。实验程序讲解

实验程序比较复杂,主要是为了在同一个WKUP引脚(PA0)长按3秒进入待机模式,在待机模式下,长按3秒待机唤醒。

程序的设计思路提醒:

50.待机唤醒实验

1. 先写一个待机唤醒测试

按下某一个按键进入待机模式

(1)在FWLlib下面要添加PWR相关的固件库 .c 和 .h文件

(2)程序设计:程序复位后液晶屏被点亮,显示一些内容,然后按下KEY0之后进入待机模式,在待机模式下按下WKUP键退出待机模式,程序又相当于复位从头开始执行,液晶屏又重新显示内容。

int main(void)

 {  

  u8 x=0;

u8 lcd_id[12]; //存放LCD ID字符串

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

  LED_Init();     //LED端口初始化

LCD_Init();

KEY_Init();

 

POINT_COLOR=RED;  

LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^");   //液晶屏显示一些内容

LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

while(1)

{

if(KEY_Scan(0) == KEY0_PRES)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //使能PWR时钟,在APB1总线上

PWR_WakeUpPinCmd(ENABLE);  //使能WKUP唤醒引脚,使得在待机模式下按WKUP键能够退出待机模式

PWR_EnterSTANDBYMode();  //进入待机模式

}

delay_ms(10);

}

}

实验现象:程序开始运行,液晶屏显示三行文字,按下KEY0键时进入待机模式,液晶屏关闭,按下WKUP键,液晶屏重新显示内容。

2. 实验程序

在同一个WKUP引脚(PA0)长按3秒进入待机模式,在待机模式下,长按3秒待机唤醒。

wkup.c 文件

//PA0 WKUP唤醒初始化

void WKUP_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure;    

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟,因为后面要把PA0引脚配置成外部中断,所以要开启复用功能。

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO

    //使用外部中断方式,配置中断线

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线0连接GPIOA.0

  EXTI_InitStructure.EXTI_Line = EXTI_Line0; //设置按键所有的外部线路

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure); // 初始化外部中断

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

if(Check_WKUP()==0) Sys_Standby();    //开机后没有连续按下WKUP引脚3秒,进入待机模式 ,只有开机                                                                           时连续按下WKUP键3秒程序才能正常执行。

}

//检测WKUP脚的信号

//返回值1:连续按下3s以上

//      0:错误的触发

u8 Check_WKUP(void)  //检测WKUP引脚的电平,3秒钟内连续按下返回1,

{

u8 t=0; //记录按下的时间

LED0=0; //亮灯DS0 

while(1)

{

if(WKUP_KD)

{

t++; //已经按下了 

delay_ms(30);

if(t>=100) //按下超过3秒钟,每30毫秒 t+1, t计数到100,说明到3秒钟

{

LED0=0; //点亮DS0 

return 1; //按下3s以上了,返回1

}

}else 

LED0=1;

return 0; //按下不足3秒,返回0

}

}

void Sys_Standby(void)

{  

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟

PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

PWR_EnterSTANDBYMode();  //进入待命(STANDBY)模式 ,进入待机模式  

}

main.c文件

int main(void)

 {  

  

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

LED_Init();     //LED端口初始化

WKUP_Init(); //待机唤醒初始化


LCD_Init(); //LCD初始化

POINT_COLOR=RED;

 

LCD_ShowString(30,50,200,16,16,"Warship STM32");

LCD_ShowString(30,70,200,16,16,"WKUP TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2014/1/14");

 

while(1)

{

LED0=!LED0;

delay_ms(250);

}

 }

//外部中断,检测到PA0脚的一个上升沿.  

//中断线0线上的中断检测

void EXTI0_IRQHandler(void)

{                

EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位  

if(Check_WKUP())//检测WKUP键是不是连续按下3秒钟,连续按下3秒进入待机模式

{  

Sys_Enter_Standby();   //如果是连续按下3秒,就进入待机唤醒模式

}

//系统进入待机模式

void Sys_Enter_Standby(void)

{  

RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口

Sys_Standby();

}

程序正常运行时显示几行文字,LED0交叉闪烁。

在WKUP_Init函数中如果没有连续按下3秒就进入待机模式

如果连续按下了WKUP键3秒,则正常执行,而在正常执行的情况下因为我们把WKUP设置了外部中断,进入外部中断函数

实验现象:

程序开始执行,判断WKUP是不是按下了,如果没有长按3秒就进入待机模式。

因为一开始没有按WKUP,所以进入待机模式,液晶屏不亮。

然后连续按WKUP3秒后就唤醒了,液晶屏显示几行文字,LED0也开始闪烁。

因为,一按WKUP的瞬间就被唤醒,同样开始执行主函数,执行到

if(Check_WKUP()==0) Sys_Standby();    //不是开机,进入待机模式 

因为我们长按了3秒所以这个检测就不通过,就不会进入待机模式,程序就直接往下执行,液晶屏显示,LED0闪烁。

接下来再去长按WKUP3秒,又进入待机模式。因为程序正常运行情况下,我们把WKUP设置成了外部中断,所以一按PA0就会进入外部中断服务函数,在中断服务函数中去判断按下WKUP是不是超过3秒,超过3秒就进入到待机模式,如果按下的时间不到3秒钟,不会进入待机模式,液晶屏还是正常显示。


关键字:待机  唤醒实验  STM32 引用地址:50.待机唤醒实验

上一篇:51.内部温度传感器实验
下一篇:49. RTC实验讲解

推荐阅读

16日,在马里亚纳海沟海域执行中科院战略性B类先导专项“海斗深渊前沿科技问题研究与攻关”等任务的海斗深渊科考试验队,乘坐“探索一号”科考船回到海南三亚。本次科考胜利完成了深海装备海试和科考作业任务,成果丰硕。科考队于8月24日从三亚出发,共有59人参加,历时54天,从深海装备与技术、地球物理、海洋地质与地球化学、海洋生物及物理海洋等多个学...
近日,人工智能研究组织OpenAI在构建通用自学机器人方面取得了新的里程碑。该组织的机器人部门表示,其去年首次开发的类人机器人手Dactyl,已经学会了单手解魔方。 OpenAI将这一壮举视为机器人附件灵巧性以及自家AI软件的巨大飞跃,AI软件使Dactyl可以在面临实际挑战之前,利用虚拟仿真学习虚拟任务中的新任务。据报道,OpenAI是一家以人工智能和机器学习...
日前,选车君从相关渠道获悉,沃尔沃汽车将在SPA2平台使用驾驶员监测传感器,以预防由于驾驶时分心导致的事故发生。 沃尔沃汽车表示,随着车载科技和智能移动终端的发展,越来越多的驾驶员在驾驶时会有分心的表现,毕竟在上世纪四十年代,车内还没有配备屏幕、电话甚至收音机时,当时的车辆在某种意义上比现在更安全,但是使用这些电子设备已经成为了大部...
即将发布的Galaxy A13将会成为三星旗下最便宜的5G手机。该机是Galaxy A12的继任者,售价应该会比目前发售的 Galaxy A22更亲民,预估将会在今年年底推出。外媒 LetsGoDigital携手油管频道 Technizo Concept 带来了该机的高清渲染。根据目前掌握的信息, 三星 A13将配备一个6.48英寸的 LCD 显示屏。显示屏分辨率可能会提高,从 HD+ 升级到 Ful...

史海拾趣

问答坊 | AI 解惑

北京移动资费下调纯属做秀?!

      对于北京移动的资费下调行为,信息产业部电信研究院通信政策部副总工程师周光斌表示,目前电信资费管制已经开始从政府定价向市场定价转变,从制订资费标准向严格审批程序转变,因此电信资费最终还是必须由合理的市 ...…

查看全部问答∨

急-请教高手有没有IP核或芯片能达到编码20M输入,40M输出?

急……请教高手有没有IP核或芯片能达到编码20Mbps输入,40Mbps输出?谢谢!如果用级联码做,要求20Mbps输入,40Mbps输出,何种方案较好呢?…

查看全部问答∨

【资料整理】之开关电源

将开关电源的一些资源帖,在这里做成集锦,方便大家查阅。不断补充中........ 资料贴 1.  开关电源分类介绍 2.  开关电源设计全过程 3.  开关电源设计软件 4.  常见开关电源电气的技术指标 ...…

查看全部问答∨

春节,会不会是咱行业的旺季?

别的不敢说,毕竟,春节期间 盗抢事件频繁,啥门禁啊?摄像头啊? 会不会需求量更大一些?…

查看全部问答∨

说说你最成功的电子设计

受到liweiliang同学的启发,在他的帖子中想到了很多当初入行时候的辛酸,在日复一日的不断摸索中,不会只有辛酸和磨练,也有获得成功时的喜悦吧,大家说说做什么项目或者设计给你带来第一次成功的感觉,虽然那可能很短暂,但可能影响一生。…

查看全部问答∨

嵌入式linux 移植iptables 的问题

曾经在网上看到这样一篇帖子: { Linux下支持netfilter机制的配置工具就是iptables,它也就相当与一个应用程序,可以对netfilter进行配置(包过滤规则,NAT等等)。所以要实现netfilter(iptables)就要从两方面来着手:1)内核支持netfilter;2 ...…

查看全部问答∨

如何让USB虚拟出一个串口来,以至于当该设备插入时显示一个USB口和一个虚拟串口

现在在做一网卡项目,实现的功能是当网卡插入Windows XP系统时,显示一个USB口和一个串口,其中USB口实现上网,串口用于走AT命令等,现在在Windows端的驱动程序都已有现成的,USB也可以上网了     但是目前系统只可以检测到USB口,无法 ...…

查看全部问答∨

怎样让EVC在生成(build)程序时不自动连接设备并下载?

怎样让EVC在生成(build)程序时不自动连接设备并下载? 就是说我每次build程序时EVC总是会默认试图连接设备并将程序下载到设备,而实际上我并不需要这么做,所以我每次都得点"取消". 有没有设置让EVC不这么做?…

查看全部问答∨

Wince 外扩IIC接口的键盘问题

网上查得 北京博创的光盘里有个在WINCE下扩ZLG7290的实验, 哪位做过类似的实验? 或是有他们光盘资料的,劳驾发一份给我,谢谢! sasinop@hotmail.com …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved