OpenEdv-开源电子网

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

待机唤醒实验疑问

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-1-12
在线时间
2 小时
发表于 2012-2-17 18:22:39 | 显示全部楼层 |阅读模式
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发 
u8 Check_WKUP(void)
{
 u8 t=0;
 u8 tx=0;//记录松开的次数
 LED0=0; //亮灯DS0
 while(1)
 {
  if(WKUP_KD)//已经按下了
  {
   t++;
   tx=0;
  }else
  {
   tx++; //超过300ms内没有WKUP信号
   if(tx>3)
   {
    LED0=1;
    return 0;//错误的按键,按下次数不够
   }
  }
  delay_ms(30);
  if(t>=100)//按下超过3秒钟
  {
   LED0=0;   //点亮DS0
   return 1; //按下3s以上了
  }
 }

//中断,检测到PA0脚的一个上升沿.  
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{                           
 EXTI->R=1<<0;  //清除LINE10上的中断标志位   
 if(Check_WKUP())//关机?
 {   
  Sys_Enter_Standby();
 }
}
每次进入中断EXTI0_IRQHandler后,都要检测Check_WKUP(),那么只要长按3秒Check_WKUP() 都会返回1,则进入待机状态,请问为什么一次待机一次唤醒?还有唤醒后程序从哪句话开始运行?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-17 20:28:17 | 显示全部楼层
配合后面的程序.
唤醒后从头开始执行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-1-12
在线时间
2 小时
 楼主| 发表于 2012-2-18 10:08:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
请问配合后面哪句程序啊,返回1不就直接进入待机了吗?
唤醒后从main开始吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-18 10:34:04 | 显示全部楼层
要从整体把握.
你把代码看完了么?别断章取义.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-1-12
在线时间
2 小时
 楼主| 发表于 2012-2-18 11:42:23 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
理解了,WKUP唤醒和中断是两回事吧,唤醒不从进中断开始
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-1-12
在线时间
2 小时
 楼主| 发表于 2012-2-18 16:38:58 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我在改写以上代码为调用库函数时,WKUP可以唤醒待机,但是之后就进入systick延时死循环,请问原子哥能不能指点一下:
#include "stm32f10x.h"
#include <stdio.h>
#include "wkup.h"
#include "led.h"
#include "systick.h"
 
//系统进入待机模式
void Sys_Enter_Standby(void)
{  
//关闭所有外设(根据实际情况写)
    RCC->APB2RSTR|=0X01FC;//复位所有IO口
PWR_EnterSTANDBYMode();//进入待机模式
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发
uint8_t Check_WKUP(void) 
{
uint8_t t=0;
uint8_t tx=0;//记录松开的次数
GPIO_ResetBits(GPIOF, GPIO_Pin_6); //亮灯LED1 
while(1)
{
if(WKUP_KD())//已经按下了
{
t++;
tx=0;
}else 
{
tx++; //超过300ms内没有WKUP信号
if(tx>3)
{
GPIO_SetBits(GPIOF, GPIO_Pin_6);
return 0;//错误的按键,按下时间不够
}
}
DelayMS(30);
if(t>=100)//按下超过3秒钟
{
GPIO_ResetBits(GPIOF, GPIO_Pin_6);   //点亮LED1 
return 1; //按下3s以上了
}
}
}  
//中断,检测到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;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //先使能外设IO ORTA时钟    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);     //开启辅助时钟   
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//PA0设置成输入

/* Connect EXTI Line0 to A.0 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

/* Configure EXTI Line0 to generate an interrupt on rising edge */  
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);    
           
//(检查是否是正常开)机      
    if(Check_WKUP()==0)PWR_EnterSTANDBYMode();    //不是开机,进入待机模式 

/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable the EXTI0 Interrupt */
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);
  
/* Generate software interrupt: simulate a rising edge applied on Key Button EXTI line */
   EXTI_GenerateSWInterrupt(EXTI_Line0);
}
uint8_t WKUP_KD(void) 
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) return 1;
  return 0;
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-18 21:41:16 | 显示全部楼层
回复【5楼】shangwei4:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 22:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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