OpenEdv-开源电子网

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

待机唤醒实验中的不明白之处求指教!!!

[复制链接]

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
发表于 2016-7-17 11:13:27 | 显示全部楼层 |阅读模式
1金钱
#include "wkup.h"
#include "led.h"
#include "delay.h"       
#include "usart.h"                                                                                                                                          
//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK STM32F407¿a·¢°å
//′y»ú»½DÑ ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//′′½¨èÕÆú:2014/5/6
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////

//Ïμí3½øèë′y»úÄ£ê½
void Sys_Enter_Standby(void)
{               
  while(WKUP_KD);                        //μè′yWK_UP°′¼üËé¿a(ÔúóDRTCÖD¶Ïê±,±ØDëμèWK_UPËé¿aÔù½øèë′y»ú)

        RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//¸′λËùóDIO¿ú
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//ê1ÄüPWRê±Öó                 
         
        PWR_BackupAccessCmd(ENABLE);//oó±¸Çøóò·ÃÎêê1Äü

        //ÕaàïÎòÃǾíÖ±½ó1رÕÏà1ØRTCÖD¶Ï
        RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//1رÕRTCÏà1ØÖD¶Ï£¬¿éÄüÔúRTCêμÑé′ò¿aáË¡£
        RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//Çå3tRTCÏà1ØÖD¶Ï±ê־λ¡£
       
        PWR_ClearFlag(PWR_FLAG_WU);//Çå3yWake-up ±êÖ¾
       
        PWR_WakeUpPinCmd(ENABLE);//éèÖÃWKUPóÃóú»½DÑ
       
        PWR_EnterSTANDBYMode();        //½øèë′y»úÄ£ê½
         
}
//¼ì2aWKUP½ÅμÄDÅoÅ
//·μ»ØÖμ1:á¬Dø°′ÏÂ3sòÔéÏ
//      0:′íÎóμÄ′¥·¢       
u8 Check_WKUP(void)
{
        u8 t=0;
        u8 tx=0;//¼Ç¼Ëé¿aμÄ′Îêy
        LED0=0; //ááμÆDS0
        while(1)
        {
                if(WKUP_KD)//òѾ-°′ÏÂáË
                {
                        t++;
                        tx=0;
                }else
                {
                        tx++;
                        if(tx>3)//3¬1y90msÄúûóDWKUPDÅoÅ
                        {
                                LED0=1;
                                return 0;//′íÎóμÄ°′¼ü,°′ÏÂ′Îêy2»1»
                        }
                }
                delay_ms(30);
                if(t>=100)//°′ÏÂ3¬1y3ÃëÖó
                {
                        LED0=0;          //μãááDS0
                        return 1; //°′ÏÂ3sòÔéÏáË
                }
        }
}  
//ÖD¶Ï,¼ì2aμ&#189A0½ÅμÄò»¸öéÏéyÑØ.          
//ÖD¶ÏÏß0ÏßéÏμÄÖD¶Ï¼ì2a
void EXTI0_IRQHandler(void)
{                                                                                                  
  EXTI_ClearITPendingBit(EXTI_Line0); // Çå3yLINE10éÏμÄÖD¶Ï±ê־λ
        if(Check_WKUP())//1Ø»ú?
        {                  
                Sys_Enter_Standby(); //½øèë′y»úÄ£ê½
        }
}

//PA0 WKUP»½DÑ3õê¼»ˉ
void WKUP_Init(void)
{          
  GPIO_InitTypeDef  GPIO_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
        EXTI_InitTypeDef   EXTI_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//ê1ÄüSYSCFGê±Öó
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//êäèëÄ£ê½
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//ÏÂà-
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ       

        //(¼ì2éêÇ·ñêÇÕy3£¿a)»ú                     
  if(Check_WKUP()==0)
        {
                Sys_Enter_Standby();        //2»êÇ¿a»ú,½øèë′y»úģ꽠 
        }
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 ᬽóμ½ÖD¶ÏÏß0
       

  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//ÖD¶Ïê¼t
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //éÏéyÑØ′¥·¢
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ê1ÄüLINE0
  EXTI_Init(&EXTI_InitStructure);//ÅäÖÃ
       
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//ía2¿ÖD¶Ï0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//ÇàÕ¼óÅÏ輶2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//×óóÅÏ輶2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ê1Äüía2¿ÖD¶Ïí¨μà
  NVIC_Init(&NVIC_InitStructure);//ÅäÖÃNVIC
       

}

给的教程里的程序,主函数就不粘贴了,我疑惑的是当处于待机状态时,长按3秒唤醒键会开机,此时不松开一直再持续3秒为什么不会再次进入待机状态?















最佳答案

查看完整内容[请看2#楼]

没有再次产生中断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-7-17 11:13:28 | 显示全部楼层
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
 楼主| 发表于 2016-7-17 11:23:50 | 显示全部楼层
龙之谷 发表于 2016-7-17 11:21
没有再次产生中断

是的,刚想明白
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
发表于 2016-10-9 22:14:03 | 显示全部楼层
重新有上升沿才能触发中断吧,一直按住不松开,是高电平,没有上升沿啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 21:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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