#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低功耗停止模式 以及简述判断中断的两种方式相关推荐

  1. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  2. mysql 停从库_不停止 MySQL 服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  3. 不停止MySQL服务增加从库的两种方式

    本文出自51CTO博客博主李振良的技术博客,如有任何问题请进入博主页面互动讨论. 博文地址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产 ...

  4. mysql增加从库_不停止MySQL服务增加从库的两种方式 (装载)

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  5. python入门小项目-判断闰年的两种方法(含代码示例)

    每当问到今年是不是闰年都先要思考一下再给出回答,一个年份的判断还好,多个问起来就得想一会了,虽然在网上也可以查,但在这里,还是和大家分享下用哪个Python怎么去帮我们快速做判断. 我们先搞清楚什么是 ...

  6. stm32进入停止模式,中断 唤醒

    1.程序说明: a.此程序基于HY-STM32开发板. b.自动进入停止模式 c.按键中断实现唤醒 2.完整工程网址 a.基于iar软件 http://download.csdn.net/detail ...

  7. STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  8. STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化

    STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化 1. 介绍 STM32具有多种低功耗模式,当前以STM32L4系列的低功耗模式最为丰富,此处基于STM32L476和STM32 ...

  9. python 执行shellcode_简述获取shellcode的几种方式

    原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...

最新文章

  1. android高仿微信拍照、多选、预览、删除(去除相片)相冊功能
  2. 成功解决TypeError: ‘encoding’ is an invalid keyword argument for this function
  3. 以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是
  4. wpsoffice安卓历史版本_安装老版本的手机APP
  5. Python While 循环语句
  6. vue-router动态路由设置参数可选
  7. 凸优化有关的数值线性代数知识 作业题
  8. 微信公众号迁移公证、迁移申请函办理方法
  9. 智能门锁电路图_智能门锁原理一览 你pick哪一种?
  10. 【Review】数据结构线性表,数组算法(串模式匹配克鲁德、螺旋矩阵四墙)
  11. 房价收入比最高20倍 相关专家认为楼市泡沫已现
  12. 有关南怀瑾、朱熹周易断卦法的个人观点
  13. 【官宣】.NET 6 正式版来了
  14. Steve Hui:云联云是中国云计算的最好切入点(4月刊推荐)
  15. Android后台Kill(二):ActivityManagerService与App现场恢复机制
  16. sql语句关联关系的+号
  17. SDN 实验室学生们
  18. 服务器a卡不能显示,“radeon设置暂时不可用,请连接amd显示卡后重试”怎么解决?...
  19. 网络安全入门:不可不知的8款免费Web安全测试工具
  20. JS个性Hello文字动画js特效

热门文章

  1. 1、Java概述——Java转义字符
  2. Python django鲜花商城
  3. 解决docker中 pytz.exceptions.UnknownTimeZoneError: ‘Etc/UTC‘ 错误
  4. Wordpress或discuz安装异次元分享工具条
  5. PostgreSQL 递归查询(含层级和结构)
  6. 荣耀30能用鸿蒙系统吗,华为荣耀30 Pro开始测试使用鸿蒙OS系统!
  7. sql注入 思路及sqli靶场
  8. 分享 10 个 JS 闭包面试题(图解),进来看看你能答对多少
  9. IP经过路由器都发生了什么
  10. 如何选择验证码短信接口