你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
小鹏cyp 提问时间:2018-7-8 22:06 /
进入停机模式 第一次可以唤醒   处理完一些数据  又让他进入停机模式  第二次就唤醒不了了

外部中断唤醒引脚配置如下:
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)
    {
    }
  }
}
时钟配置函数参考的是野火的例程


收藏 评论3 发布时间:2018-7-8 22:06

举报

3个回答
大陶 回答时间:2018-7-9 13:00:17
建议在唤醒后,倍频一下,把时钟恢复到72MHZ

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

小鹏cyp 回答时间:2018-7-10 10:21:09
我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中断里面对标志位进行置位或者复位,这样就可以了。  不知道我说的对不对,希望大神们指正
zero99 回答时间:2018-7-16 15:24:44
小鹏cyp 发表于 2018-7-10 10:21
我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中 ...

楼主可以自己验证下啊
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版