Stm32待机模式的进入与唤醒

news2024/11/24 20:48:37

1.基础介绍 

1-1:单片机的“低功耗模式”,像是手机的待机模式,不同于正常运行模式,处于一种省电省资源的状态

1-2:在运行情况下,HCLK为cpu提供时钟,cortex-m3内核执行程序的代码,如果处于中断事件的等待时,可以进入低功耗模式用来节省资源等

1-3:STM32一共有着3个低功耗模式

(1)睡眠模式(cm3内核停止,外设时钟等依旧运行)

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

(3)待机模式(1.8V内核电源关闭)

1-4:具体介绍(引自正点原子参考手册)

 2.配置方式

2-1:进入待机模式函数

配置时钟+设置唤醒源+待机模式设置

void Sys_Standby(void)
{  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟
	PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能,在WkUp的上升沿进行
	PWR_EnterSTANDBYMode();	  //进入待机(STANDBY)模式 设置相应的进入条件(已经封装成了完整的函数)	 
}

 一般而言,进入待机模式的函数已经封装成了具体的函数,拆开来看:

1.清除Wk_up位

2.设置PWR_CR位使得CPU进入深度睡眠时又进入待机模式

3.设置PDDS位CPU设置深度睡眠模式时进入待机模式

4.__WFI指令

void PWR_EnterSTANDBYMode(void)
{
  /* Clear Wake-up flag */
  PWR->CR |= PWR_CR_CWUF;
  /* Select STANDBY mode */
  PWR->CR |= PWR_CR_PDDS;
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP;
/* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM   )
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();
}

4.以Wkup上升沿为唤醒条件,设置中断配置函数

oid EXTI0_IRQHandler(void)
{ 		    		    				     		    
	EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位		  
	if(Check_WKUP())//关机?
	{		  
		Sys_Enter_Standby();  
	}
} 

5.代码:实现按钮3s开机,按钮3s关机,就像手机的开关机一样

#include "wkup.h"
#include "led.h"
#include "delay.h"
//待机模式
//1.设置时钟
//2.设置唤醒条件
//3.设置进入条件
void Sys_Standby(void)
{  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟
	PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能,在WkUp的上升沿进行
	PWR_EnterSTANDBYMode();	  //进入待机(STANDBY)模式 设置相应的进入条件(已经封装成了完整的函数)	 
}
//系统进入待机模式
//1.复位所有的io
//2.待机模式设置
void Sys_Enter_Standby(void)
{			 
	RCC_APB2PeriphResetCmd(0x01fc,DISABLE);//复位
	Sys_Standby();//启动待机模式
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发,进入待机模式	
u8 Check_WKUP(void) 
{
	u8 t=0;	//记录按下的时间
	LED0=0; //亮灯DS0 
	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();    //不是开机,进入待机模式  
}

main函数

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"	 
#include "wkup.h"
 


 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,"Elite 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,"2015/1/14");
	 
	while(1)
	{
		LED0=!LED0;
		delay_ms(250);
	}
 }

我们来讲一下mian函数的执行过程

首先是mian函数执行到WKUP_Init()函数,这个时候如果按下按键,那么就会唤醒开机,但是由于我们规定的函数  if(Check_WKUP()==0) Sys_Standby()  所以必须要长按,才能起到唤醒单片机的作用。当长按的时候,这个时候就不会执行if(Check_WKUP()==0) Sys_Standby(),那么启动单片机

当启动单片机但是按下按键的时候,这个时候就会满足中断函数当中的要求

void EXTI0_IRQHandler(void)
{ 		    		    				     		    
	EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位		  
	if(Check_WKUP())
	{		  
		Sys_Enter_Standby();  
	}
} 

这个时候就能进入待机系统,然后单片机进入待机状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CleanMyMac X2023Mac上下载最多的第三个实用程序

CleanMyMac X是一款广为人知的Mac优化应用程序,目前是Mac上下载最多的第三个实用程序,并获得苹果官方认证。为了满足用户更好体验Mac和新版系统,它们带来了新功能。这新功能可以帮助用户更好的监控Mac的健康状况,让用户畅享Mac新系…

base编码

https://www.qqxiuzi.cn/bianma/base64.htm 一眼就解密 一看就晓得是base64,问就是做多了(base64大小写加数字和) base编码概念 此博客列举的比较多,我信 https://blog.csdn.net/qq_53105813/article/details/127626450 简单聊几个…

少儿编程 中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)2023年3月

2023年3月scratch编程等级考试三级真题 选择题(共25题,每题2分,共50分) 1、计算“2+4+8+……+128”,用变量n表示每项,根据变化规律,变量n的赋值用下列哪个最合适 A、 B、 C、 D、 答案:D 考点分析:考查数学逻辑推理能力,从给定的算式中可以看出后一项都是前一…

redis 数据库概述

一 概述 redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关…

基于springboot篮球竞赛预约平台

开发技术与环境配置 以Java语言为开发工具,利用了当前先进的springboot框架,以MyEclipse10为系统开发工具,MySQL为后台数据库,开发的一个篮球竞赛预约平台。 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring…

Callback CBFS .NET 2022所有产品打包Crack

Callback CBFS .NET 所有产品打包 Callback Technologies CBFS Storage 2022 .NET Edition v22.0.8517 Callback Technologies CBFS Filter 2022 .NET Edition v22.0.8485 Callback Technologies CBFS Disk 2022 .NET Edition v22.0.8464 Callback Technologies CBFS Connect …

UART-STM32

UART-STM32 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 第一步,开启时钟,把需要用的USART和GPIO的时钟打开 第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入 第三步,配置USART,直接使…

Kanzi Studio介绍与安装注意

文章目录 Kanzi介绍部署 Kanzi 应用程序到 Windows Kanzi介绍 Kanzi UI Solution是一个完整的UI解决方案,为嵌入式的UI的设计、开发和部署提供了一套完善的开发平台。它成功解决了实现和众多图形化用户界面分化的问题,使得用户界面的设计者和编程者可以…

vue的搭建以及命令

0.0 课程介绍 Vue介绍 【了解】 Vue项目的搭建 【掌握】 项目目录详解【掌握】 Vue组件化【掌握】 Vue的表达式 【重点】 Vue的指令【重点】 1.0 什么是Vue?【了解】 Vue是一个构建用户界面(UI)的JS库。 1.1Vue的特点 小 20k 【大概11000多行】…

HTTPS加密流程详解

文章目录 HTTPS与HTTP的关系HTTPS基本工作过程对称密钥非对称密钥中间人攻击证书 HTTPS与HTTP的关系 HTTPS协议基于HTTP,只是比HTTP多了一个加密层,为什么要加密呢?因为网络传输的过程中,明文传输的数据都有可能被劫持篡改&#…

系统分析师(一)软考简介

目录 1.证书简介2.考试简介3.考试报名4.各地考试机构5.考试要求6.考试教程用书 考试时间: 每年5月的最后一个周六 1.证书简介 ​ 软考全称是计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部、工业和信息化部…

【图】最小生成树

最小生成树:构造连通网的最小代价生成树。 最小生成树有两种算法:普利姆算法、克鲁斯卡尔算法。 普利姆(Prim)算法 加点,选择相邻点中边权最小的 需要两个一维数组,一个存权值,另一个存起始点…

MySQL 索引篇

什么是索引,索引就相当于一本书的目录。通过索引可以快速查找到对应的数据。 索引常见面试题: 1. 索引的分类: 按数据结构分类: 按物理存储分类:一般分为聚簇索引(主键索引),二级…

【Java EE 初阶】文件操作

目录 1.什么是文件? 1.在cmd中查看指定目录的树形结构语法 2.文件路径 从当前目录开始找到目标程序(一个点) 返回到上一级目录,再找目标程序(两个点) 2.Java中文件操作 1.File概述 1.属性 2. 构造…

CENTO OS上的网络安全工具(二十二)Spark HA swarm容器化集群部署

在Hadoop集群swarm部署的基础上,我们更进一步,把Spark也拉进来。相对来说,在Hadoop搞定的情况下,Spark就简单多了。 一、下载Spark 之所以把这件事还要拿出来讲……当然是因为掉过坑。我安装的时候,hadoop是3.3.5&a…

Unity Metaverse(七)、基于环信IM SDK实现的好友系统、私聊、群聊

文章目录 🎈 简介🎈 用户管理🎈 好友管理🎈 聊天管理🔸 发送与接收消息🔸 消息处理消息项的对象池管理 🎈 简介 在之前的文章中已经介绍了如何接入环信IM Unity SDK,及基于该SDK实现…

使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建

使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建 点云生成8面体点并拟合绘制表面重建结果。(官方示例兔子,8面体,多面体,球体) 1. 效果图8面体多面体效果图**俩个整8面体效果图**…

学生宿舍信息管理系统

系列文章 任务6 学生宿舍信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试宿舍信息录入宿舍信息浏览查询学生所住宿舍楼号、宿舍号…

WPF MaterialDesign 初学项目实战(6):设计首页(2),设置样式触发器

原项目视频 WPF项目实战合集(2022终结版) 26P 源码地址 WPF项目源码 其他内容 WPF MaterialDesign 初学项目实战(0):github 项目Demo运行 WPF MaterialDesign 初学项目实战(1)首页搭建 WPF MaterialDesign 初学项目实战&…

npm、cnpm、yarn、pnpm区别以及pnpm 是凭什么对 npm 和 yarn 降维打击的

安装 1、安装npm需要安装nodejs,node中自带npm包管理器 node下载地址:node.js 2、cnpm安装(需要安装npm) cnpm是淘宝团队做的npm镜像,淘宝镜像每 10分钟 进行一次同步以保证尽量与官方服务同步。 npm install -g …