停机模式唤醒:F103C8T6先将PA0挂在EXTI0线上通过按下PA0进入停机模式但按一下PA0没有唤醒

2019-07-14 18:32发布



LZ用的是F103C8T6,先将PA0挂在EXti0线上,然后通过按下PA0进入停机模式,停机模式唤醒的条件是任意EXTI线,所以如果我再按一下PA0就会唤醒,但实际操作中并不可以。不知道是理解错了还是程序的问题,求大佬们指点。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
xiaoge240
1楼-- · 2019-07-15 17:35
ctwewer 发表于 2018-8-16 08:43
楼主应该先测试一下在 正常模式下EXTI0能否响应中断。

我在中断里写的printf输出,在串口上看到的可以进入中断
xiaoge240
2楼-- · 2019-07-15 18:58
 精彩回答 2  元偷偷看……
xiaoge240
3楼-- · 2019-07-15 20:11
换成407试了一下还是不行,下面是进入停机的函数
void Sys_Enter_Standby(void)
{               
  while(WK_UP==0);                        //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)
        printf("停机");
  delay_ms(50);
        RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟                 
         
        PWR_BackupAccessCmd(ENABLE);//后备区域访问使能

        RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
        RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。

        EXTI_ClearITPendingBit(EXTI_Line0);
        EXTI_ClearITPendingBit(EXTI_Line13);       
//        PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
//       
//        PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒
       
//        PWR_EnterSTANDBYMode();        //进入待机模式
       
        PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
       
        SystemInit();        
         
}
TOPCB
4楼-- · 2019-07-16 02:06
resetIO时钟以后,重新设置IO时钟,并且配置外部中断。我没有看到IO口状态的配置和外部中断的配置。
xiaoge240
5楼-- · 2019-07-16 07:48
TOPCB 发表于 2018-8-16 10:04
resetIO时钟以后,重新设置IO时钟,并且配置外部中断。我没有看到IO口状态的配置和外部中断的配置。

按键的配置:
void KEY_Init(void)
{       
  GPIO_InitTypeDef  GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //KEY0 KEY1 KEY2对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOE2,3,4
}

外部中断的配置
void EXTI_Configuration(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);

        EXTI_InitStructure.EXTI_Line=EXTI_Line0;                       
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                   
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);       
       
       
        EXTI_InitStructure.EXTI_Line=EXTI_Line13;                        
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                      
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;            
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);       
}
xiaoge240
6楼-- · 2019-07-16 09:47
这两个中断单独进入中断函数都是可以的,就是不能够唤醒,所以我怀疑要么是上面的void Sys_Enter_Standby()函数错了,要么就是硬件问题了。。

一周热门 更多>