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

2019-07-14 17:01发布

          这几天在调试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初始化了一次,感觉还是慢了,不知道是什么问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
亲爱的娜娜
1楼-- · 2019-07-15 00:41
至于按键不灵敏的情况,既然你每次按下按键都能进入到外部中断说明不是按键响应而是某些原因导致程序没能够进入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.
nyvvhxcs
2楼-- · 2019-07-15 05:41
没遇到过,换个板子或芯片试试
60user142
3楼-- · 2019-07-15 08:42
亲爱的娜娜 发表于 2018-10-11 07:59
至于按键不灵敏的情况,既然你每次按下按键都能进入到外部中断说明不是按键响应而是某些原因导致程序没能够进入STOP休眠模式。比如手册上说的这些:
If Flash memory programming is ongoing, the Stop mode entry is delayed until the memory
access is finished.

你说的太对了,我在唤醒的地方加了个SystemInit()就没问题了,应该是进入stop的时候程序执行到哪里,唤醒之后接着从这里执行吧,关于按键的问题,我想有可能是因为按键抖动的原因,我在查查,非常感谢您
60user142
4楼-- · 2019-07-15 12:38
 精彩回答 2  元偷偷看……
亲爱的娜娜
5楼-- · 2019-07-15 17:38
60user142 发表于 2018-10-11 08:22
你说的太对了,我在唤醒的地方加了个SystemInit()就没问题了,应该是进入stop的时候程序执行到哪里,唤醒之后接着从这里执行吧,关于按键的问题,我想有可能是因为按键抖动的原因,我在查查,非常感谢您

本帖最后由 creep 于 2015-6-2 10:36 编辑

不要用SystemInit(),直接用我上面的那个代码SYSCLKConfig_STOP(void),因为调用SystemInit()的时间可能会大于SYSCLKConfig_STOP,这对于实时性要求高的系统是恢复系统时钟越快越好。唤醒之后从PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);后面的代码接着执行。
亲爱的娜娜
6楼-- · 2019-07-15 17:41
60user142 发表于 2018-10-11 08:30
这个代码是你自己写的吗?   我在我的库文件里面找不到这个函数,我直接复制你的这段代码,试了下,也可以的,非常感谢

本帖最后由 creep 于 2015-6-2 10:37 编辑

这个是官方提供的一个函数,你可以试着让系统启动后自动进入休眠模式然后再自动唤醒或者按键唤醒,这个可以测试是不是按键的问题。

一周热门 更多>