OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7429|回复: 2

待机与唤醒问题

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-24
在线时间
0 小时
发表于 2012-11-18 11:33:55 | 显示全部楼层 |阅读模式

#include "wkup.h"
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"

#include "stm32f10x_it.h"

//void SysTick_Init(void);
// 
////THUMB指令不支持汇编内联
////采用如下方法实现执行汇编指令WFI
////CHECK OK
////091209
__asm void WFI_SET(void)
{
     WFI;   
}
//
////进入待机模式 
////check ok
////091202
void Sys_Standby(void)
{
      SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)    
      RCC->APB1ENR|=1<<28;     //使能电源时钟     
      PWR->CSR|=1<<8;          //设置WKUP用于唤醒
      PWR->CR|=1<<2;           //清除Wake-up 标志
      PWR->CR|=1<<1;           //PDDS置位    
      WFI_SET();     //执行WFI指令  
}


//系统进入待机模式
void Sys_Enter_Standby(void)
{   
 //关闭所有外设(根据实际情况写)
    RCC->APB2RSTR|=0X01FC;//复位所有IO口
 Sys_Standby();//进入待机模式
}

//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发 
u8 Check_WKUP(void)
{
 uint8_t t=0;
 uint8_t tx=0;//记录松开的次数
 SysTick_Init();
 LED1(ON); //亮灯DS0
 while(1)
 {
  if(WKUP_KD)//已经按下了
  {
   t++;
   tx=0;
  }else
  {
   tx++; //超过300ms内没有WKUP信号
   if(tx>3)
   {
    LED1(OFF);
    return 0;//错误的按键,按下次数不够
   }
  }
  delay_ms(30);
  if(t>=100)//按下超过3秒钟
  {
   LED1(ON);   //点亮DS0
   return 1; //按下3s以上了
  }
 }

//中断,检测到PA0脚的一个上升沿.  
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{  
   if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确保是否产生了EXTI Line中断
   {
         EXTI_ClearITPendingBit(EXTI_Line0);     //清除中断标志位

       if(Check_WKUP())//关机?
      { 
         Sys_Enter_Standby(); 
      }
   }
 
}

static void NVIC_Configuration(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;

    /* Configure  bit for preemption priority */
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   
    /* 配置P[A|B|C|D|E]0为中断源 */
   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
}
 
//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{      
     GPIO_InitTypeDef GPIO_InitStructure;
   EXTI_InitTypeDef EXTI_InitStructure;
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);

   NVIC_Configuration();

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;      
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  // 上拉输入
         GPIO_Init(GPIOA, &GPIO_InitStructure);

   if(Check_WKUP()==0)  Sys_Standby();

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
 
   EXTI_InitStructure.EXTI_Line = EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
//   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿中断
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

}

以上是我参考写出来的程序,程序输入32机子后,可以唤醒,但是没法再让它进入了睡眠模式,我把PA0的中断单独出来运行,还是可以的,请问,我是不是漏了哪些步骤?

 

 

 

 

 

 


 

规划人生,追逐梦想
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-18 13:12:47 | 显示全部楼层
回复【楼主位】杨志:
---------------------------------
 是不是没有长按三秒?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-24
在线时间
0 小时
 楼主| 发表于 2012-11-22 19:32:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
是的,已经搞定了,谢谢
规划人生,追逐梦想
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 21:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表