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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 void Wkup_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; KEY_Init();//我的IO初始化在按键里已经初始化了 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PA0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
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 = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); if(Check_up() == ) //系统初始化后由于没有按下按键、、所以系统直接进入了待机模式了,所以下载了程序没有任何反应、、需要人为的唤醒:死猪,就知道睡,快醒、、
{
Sys_Standby(); //进入待机模式
}
}
//正常模式下会运行中断服务函数,而待机模式下则不会运行中断服务函数、、因为待机模式下MCU不工作,所以上升沿的作用也仅仅是唤醒、、
//在这里提醒:唤醒只需要上升沿、、所以从待机模式切换到正常模式下从始至终都不会执行中断服务函数
//在这里,知道我为什么要在上面提醒大家要注意上升沿了吧、(下面还有)、
//至于为什么不会执行,待会我还会给出解释、、
3 void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0);
if(Check_up())
{
Sys_Enter_Standby();
}
}

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

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 = ;
u8 tx = ;
LED0 = ;
while()
{
if(KEY3 == ) //检测到按键按下
{
t++;
tx = ;
}
else
{
tx++;
if(tx > )
{
LED0 = ;
return ; //错误按键或者按键时间不够
}
}
delay_ms();
if(t > ) //100*30ms = 3s
{
LED0 = ;
return ;// 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秒,决定是否开机。

啊哈、、不知看到这里的你理解得怎么样了、、我也是初学者,尽量用我所理解的来帮助你们理解、、用点自认为是幽默的风格来、、不会显得那么的死板、、希望大家见谅哈、、初学者难免有理解上的失误或者不懂或者讲得不全面、、所以在这有写错的敬请原谅哈、、又花了一下午的时间整理思路写了这篇博客、、肚子有点饿了、、啊哈、、希望能帮到你们哈、、谢谢、、

附加题:当你看到“小心地滑”的标语时,请别误会成 :为什么我不能勇敢地滑,而要小心地滑、、这下子你应该会明白为什么当初语文考试要你做文言文断句了、、好好找亮点吧、找到亮点后好好的笑笑、然后好好的生活、发现更多的亮点、让生活多充满自我娱乐的乐趣、然后继续努力、、生活依旧美好、、

STM32之待机唤醒的更多相关文章

  1. stm32实现待机唤醒

    STM32的低功耗模式有3种:1.睡眠模式(CM3内核停止,外设仍然运行)2.停机模式(所有时钟都停止)3.待机模式(1.8v内核电源关闭) 进入待机模式的方法,以及设置WK_UP引脚用于把STM32 ...

  2. stm32之复位与待机唤醒

    一.复位 stm32复位有三种类型,分别为系统复位.电源复位和备份域复位. 其中系统复位又分为: NRST引脚低电平(外部复位) 窗口看门狗计数结束 独立看门狗计数结束 软件复位 低功耗管理复位 二. ...

  3. (stm32f103学习总结)—待机唤醒实验

    一.STM32待机模式介绍 1.1 STM32低功耗模式介绍 很多单片机具有低功耗模式,比如MSP430.STM8L等,我们的STM32 也不例外.默认情况下,系统复位或上电复位后,微控制器进入运行模 ...

  4. STM32 STOP模式唤醒后的时钟

    进了STOP模式后,PLL停掉了,所以,如果开始的时钟配置,用的是PLL,那么唤醒后,需要重新配置RCC. 如果使用的是PLL,及时是用MSI作为时钟源,放大出来的,比如4M的MSI,PLL放大到48 ...

  5. 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口

    这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式.让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式. void EXTI1 ...

  6. Stm32外围模块编程初始化步骤

    Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...

  7. stm32学习基本知识点

    1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为st ...

  8. 第23章 RTX 低功耗之待机模式

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 待机模式介绍 本章节我们主要讲解待机模式,待机模式可实现系统的最低功耗.该模式是在 ...

  9. FreeRTOS 低功耗之待机模式

    STM32F103 如何进入待机模式在 FreeRTOS 系统中,让 STM32 进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode 即可. STM32F103 如何退出待机 ...

随机推荐

  1. Asp.Net 数据库连接字符串

    <configuration> <connectionStrings> <add name="DefaultConnection" providerN ...

  2. C++小结

    1.输入:cin>>变量名: 输出:cout<<变量名<<endl: 2.类 public 公有,此类及其他类中使用   private 私有,只能在本类中使用   ...

  3. iOS block

    主要内容: block基本声明格式 block访问区域变量 block代替代理 block基本声明格式: ^(传入的参数){具体代码}; 注: Block实体开头是"^",接着是由 ...

  4. 为WAMP中的mysql设置密码(默认为空)

    为WAMP中的mysql设置密码 WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 1.首先,通过WAMP打开mysql控制台. 提示 ...

  5. The certificate used to sign ***has either expired or has been revoked. An updated certificate is required to sign and install the application

    真机测试的时候弹出这样的提示:The certificate used to sign ***has either expired or has been revoked. An updated ce ...

  6. vmware 下centos7配置网络

    步骤一: 虚拟机中的网络设置配置为桥接模式: 步骤二: 注:本人配置的为非静态IP,ip为自动获取 vi /etc/sysconfig/network-scripts/ifcfg-eth0 配置内容如 ...

  7. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  8. java.sql.SQLException: ORA-01000: 超出打开游标的最大数

    实际上,这个错误的原因,主要还是代码问题引起的.  ora-01000: maximum open cursors exceeded.  表示已经达到一个进程打开的最大游标数.  这样的错误很容易出现 ...

  9. C#水晶报表,窗体不显示,闪退

    一.问题说明 由于VS2008以后水晶报表不在集成,要用的话需要单独下载. 这里注意如果是用在C#窗体程序里的话一定要下载exe文件,安装msi文件的话VS工具栏里找不到水晶报表控件的.如果你的是64 ...

  10. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...