STM32之待机唤醒

前段时间我稍微涉及节能减排大赛、、倡导节能的社会、、没错了、你真是太聪明了、、知道了我今天要讲关于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引脚的上升沿、、注意哈、、注意此上升沿三个字哈、、
至于为什么要注意上升沿、、在这里提出我也是有目的、、先记着哈、、你此时想的为什么要注意的原因肯定跟我待会提到的时候不一样、、在此先奸笑下、、

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

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


 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秒,决定是否开机。

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

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

时间: 2024-10-24 02:54:22

STM32之待机唤醒的相关文章

待机唤醒实验

一.STM32待机模式介绍 1.1 STM32低功耗模式介绍 很多单片机具有低功耗模式,比如MSP430.STM8L等,我们的STM32 也不例外.默认情况下,系统复位或上电复位后,微控制器进入运行模 式.在运行模式下,HCLK 为CPU提供时钟,并执行程序代码.当 CPU 不 需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省 功耗.用户需要根据最低电源消耗.最快速启动时间和可用的唤醒源等 条件,选定一个最佳的低功耗模式. 当然在运行模式下,也可以通过如下方式降低功耗: (1)降低

cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

很多单片机都有低功耗模式, STM32 也不例外.在系统或电源复位以后,微控制器处于运行状态.运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时.用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式. STM32 的低功耗模式有 3 种: 1)睡眠模式( CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式( 1.8V 内核电源关闭) 在这

STM32的待机与唤醒试验

因为要节能,这个星期折腾待机与唤醒,首先是待机与按键的唤醒,下载和看了N多网上的资料,千转百回,还是官方资料靠谱.int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_ADC_Init();MX_LPUART1_UART_Init();MX_USART1_UART_Init();MX_RTC_Init();HAL_RTC_MspInit(&hrtc);GetCurrentDateTime();

STM32 STOP模式唤醒后的时钟

进了STOP模式后,PLL停掉了,所以,如果开始的时钟配置,用的是PLL,那么唤醒后,需要重新配置RCC. 如果使用的是PLL,及时是用MSI作为时钟源,放大出来的,比如4M的MSI,PLL放大到48M,或者8M,STOP模式唤醒后,还是得重新配置时钟,因为用的是PLL. 如果为了节省时间,想退出STOP模式后,不用重新配置RCC(配置RCC,如果是外部HSE,耗时大概1.2ms),可以考虑用MSI STOP模式唤醒后 The MSI oscillator is selected as syst

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

STM32F103 待机模式介绍 本章节我们主要讲解待机模式,待机模式可实现系统的最低功耗.该模式是在 Cortex-M3 深睡眠模式时关闭电压调节器.整个 1.8V 供电区域被断电. PLL. HSI 和 HSE 振荡器也被断电. SRAM 和寄存器内容丢失,只有备份的寄存器和待机电路维持供电. STM32F103 如何进入待机模式在 RTX 系统中,让 STM32 进入待机模式比较容易,调用固件库函数 PWR_EnterSTANDBYMode即可.STM32F103 如何退出待机模式让 ST

stm32学习基本知识点

1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3. HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4. LSE Osc(Low Sp

144个stm32开发相关的问题,看你了解几个

1. SYSCLK时钟源有三个来源:HSI RC.HSE OSC.PLL; 2. MCO[2:0]可以提供4源不同的时钟同步信号; 3. GPIO口貌似有两个反向串联的二极管用作钳位二极管; 4. 总线矩阵采用轮换算法对系统总线和DMA进行仲裁 5. ICode总线,DCode总线.系统总线.DMA总线.总线矩阵.AHB/APB桥 6.在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟 7.数据字节以小端存储形式保存在存储器中 8. 内存映射区分为8个大块,每个块为512M

STM32电源管理

 (1)3时钟模式 ①睡眠模式②停止模式③待机模式 1.睡眠模式:Cortex-M3内核(理解为CPU)停止工作,CPU供电1.8V有着,周边任何执行.执行 2.停机模式:全部时钟都停止,CPU电源1.8V没断.唤醒后从原来位置运行 3.待机模式:时钟全断,CPU电源1.8V也断,唤醒后程序又一次运行 可形象參考: CPU:皇上 CPU电源1.8V:皇后 外设:将军 那么: 1.睡眠模式:仅仅有皇上睡觉 2.停机模式:皇上,将军睡觉 3.待机模式:皇上,皇后.将军全睡觉了 (原则:皇后不睡觉

SYSTEM文件夹下的sys文件夹学习小结

一.sys文件夹包含五个文件,其中,我们需要重点了解两个,sys.c和sys.h. 二.sys.h里面定义了STM32F1的I/O口输入读取宏定义和输出宏定义. sys.c里面定义了很多与STM32F1底层硬件相关的设置函数,包括系统时钟的配置.I/O配置.中断的配置等. 三.sys.h 中几个其他的全局宏定义: //0,不支持 OS; 1,支持 OS #define SYSTEM_SUPPORT_OS 0 //定义系统文件夹是否支持 OS //Ex_NVIC_Config 专用定义 #defi