现在的位置: 首页资讯>正文
STM32的待机唤醒实验分析(基于原子哥程序)
2017年07月12日 作者: 暂无评论 147+ 0

前段时间我稍微涉及节能减排大赛,倡导节能的社会、、没错了、你真是太聪明了,知道了我今天要讲关于STM32节能方面的模块,没错、、这标题已经告诉你了是吧、、哦,对,标题有些、、所以、、言归正传、至于STM32如何达到节能的、、语文老师说要留下悬念、、跟着作者走下去、、也就是跟我啦、、

大家翻开STM32的中文参考手册(你们看就行了,我翻,然后截图),里面关于STM32的低功耗模式有详细的标注,突然不想截图。

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

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

3、待机模式(1.8V电源关闭)(我们本博客中具体介绍的一种模式,也是功耗最低的模式)

现附上三者照片、、望观众好好欣赏、、还有请稍微注意下我的涂鸦、、小弟感激不尽:Cortex-M3001

啊哈、、这照片是不是很神奇呀、、即把三个老家伙的家底进行了较为认真的比较,而且从照片中我们也可以看出,如何进入,如何唤醒他们、、而且有什么影响都跟我们透露了、、可谓是后生可畏呀、、所以我叫大家注意我美丽的涂鸦是有道理的、、哈、

在本博客中,我们就利用WKUP引脚的上升沿来唤醒MCU、、不好意思哈、、老是把上升沿打成上小沈阳、、所以我们就具体来介绍待机唤醒的实现方法、、

那我们要怎么来进入待机模式、、又要怎么唤醒呢?Cortex-M3002

看到“进入”中的红色数字标号了吧、、没错了、、我们只要按照此步骤来设置相应的寄存器就行了、、那、、我打???的是什么呢??好了、、请容许我介绍下:

1、 Cotex_M3系统控制寄存器中的SLEEPDEEP位到底在哪呢??大家请翻开《权威指南》第182页可以看到表格、、当然这里不用你翻开、、因为我已截图:Cortex-M3003

2、电源控制寄存器(PWR_CR)中PDDS位:请看寄存器的位:Cortex-M3004

3、电源控制/状态寄存器(PWR_CSR)中EWUP位Cortex-M3005

至此、我们通过这三步、完成了进入待机模式的任务、、那我们怎么通过程序实现呢?啊哈、、库神出现吧、、:::系统出现奔溃、、请稍后、、详情请咨询10086、、

额、、出现了点意外、、不急哈、、那我们先来看看怎么退出待机模式:重现一张图片:Cortex-M3006

看到了吧、、在这里我们就利用其中一种方式来唤醒:WKUP引脚的上升沿、、注意哈、、注意此上升沿三个字哈、、 至于为什么要注意上升沿、、在这里提出我也是有目的、、先记着哈、、你此时想的为什么要注意的原因肯定跟我待会提到的时候不一样、、在此先奸笑下、、

那我们要怎么来唤醒呢??

亲、、我们通过外部中断触发来唤醒、、所以请看代码:

1 void Wkup_Init(void)

2 {

7 EXTI_InitTypeDef EXTI_InitStructure;

8 NVIC_InitTypeDef NVIC_InitStructure;

9

10 KEY_Init();//我的IO初始化在按键里已经初始化了

11

12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

13

14 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

15

16 EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PA0

17 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

18 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

19 EXTI_InitStructure.EXTI_LineCmd = ENABLE;

20 EXTI_Init(&EXTI_InitStructure);

21

22 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

23 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

24 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;

25 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

26 NVIC_Init(&NVIC_InitStructure);

27

28 if(Check_up() == 0) //系统初始化后由于没有按下按键、、所以系统直接进入了待机模式了,所以下载了程序没有任何反应、、需要人为的唤醒:死猪,就知道睡,快醒、、

29 {

30 Sys_Standby(); //进入待机模式

31 }

32 }

复制代码

复制代码

//正常模式下会运行中断服务函数,而待机模式下则不会运行中断服务函数、、因为待机模式下MCU不工作,所以上升沿的作用也仅仅是唤醒、、

//在这里提醒:唤醒只需要上升沿、、所以从待机模式切换到正常模式下从始至终都不会执行中断服务函数

//在这里,知道我为什么要在上面提醒大家要注意上升沿了吧、(下面还有)、

//至于为什么不会执行,待会我还会给出解释、、

3 void EXTI0_IRQHandler(void)

4 {

5 EXTI_ClearITPendingBit(EXTI_Line0);

6 if(Check_up())

7 {

8 Sys_Enter_Standby();

9 }

10 }

看到以上代码会不会熟悉呢??在这里就不解释了哈、、所以重点来讲讲步骤

1、使能PWR的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

2 、使能唤醒的功能:PWR_WakeUpPinCmd(ENABLE);

3、进入待机模式 : PWR_EnterSTANDBYMode();

请看代码:

void Sys_Standby(void) //在唤醒初始化中调用

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

PWR_WakeUpPinCmd(ENABLE);

PWR_EnterSTANDBYMode();

}

void Sys_Enter_Standby(void)//在中断函数里调用,用来复位,然后进入待机模式

{

RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //在这里只是复位了IO口、、至于0x01fc是怎么来的、、大家请看RCC_APB2RSTR(下图)

Sys_Standby();

}

最后我们给出按键检测的处理程序、、在这里,3S只是一个效果、、也可以不用、、也可以长点、、看你个人哈(原子的程序,别告我盗版哈)

u8 Check_up(void)

{

u8 t = 0;

u8 tx = 0;

LED0 = 0;

while(1)

{

if(KEY3 == 1) //检测到按键按下

{

t++;

tx = 0;

}

else

{

tx++;

if(tx > 3)

{

LED0 = 1;

return 0; //错误按键或者按键时间不够

}

}

delay_ms(30);

if(t > 100) //100*30ms = 3s

{

LED0 = 0;

return 1;// 3s

}

}

}

看到这里、、可能有人会有些搞不懂在中断服务函数那里的逻辑、、在这里我给出解释哈:

从正常运行模式切换到待机模式 按住wkup键 外部中断0中断被触发 执行中断服务函数 Check_up()函数开始检测 如果时间没超过3s 返回零 这时工作在正常运行模式 如果按住时间超过了3s 返回值为1 进入待机模式

我们的程序在刚开始运行时就是没有按键按下、、所以没有上升沿,初始化函数里条件成立,从而进入了待机模式:请看初始化的代码:

if (Check_up() == 0)

29 {

30 Sys_Standby(); //进入待机模式

31 }

从待机模式切换到正常运行模式 按住wkup键的那一瞬间会有一个上升沿 而这个上升沿执行了唤醒功能但是没有执行外部中断0的中断服务函数 待机模式下cpu是不工作的 从待机模式唤醒后的代码执行等同于复位后的执行所以程序又会从头开始执行(这句话很重要) 然后又会执行到 Check_up()函数检测 如果按住键盘的时间没有超过3s 还是会处于待机模式 加入超过了3s 返回值为1 条件不成立 就会切换到正常运行模式 所以结论就是外部中断0的中断服务程序在待机模式切换到正常运行模式的时候从始至终是不会运行的

记住:唤醒中只是说需要上升沿、、并没有说要进入中断

所以:

1 、如果是正常运行,先执行中断程序,判断是否3秒,决定是否待机。

2 、如果是待机状态,则先复位并初始化,判断是否3秒,决定是否开机。

啊哈、、不知看到这里的你理解得怎么样了、、我也是初学者,尽量用我所理解的来帮助你们理解、、用点自认为是幽默的风格来、、不会显得那么的死板、、希望大家见谅哈、、初学者难免有理解上的失误或者不懂或者讲得不全面、、所以在这有写错的敬请原谅哈。

原文链接:http://www.eeboard.com/news/stm32-4/

搜索爱板网加关注,每日最新的开发板、智能硬件、开源硬件、活动等信息可以让你一手全掌握。推荐关注!

【微信扫描下图可直接关注】

eeboard微信二维码设计3

科技早知道:

硬件研发成本,除了元器件还有什么?

大疆“晓”的体积够小了,但,还不是极限!这款堪比蜂鸟还小的VR无人机 装到口袋里随时放飞

目前最安全的Android系统版本竟然是它!

i5已经足够?i7性能过剩?那i9不是刚需?你信吗?

技术人才为什么离职?扎心了

  

相关文章

搭载ESP8266的麒麟座mini开发板评测——快速联网,一步到位
kylinmini-25

无论是上游的半导体商,还是中下游的产品方案设计商,还是云平台服务厂商,都卯足了劲想在物联网真正普及发展起来前优前布局,好分一杯羹。 中国移动也不例外,为了让广大用户了解自己开放...

MicroPython:STM32上的Python开发
python

虽然Python在国外是一门非常火的语言,在黑客界更是赫赫有名,然而中国的大学却极少开设 Python 课程,故而国内 Python 程序员多属自学。而一个没有MCU编程经验的初学者,要想让芯片跑起来,...

MicroPython:STM32 上 的 Python 开发
MicroPython

虽然Python在国外是一门非常火的语言,在黑客界更是赫赫有名,然而中国的大学却极少开设 Python 课程,故而国内 Python 程序员多属自学。而一个没有MCU编程经验的初学者,要想让芯片跑起来,...

ST推出一套价格亲民的基于意法半导体STM32微控制器生态系统的开发工具
ST-1

横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST)推出一套价格亲民的基于意法半导体STM32微控制器生态系统的开发工具,设计工程师利用新开发套件能够开...

物联网开发“神器”?——深智云DT Kit评测
SONY DSC

目前国内市场针对物联网的硬件开发平台非常多,比如机智云的Gokit、庆科的MiCOkit、开发快的小e套件等,这些开发平台的厂商都提供了完善的硬件、软件、云端服务等方面的支持,为开发者创新产...

给我留言

您必须 [ 登录 ] 才能发表留言!