STM32系列第17篇--待机唤醒
来源:互联网 发布:ons游戏解压软件 编辑:程序博客网 时间:2024/05/01 13:28
STM32的3种低功耗模式:
- 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
- 停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。
- 待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。
STM32的3种低功耗唤醒方式:
STM32待机模式:
在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。
库函数进入待机模式:
1. 使能电源时钟。
2. 设置WK_UP引脚作为唤醒源。
3. 设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。
程序源码:
#include "wkup.h"#include "led.h"#include "delay.h"void Sys_Standby(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟 PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能 PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式 }//系统进入待机模式void Sys_Enter_Standby(void){ RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口 Sys_Standby();}//检测WKUP脚的信号//返回值1:连续按下3s以上// 0:错误的触发 u8 Check_WKUP(void) { u8 t=0; //记录按下的时间 LED0=0; //亮灯LED0 while(1) { if(WKUP_KD) { t++; //已经按下了 delay_ms(30); if(t>=100) //按下超过3秒钟 { LED0=0; //点亮DS0 return 1; //按下3s以上了 } }else { LED0=1; return 0; //按下不足3秒 } }} //中断,检测到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_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟 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(); //没有按三秒,不是开机,进入待机模式 }
0 0
- STM32系列第17篇--待机唤醒
- STM32之待机唤醒
- STM32 待机唤醒
- STM32-待机唤醒实验
- STM32之待机唤醒
- STM32学习笔记之待机唤醒
- STM32待机模式唤醒测试以及独立看门狗测试
- STM32待机模式唤醒测试以及独立看门狗测试
- 11、待机唤醒实验
- Android待机唤醒机制
- 待机唤醒(亮屏灭屏)
- 待机和唤醒
- 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口。
- 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口。
- STM32系列第1篇--初探
- STM32系列第2篇--GPIO
- STM32系列第3篇--GPIO初始化
- STM32系列第9篇--外部中断
- MemCache超详细解读
- JQuery实现提交(submit)表单时候验证所有文本框是否为空
- pcl里面使用KdTree来搜索
- string类成员函数的使用方法(二)
- java autovalue
- STM32系列第17篇--待机唤醒
- N皇后问题的递归与非递归解法
- 【ps】查看进程
- java多线程系列:死锁及检测
- iOS获取设备IP地址
- 小公司如何做项目管理?
- linux 静、动态库笔记
- asp.net 点击服务器按钮 不触发后台事件解决方法
- 正则表达式验证生日手机号信息