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条回答
60user142
2019-07-17 00:58
亲爱的娜娜 发表于 2018-10-11 10:49
你可以把你的代码贴出来让大家讨论下,外部中断唤不醒会不会是其他问题导致的外部中断没有发生。

void EXTI0_1_IRQHandler(void)
{
    unsigned int i;
        for(i=0;i<200;i++);
        if(EXTI_GetITStatus(EXTI_Line0)!= RESET )
        {               
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
                     b_current_source = CURRENT_FORM_BAT;
                else
                     b_current_source = CURRENT_FORM_AC;

                b_current_has_change = 1;

                if(mcu_state == MCU_IS_STOP)   
                {
                        Wakeup_Form_Stop_Mode();
                }
                EXTI_ClearITPendingBit(EXTI_Line0);
        }               
        else if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
        {                            
                EXTI_ClearITPendingBit(EXTI_Line1);
                if(mcu_state == MCU_IS_RUNNING)
                {
                        Enter_Stop_Mode();
                }
                else
                {
                    Wakeup_Form_Stop_Mode();
                }
        }
       
}

void  Enter_Stop_Mode(void)
{
           mcu_state = MCU_IS_STOP;
           sys_sleep_all();
           NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);
           RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);                  
           PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
}

void Wakeup_Form_Stop_Mode(void)
{
           mcu_state = MCU_IS_RUNNING;
           SYSCLKConfig_STOP();
           PWM_For_Light_Start(10);                                           
           TIM16_For_Tick_Start();                                       
}
我还好是退回到最开始的那种做法了,不用定时器,按下按键进入中断,在中断里面判断当前芯片的状态,然后修改状态,执行相应的程序,这种做法休眠是进去了,但是休眠之后按此按键  还是唤醒不了芯片 PA0 PA1都唤醒不了,这个问题都困扰我三天了

一周热门 更多>