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

关于停机模式唤醒的问题

[复制链接]
miracle533 提问时间:2018-3-3 09:37 /
阅读主题, 点击返回1楼
收藏 评论28 发布时间:2018-3-3 09:37
28个回答
miracle533 回答时间:2018-3-3 15:11:29
安 发表于 2018-3-3 15:02
进入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();        
         
}
miracle533 回答时间:2018-3-3 15:12:55
是这个意思吗,,我这么配置了还是不行
废鱼 回答时间:2018-3-3 15:26:15
配置放在 RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);后面。
miracle533 回答时间:2018-3-3 15:30:40
安 发表于 2018-3-3 15:26
配置放在 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-3-3 15:45:48
我是如下配置,可以的:
/* 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);
miracle533 回答时间:2018-3-3 15:47:21
安 发表于 2018-3-3 15:45
我是如下配置,可以的:
/* Configure PC13 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GP ...

先谢谢了  我去试一试
废鱼 回答时间:2018-3-3 15:50:11
Std_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);这个是我自己写的。就是配置开启中断。
miracle533 回答时间:2018-3-3 15:52:30
安 发表于 2018-3-3 15:45
我是如下配置,可以的:
/* Configure PC13 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GP ...

咋俩的区别就是按键设置那里,我的是上拉,你设置的是浮空,我的改成浮空以后结果还是不行。。。
只能说是硬件问题了==!
废鱼 回答时间:2018-3-3 15:54:32
你看一下按键波形有没有。正常模式可以产生中断,说明配置没有问题。
miracle533 回答时间:2018-3-3 17:59:44
安 发表于 2018-3-3 15:54
你看一下按键波形有没有。正常模式可以产生中断,说明配置没有问题。

这个按键波形是用软件仿真看的吗?
miracle533 回答时间:2018-3-3 19:47:09
安 发表于 2018-3-3 15:54
你看一下按键波形有没有。正常模式可以产生中断,说明配置没有问题。

麻烦发一下你的进入停止模式的那个函数
miracle533 回答时间:2018-3-4 15:59:30
终于调出来了,主要参考了Ye火关于停机模式的例子,最后总结出来的2个错误经验:1是停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是外部中断的函数,然后是进入停机模式之后的函数,要继续执行下去的话需要在停机模式的函数后面再初始化一下系统时钟函数;2是我的系统时钟初始化函数有错误,初始化以后变为53760000(正确应该是16M,问题的具体原因还没有找到),最后参考原子原有的例程修改了函数。最后调试出来了。(叙述有什么错误还请大佬们纠正一下)

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励,感谢楼主及时处理

查看全部评分

zhongmayitong 回答时间:2018-3-4 23:21:49
学习
废鱼 回答时间:2018-3-5 08:43:59
都是类似的。进入STOP的函数都是一样的。波形用示波器看,STOP唤醒后进入中断,中断中要清除标志位,不然出不来、standby模式,唤醒后直接复位。

评分

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

查看全部评分

12

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版