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

stm32f030f4p6进入stop模式再次唤醒时钟变慢

[复制链接]
阳阳NO1 提问时间:2015-6-2 09:26 /
          这几天在调试stm32f030f4p6这颗芯片进入stop模式,然后被唤醒,我是用PA1做的,PA1配置成外部下降沿中断,来做开关键:板子开机  ->  按下PA1  ->  芯片进入stop模式  ->  按下PA1  ->  外部中断将芯片唤醒   。。。

程序处理如下:
void EXTI0_1_IRQHandler(void)

{
        if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
        {               
            if(mcu_state == MCU_IS_RUNNING)
                         mcu_state = MCU_IS_STOP;
                else if(mcu_state == MCU_IS_STOP)
                         mcu_state = MCU_IS_RUNNING;
                b_mcu_exti_has_intterrupt = 1;
                EXTI_ClearITPendingBit(EXTI_Line1);
        }

}
然后在main里面:
void MCU_State_Change(void)
{
    if(b_mcu_exti_has_intterrupt)  
    {
        b_mcu_exti_has_intterrupt = 0;
        if(mcu_state == MCU_IS_RUNNING)
                {                  
                  
                }
                else if(mcu_state == MCU_IS_STOP)
                {                    
                    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                        NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);                        
                        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
                }
        }
}
现在发现两个问题:
1.感觉按键不是很灵敏,有时要按几下才能进入休眠,有时休眠要按几下才能唤醒,外部中断我仿真过,每次按下按键都能进到中断里面。

2.芯片进入stop模式之后被唤醒,时钟明显感觉变慢了,我在数码管上做了TIM16计数,我后来在:
if(mcu_state == MCU_IS_RUNNING)
{
          TIM16_For_Tick_Start();                                                  /*开定时器*/
}
这里又将TIM16初始化了一次,感觉还是慢了,不知道是什么问题




收藏 评论21 发布时间:2015-6-2 09:26

举报

21个回答
creep 回答时间:2015-6-2 09:52:24
至于按键不灵敏的情况,既然你每次按下按键都能进入到外部中断说明不是按键响应而是某些原因导致程序没能够进入STOP休眠模式。比如手册上说的这些:
If Flash memory programming is ongoing, the Stop mode entry is delayed until the memory
access is finished.
If an access to the APB domain is ongoing, The Stop mode entry is delayed until the APB
access is finished.
creep 回答时间:2015-6-2 09:40:09
进入中断后时钟切换到内部8M时钟,唤醒后要重新配置系统时钟。
  1. /**
  2.   * @brief  Configures system clock after wake-up from STOP: enable HSE, PLL
  3.   *         and select PLL as system clock source.
  4.   * @param  None
  5.   * @retval None
  6.   */
  7. static void SYSCLKConfig_STOP(void)
  8. {  
  9.   /* After wake-up from STOP reconfigure the system clock */
  10.   /* Enable HSE */
  11.   RCC_HSEConfig(RCC_HSE_ON);
  12.   
  13.   /* Wait till HSE is ready */
  14.   while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
  15.   {}
  16.   
  17.   /* Enable PLL */
  18.   RCC_PLLCmd(ENABLE);
  19.   
  20.   /* Wait till PLL is ready */
  21.   while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  22.   {}
  23.   
  24.   /* Select PLL as system clock source */
  25.   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  26.   
  27.   /* Wait till PLL is used as system clock source */
  28.   while (RCC_GetSYSCLKSource() != 0x08)
  29.   {}
  30. }
复制代码
stary666 回答时间:2015-6-2 09:28:23
没遇到过,换个板子或芯片试试
阳阳NO1 回答时间:2015-6-2 10:22:33
creep 发表于 2015-6-2 09:52
至于按键不灵敏的情况,既然你每次按下按键都能进入到外部中断说明不是按键响应而是某些原因导致程序没能够 ...

你说的太对了,我在唤醒的地方加了个SystemInit()就没问题了,应该是进入stop的时候程序执行到哪里,唤醒之后接着从这里执行吧,关于按键的问题,我想有可能是因为按键抖动的原因,我在查查,非常感谢您
阳阳NO1 回答时间:2015-6-2 10:25:06
creep 发表于 2015-6-2 09:40
进入中断后时钟切换到内部8M时钟,唤醒后要重新配置系统时钟。

这个代码是你自己写的吗?   我在我的库文件里面找不到这个函数,我直接复制你的这段代码,试了下,也可以的,非常感谢
creep 回答时间:2015-6-2 10:33:44
本帖最后由 creep 于 2015-6-2 10:36 编辑
阳阳NO1 发表于 2015-6-2 10:22
你说的太对了,我在唤醒的地方加了个SystemInit()就没问题了,应该是进入stop的时候程序执行到哪里,唤醒 ...

不要用SystemInit(),直接用我上面的那个代码SYSCLKConfig_STOP(void),因为调用SystemInit()的时间可能会大于SYSCLKConfig_STOP,这对于实时性要求高的系统是恢复系统时钟越快越好。唤醒之后从PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);后面的代码接着执行。
creep 回答时间:2015-6-2 10:34:28
本帖最后由 creep 于 2015-6-2 10:37 编辑
阳阳NO1 发表于 2015-6-2 10:25
这个代码是你自己写的吗?   我在我的库文件里面找不到这个函数,我直接复制你的这段代码,试了下,也可 ...

这个是官方提供的一个函数,你可以试着让系统启动后自动进入休眠模式然后再自动唤醒或者按键唤醒,这个可以测试是不是按键的问题。
阳阳NO1 回答时间:2015-6-2 10:44:43
creep 发表于 2015-6-2 10:34
这个是官方提供的一个函数,你可以试着让系统启动后自动进入休眠模式然后再自动唤醒或者按键唤醒,这个可 ...

我仿真看了下,有的时候连着发生了两次中断,这才是问题的根源,暂时还没想到什么办法
creep 回答时间:2015-6-2 11:01:55
阳阳NO1 发表于 2015-6-2 10:44
我仿真看了下,有的时候连着发生了两次中断,这才是问题的根源,暂时还没想到什么办法 ...

进入按键唤醒中断后马上调用恢复系统时钟函数SYSCLKConfig_STOP,然后重新初始化该按键引脚关闭掉中断使能,等需要进入时再次配置为中断引脚。
123下一页

所属标签

相似问题

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