小鹏cyp 发表于 2018-7-8 22:06:04

STM32F103VET6低功耗停止模式唤醒不了

进入停机模式 第一次可以唤醒   处理完一些数据又让他进入停机模式第二次就唤醒不了了

外部中断唤醒引脚配置如下:
void EXTI_Key_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    /* config the extiline(PE4) clock and AFIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);

    /* EXTI line gpio config(PE4) */   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;      
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   // ÉÏÀ­ÊäÈë
GPIO_Init(GPIOE, &GPIO_InitStructure);
   

    /* EXTI line(PE4) mode config */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
    EXTI_ClearITPendingBit(EXTI_Line4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //ϽµÑØÖжÏ
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
    EXTI_ClearITPendingBit(EXTI_Line4);   
}
进入停止模式的代码如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);   

唤醒函数如下:
void EXTI4_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line4) != RESET) //È·±£ÊÇ·ñ²úÉúÁËEXTI LineÖжÏ
    {   
      SYSCLKConfig_STOP();                                          //Í£»ú»½ÐѺóÐèÒªÆô¶¯HSE   
//         SystemInit();
      WorkStatusLED_ON;                                                //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
      Delayms(100);   
      WorkStatusLED_OFF;
      Delayms(100);   
      WorkStatusLED_ON;                                                //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
      Delayms(100);   
      WorkStatusLED_OFF;
      Delayms(100);   
      WorkStatusLED_ON;                                                //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
      Delayms(100);   
      WorkStatusLED_OFF;
      Delayms(100);   
      WorkStatusLED_ON;                                                //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
      Delayms(100);   
      WorkStatusLED_OFF;

      EXTI_ClearITPendingBit(EXTI_Line4);   //Çå³ýÖжϱê־λ
         /* ʹÄܵçÔ´¹ÜÀíµ¥ÔªµÄʱÖÓ */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
      /* ½øÈëֹͣģʽ£¬ÉèÖõçѹµ÷½ÚÆ÷ΪµÍ¹¦ºÄģʽ£¬µÈ´ýÖжϻ½ÐÑ*/
      PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
    }
}

void SYSCLKConfig_STOP(void)
{
    ErrorStatus HSEStartUpStatus;
/* ʹÄÜ HSE */
RCC_HSEConfig(RCC_HSE_ON);

/* µÈ´ý HSE ×¼±¸¾ÍÐ÷ */
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{

    /* ʹÄÜ PLL */
    RCC_PLLCmd(ENABLE);

    /* µÈ´ý PLL ×¼±¸¾ÍÐ÷ */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Ñ¡ÔñPLL×÷ΪϵͳʱÖÓÔ´ */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* µÈ´ýPLL±»Ñ¡ÔñΪϵͳʱÖÓÔ´ */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
}
}
时钟配置函数参考的是野火的例程


dataozi 发表于 2018-7-9 13:00:17

建议在唤醒后,倍频一下,把时钟恢复到72MHZ

小鹏cyp 发表于 2018-7-10 10:21:09

我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中断里面对标志位进行置位或者复位,这样就可以了。不知道我说的对不对,希望大神们指正

zero99 发表于 2018-7-16 15:24:44

小鹏cyp 发表于 2018-7-10 10:21
我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中 ...

楼主可以自己验证下啊
页: [1]
查看完整版本: STM32F103VET6低功耗停止模式唤醒不了