Stm32待机模式的进入与唤醒

2023-11-15

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();  
	}
} 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stm32待机模式的进入与唤醒 的相关文章

  • 配置服务器实现无缝连接

    在进行网络爬虫时 经常会面临目标网站的IP封锁 反爬虫策略等问题 为了解决这些问题 配置代理服务器是一种常见的方法 本文将向您介绍如何配置代理服务器与爬虫实现无缝连接 助您顺利进行数据采集 一 了解代理服务器的作用 代理服务器充当中间人的角
  • vue3.0 vue.config.js 配置实战

    项目常用配置 const path require path const UglifyJsPlugin require uglifyjs webpack plugin function resolve dir return path joi
  • MIUI11系统详细卡刷开发版获取Root超级权限的步骤

    小米的机器不同手机型号一般情况官方论坛都提供两个不同的系统 它们是稳定版和开发版 稳定版没有提供root权限管理 开发版中就提供了root权限 很多情况下我们需要使用的一些功能强大的工具 都需要在root权限下工作 就比如我们公司在使用的营

随机推荐

  • 2、应用入口类 SpringbootApplication&核心注解

    官网 https docs spring io spring boot docs 2 5 8 SNAPSHOT reference htmlsingle getting started installing 核心注解分析 许多 Spring
  • 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    Postgresql 触发器某个字段更新时执行 行插入或更新执行 1 postgresql触发器 2 触发器的创建及示例 1 字段更新时 触发 2 行插入或更新时 触发 3 触发器的删除 4 触发器的坑 参考 1 postgresql触发器
  • 服务器好玩的项目_推荐!github上四个与100有关的优质项目

    编辑 zero 关注 搜罗最好玩的计算机视觉论文和应用 AI算法与图像处理 微信公众号 获得第一手计算机视觉相关信息 今天要分享四个非常优质的开源项目 一定能够有效的提升你的coding能力 1 Python 100天从新手到大师 2 10
  • 机器学习基础学习-多元线性回归问题(梯度下降法实现)

    1 基本概念 在之前的博客当中描述了怎样模拟出了梯度下降的过程 如果是多维情况 theta其实是一个向量 那么对其求导的损失函数也是向量 梯度就是损失函数对每个方向的theta求偏导 和之前的一维线性回归相比 我们对只是对w这个数字进行求导
  • VC++ CComboBox自绘(颜色下拉列表框)

    使用前 请将控件的Style属性设置为DropdownList 下拉列表 Owner Draw设置为Fixed Has Strings设置为TRUE 效果图如下 头文件声明 CSWColorComboBox h pragma once in
  • 关于C++ 对象私有成员不可访问的理解误区

    C 中对象的私有成员是否可以被别的对象访问 答案是肯定的 但是分场合 同一个类 友元类 什么情况下可以访问C 对象的私有成员呢 首先 C 私有成员不可以直接访问是个错误理解 C 对象的私有成员在类内是可以访问的 请注意是类内而不仅仅是对象内
  • Flink自定义实现ElasticSearch Table Source

    Flink版本 1 12 1 ES Maven版本 elasticsearch rest client 6 3 1 FLINK TableSource官方文档 https ci apache org projects flink flink
  • minio搭建图床 配合typora实现写博客图片自动上传

    minio搭建图床 配合typora实现写博客图片自动上传 1 搭建minio 查看博客 http www weinigb cn info blogOid 32 2 使用脚本 python 使用之前需要添加依赖 分别需要添加 minio r
  • Binder (一) mmap与一次拷贝原理

    Binder机制 跨进程通信IPC 远程过程调用手段RPC 4个角色进行粘合 Client Server Service Manager和Binder驱动程序 整个过程只需要一次拷贝 Binder Driver misc设备 dev bin
  • 【已更新】2023电工杯数学建模B题完整代码 持续更新

    已给出第一问详细代码 完整获取链接为 https mbd pub o bread ZJmXmpxt import pandas as pd import numpy as np from sklearn preprocessing impo
  • TCP与UDP协议

    TCP与UDP协议 TCP报文格式 UDP报文格式 TCP与UDP协议的比较 TCP报文格式 源端口 2字节 标识报文的返回地址 目的端口 2字节 指明接收方计算机上的应用程序接口 序号 4字节 大约21亿的范围 序号 即seq 指明本报文
  • 中国人的开源[转]

    中国人的开源 何谓开源 顾名就可以思意 开放源码 国外的开源社区比国内起步早是事实 而国内某些知名人士口口声声说中国的开源需要开源基金 需要支持 基金有了 出现了中国人的开源社区 并且建立了旗下网站 这样就是中国人的开源了 某个开源社区里经
  • C语言-程序设计基础-常量、变量、标识符

    2 1常量 变量 标识符 2 1 1标识符 定义 标识符就是一个名称 用来表示变量 常量 函数以及文件等名称 格式 合法的标识符由字母 大 小写均可 数字和下划线组成 并且必须以字母或下划线开头 注 1 C语言是一种对大小写敏感的语言 所以
  • postgres格式化时间_在postgresql数据库中判断是否是数字和日期时间格式函数操作...

    在编写GreenPlum函数的过程中 遇到要判断字符串是否是数字和日期格式的情况 基于GreenPlum和postgresql的亲缘关系 找到了下面两个函数 1 判断字符串是否是数字 CREATE OR REPLACE FUNCTION i
  • CVPR2017-目标检测相关

    1 Speed accuracy trade offs for modern convolutional object detectors 其主要考虑三种检测器 Faster RCNN R FCN SSD 作为元结构 三种CNN网络 VGG
  • Python 处理 ini 文件 的模块

    Python 处理 ini 文件 的模块 1 ini 文件 2 configparser 模块 2 1 语法介绍 2 2 操作示例 1 ini 文件 ini 文件是 Initialization File 的缩写 即初始化文件 ini 文件
  • 面向安全数据包分析

    网络安全是一个十分重要的话题 但是它同时也是一个十分复杂的问题 各种针对网络的攻击手段层出不穷 对于网络的守护者来说 将这些手段进行分类是一个十分棘手的工作 网络安全是一个非常复杂的问题 所以我们按照TCP IP分层的方式 对网络中的常见攻
  • 浅谈测试开发岗位

    一 测试开发的概念与需求 测试开发 通常也被称为自动化测试 是一个涵盖了从测试设计 开发 执行和结果分析等一系列活动的职位 在软件开发的生命周期中 测试开发起着至关重要的作用 其主要目标是确保软件的质量和性能达到预期的标准 测试开发工程师通
  • MySQL查看当前数据库视图-SQL语句

    引言 查询语句为 show full tables where table type 可查询当前数据库表 一 创建一个视图 创建视图 create view v stu as 视图内容 连接的一个表 select name from t s
  • Stm32待机模式的进入与唤醒

    1 基础介绍 1 1 单片机的 低功耗模式 像是手机的待机模式 不同于正常运行模式 处于一种省电省资源的状态 1 2 在运行情况下 HCLK为cpu提供时钟 cortex m3内核执行程序的代码 如果处于中断事件的等待时 可以进入低功耗模式