STM32低功耗停止模式 以及简述判断中断的两种方式
#include "wkup.h"
#include "led.h"
#include "delay.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//待机唤醒 代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/7
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//#if 0
void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry); //睡眠模式
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); //停机模式
void PWR_EnterSTANDBYMode(void); //待机模式
#define PWR_Regulator_ON //电源不进低功耗 唤醒基本没延迟
#define PWR_Regulator_LowPower //电源进去低功耗 不过唤醒启动有一点延迟 #define PWR_STOPEntry_WFI //中断唤醒
#define PWR_STOPEntry_WFE //事件唤醒#endifint exitflag;
void Sys_Standby(void)
{
// NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能//PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式 待机模式 // 任意中断 事件//PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI|PWR_STOPEntry_WFE);//停机模式模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);}
//系统进入待机模式
void Sys_Enter_Standby(void)
{ //RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口Sys_Standby();//SystemInit();//重要,由于停机下对所有时钟关闭,所以唤醒需要重新配置时钟!
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
// 0:错误的触发
u8 Check_WKUP(void)
{u8 t=0; //记录按下的时间LED0=0; //亮灯DS0 while(1){if(WKUP_KD){t++; //已经按下了 delay_ms(30);//N190729164522608323if(t>=100) //按下超过3秒钟{LED0=0; //点亮DS0 return 1; //按下3s以上了}}else { LED0=1;return 0; //按下不足3秒}}
}
//中断,检测到PA0脚的一个上升沿.
//中断线0线上的中断检测//PA0 WKUP唤醒初始化
void STOP_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOARCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//另外, STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入
//源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1; //PA.0 PA.1GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化IO//使用外部中断方式GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, 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); // 初始化外部中断//使用外部中断方式GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1); //中断线0连接GPIOA.1EXTI_InitStructure.EXTI_Line = EXTI_Line1; //设置按键所有的外部线路EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ; // 下降沿触发EXTI_Trigger_Falling 上升沿触发EXTI_Trigger_RisingEXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中断通道EXTI_Init(&EXTI_InitStructure); // 初始化外部中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //从优先级2级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //从优先级2级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器}void EXTI0_IRQHandler(void)
{ if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //按压检测口中断信号出现 判断中断是否发生{ exitflag++;
Sys_Standby(); //执行中断事件?
//LED0=0;
//SystemInit(); EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位EXTI_ClearFlag(EXTI_Line0); // 清除LINE10上的中断标志位 }
}
// EXTI_ClearFlag// 清除LINE10上的中断标志位
//EXTI_GetFlagStatus If(EXTI_GetFlagStatus(EXTI_Line3)!-=RESET)//判断是否置位
//EXTI_GetITStatus()会先判断该中断是否使能,若使能了再判断中断标志位,
//而EXTI_GetFlagStatus()直接判断中断标志位是否置位。
//所以说方式的EXTI_GetITStatus()会好点,一般配合EXTI_ClearITPendingBit()使用void NVIC_CoreReset(void)
{__DSB(); /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |SCB_AIRCR_VECTRESET_Msk ); /* Keep priority group unchanged */__DSB(); /* Ensure completion of memory access */for(;;) /* wait until reset */{__NOP();}
}
void EXTI1_IRQHandler(void)
{ if(EXTI_GetITStatus(EXTI_Line1)!=RESET) //按压检测口中断信号出现{ SystemInit();__set_FAULTMASK(1); //关闭所有中断NVIC_SystemReset(); //复位 NVIC_CoreReset();RTC_WaitForLastTask();LED0=1;PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能EXTI_ClearITPendingBit(EXTI_Line1); // 清除LINE11上的中断标志位EXTI_ClearITPendingBit(EXTI_Line1); // 清除LINE11上的中断标志位EXTI_ClearFlag(EXTI_Line1); // 清除LINE11上的中断标志位}}
STM32低功耗停止模式 以及简述判断中断的两种方式相关推荐
- mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- mysql 停从库_不停止 MySQL 服务增加从库的两种方式
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- 不停止MySQL服务增加从库的两种方式
本文出自51CTO博客博主李振良的技术博客,如有任何问题请进入博主页面互动讨论. 博文地址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产 ...
- mysql增加从库_不停止MySQL服务增加从库的两种方式 (装载)
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- python入门小项目-判断闰年的两种方法(含代码示例)
每当问到今年是不是闰年都先要思考一下再给出回答,一个年份的判断还好,多个问起来就得想一会了,虽然在网上也可以查,但在这里,还是和大家分享下用哪个Python怎么去帮我们快速做判断. 我们先搞清楚什么是 ...
- stm32进入停止模式,中断 唤醒
1.程序说明: a.此程序基于HY-STM32开发板. b.自动进入停止模式 c.按键中断实现唤醒 2.完整工程网址 a.基于iar软件 http://download.csdn.net/detail ...
- STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化
STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化 1. 介绍 STM32具有多种低功耗模式,当前以STM32L4系列的低功耗模式最为丰富,此处基于STM32L476和STM32 ...
- python 执行shellcode_简述获取shellcode的几种方式
原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...
最新文章
- android高仿微信拍照、多选、预览、删除(去除相片)相冊功能
- 成功解决TypeError: ‘encoding’ is an invalid keyword argument for this function
- 以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是
- wpsoffice安卓历史版本_安装老版本的手机APP
- Python While 循环语句
- vue-router动态路由设置参数可选
- 凸优化有关的数值线性代数知识 作业题
- 微信公众号迁移公证、迁移申请函办理方法
- 智能门锁电路图_智能门锁原理一览 你pick哪一种?
- 【Review】数据结构线性表,数组算法(串模式匹配克鲁德、螺旋矩阵四墙)
- 房价收入比最高20倍 相关专家认为楼市泡沫已现
- 有关南怀瑾、朱熹周易断卦法的个人观点
- 【官宣】.NET 6 正式版来了
- Steve Hui:云联云是中国云计算的最好切入点(4月刊推荐)
- Android后台Kill(二):ActivityManagerService与App现场恢复机制
- sql语句关联关系的+号
- SDN 实验室学生们
- 服务器a卡不能显示,“radeon设置暂时不可用,请连接amd显示卡后重试”怎么解决?...
- 网络安全入门:不可不知的8款免费Web安全测试工具
- JS个性Hello文字动画js特效
热门文章
- 1、Java概述——Java转义字符
- Python django鲜花商城
- 解决docker中 pytz.exceptions.UnknownTimeZoneError: ‘Etc/UTC‘ 错误
- Wordpress或discuz安装异次元分享工具条
- PostgreSQL 递归查询(含层级和结构)
- 荣耀30能用鸿蒙系统吗,华为荣耀30 Pro开始测试使用鸿蒙OS系统!
- sql注入 思路及sqli靶场
- 分享 10 个 JS 闭包面试题(图解),进来看看你能答对多少
- IP经过路由器都发生了什么
- 如何选择验证码短信接口