STM32/STM8技术william hill官网
直播中

廉雁捷

7年用户 263经验值
私信 关注
[问答]

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



LZ用的是F103C8T6,先将PA0挂在EXti0线上,然后通过按下PA0进入停机模式,停机模式唤醒的条件是任意EXTI线,所以如果我再按一下PA0就会唤醒,但实际操作中并不可以。不知道是理解错了还是程序的问题,求大佬们指点。。

回帖(28)

孙婷婷

2018-8-16 08:08:27
楼主用的是什么模式?stadbay还是STOP?
举报

廉雁捷

2018-8-16 08:20:23
引用: TOPCB 发表于 2018-8-16 08:08
楼主用的是什么模式?stadbay还是STOP?

standby模式
举报

孙婷婷

2018-8-16 08:32:29
STANDBY只能通过wakeup、RTC唤醒。
举报

何秀珍

2018-8-16 08:43:09
楼主应该先测试一下在 正常模式下EXTI0能否响应中断。
举报

廉雁捷

2018-8-16 08:51:28
引用: TOPCB 发表于 2018-8-16 08:32
STANDBY只能通过wakeup、RTC唤醒。

好的  我改成stop模式试一下,,话说我上边理解的那些没问题吧。。
举报

孙婷婷

2018-8-16 08:58:05
STOP模式是exit可以唤醒的。
举报

廉雁捷

2018-8-16 09:16:20
引用: TOPCB 发表于 2018-8-16 08:58
STOP模式是exit可以唤醒的。

好的  谢谢
举报

廉雁捷

2018-8-16 09:34:35
引用: ctwewer 发表于 2018-8-16 08:43
楼主应该先测试一下在 正常模式下EXTI0能否响应中断。

我在中断里写的printf输出,在串口上看到的可以进入中断
举报

廉雁捷

2018-8-16 09:46:03
引用: TOPCB 发表于 2018-8-16 08:58
STOP模式是exit可以唤醒的。

试了还是不行啊  按键都快按烂了还是没有任何反应。。
举报

廉雁捷

2018-8-16 09:52:33
换成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();        
         
}
举报

孙婷婷

2018-8-16 10:04:30
resetIO时钟以后,重新设置IO时钟,并且配置外部中断。我没有看到IO口状态的配置和外部中断的配置。
举报

廉雁捷

2018-8-16 10:14:23
引用: 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);       
}
举报

廉雁捷

2018-8-16 10:28:18
这两个中断单独进入中断函数都是可以的,就是不能够唤醒,所以我怀疑要么是上面的void Sys_Enter_Standby()函数错了,要么就是硬件问题了。。
举报

孙婷婷

2018-8-16 10:36:10
进入STOP模式之前,重新配置一下对应IO时钟、中断配置。
举报

廉雁捷

2018-8-16 10:48:46
引用: TOPCB 发表于 2018-8-16 10:36
进入STOP模式之前,重新配置一下对应IO时钟、中断配置。

void Sys_Enter_Standby(void)   
{               
       
        SystemInit();

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);        /* 84MHZ*/
               

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);


        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE);               

        KEY_Init();   //这个是配置按键IO口的函数
        EXTI_Configuration();        //这个是配置中断的函数
                       
        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);
        EXTI_ClearITPendingBit(EXTI_Line2);       
       
//        PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
//       
//        PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒
       
//        PWR_EnterSTANDBYMode();        //进入待机模式
       
        PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
       
        SystemInit();        
         
}
举报

廉雁捷

2018-8-16 11:01:17
是这个意思吗,,我这么配置了还是不行
举报

孙婷婷

2018-8-16 11:12:29
配置放在 RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);后面。
举报

廉雁捷

2018-8-16 11:27:49
引用: TOPCB 发表于 2018-8-16 11:12
配置放在 RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);后面。

还是不能唤醒。。
void Sys_Enter_Standby(void)
{               

  while(WK_UP==0);                        //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)
        printf("停机,重新配置");
  delay_ms(50);
        RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
       
        SystemInit();

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);        /* 84MHZ*/
               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);/* 168MHZ */

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE);               

        KEY_Init();            /* 按键配置 */
        EXTI_Configuration();        /* 外部中断配置 */
       
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟                 

        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);
        EXTI_ClearITPendingBit(EXTI_Line2);       
                       
        PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);                 
}
举报

孙婷婷

2018-8-16 11:34:04
我是如下配置,可以的:
/* Configure PC13 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Connect EXTI Line13 to PC13 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
  /* EXTI configuration *********************************************************/
  EXTI_ClearITPendingBit(EXTI_Line13);
  EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);  
  /* Enable the RTC Alarm Interrupt */
        Std_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  EXTI_ClearITPendingBit(EXTI_Line13);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分