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

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个回答
dataozi 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版