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

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

[复制链接]
阳阳NO1 提问时间:2015-6-2 09:26 /
阅读主题, 点击返回1楼
收藏 评论21 发布时间:2015-6-2 09:26
21个回答
阳阳NO1 回答时间:2015-6-2 14:49:32
creep 发表于 2015-6-2 11:01
进入按键唤醒中断后马上调用恢复系统时钟函数SYSCLKConfig_STOP,然后重新初始化该按键引脚关闭掉中断使 ...

我这个引脚是做开关用,呵呵,这种办法我也想过,理论上都行不通,我可能会连续的按下这个按键来测试开关功能,也可能按下这个按键   半年不动它
阳阳NO1 回答时间:2015-6-3 09:18:27
creep 发表于 2015-6-2 11:01
进入按键唤醒中断后马上调用恢复系统时钟函数SYSCLKConfig_STOP,然后重新初始化该按键引脚关闭掉中断使 ...

你这种做法不对,我是做开关按键,所以不适用,我为了消抖,在按键按下进入中断之后,又开了一个定时器,定时时间为10ms,如果定时器时间到,就到定时器中断里面去处理进入stop模式,这么做进入stop模式很灵了,但是外部中断无法唤醒芯片了,我用了EXTI0和EXTI1这两个中断,都没办法唤醒了
stary666 回答时间:2015-6-3 09:21:47
学习了。。。。
creep 回答时间:2015-6-3 09:36:01
阳阳NO1 发表于 2015-6-3 09:18
你这种做法不对,我是做开关按键,所以不适用,我为了消抖,在按键按下进入中断之后,又开了一个定时器, ...

你感觉对就行。
我也是作为开关机按键使用的,感觉特别灵敏,无论开机关机都没有误操作过。
阳阳NO1 回答时间:2015-6-3 10:34:36
creep 发表于 2015-6-3 09:36
你感觉对就行。
我也是作为开关机按键使用的,感觉特别灵敏,无论开机关机都没有误操作过。 ...

我就是感觉IO口的状态切换上不知道什么时机最好,现在的问题是为什么外部中断都无法唤醒芯片了
阳阳NO1 回答时间:2015-6-3 10:41:27
creep 发表于 2015-6-3 09:36
你感觉对就行。
我也是作为开关机按键使用的,感觉特别灵敏,无论开机关机都没有误操作过。 ...

能把你的代码给我参考下吗?非常感谢
creep 回答时间:2015-6-3 11:05:21
阳阳NO1 发表于 2015-6-3 10:41
能把你的代码给我参考下吗?非常感谢

你可以把你的代码贴出来让大家讨论下,外部中断唤不醒会不会是其他问题导致的外部中断没有发生。
阳阳NO1 回答时间:2015-6-3 16:02:50
creep 发表于 2015-6-3 11:05
你可以把你的代码贴出来让大家讨论下,外部中断唤不醒会不会是其他问题导致的外部中断没有发生。 ...

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都唤醒不了,这个问题都困扰我三天了

creep 回答时间:2015-6-3 16:22:32
阳阳NO1 发表于 2015-6-3 16:02
void EXTI0_1_IRQHandler(void)
{
    unsigned int i;

使用这种方法一次也没有唤醒过吗?可不可以贴一下sys_sleep_all();的代码
阳阳NO1 回答时间:2015-6-3 16:36:03
void sys_sleep_all(void)
{   
        PWM_For_Light_Start(0);                                            /*关灯*/
        TIM16_For_Tick_Stop();                                                   /*关定时器*/
        red_light_switch_control(LIGHT_OFF);
        green_light_switch_control(LIGHT_OFF);
        yellow_light_switch_control(LIGHT_OFF);
}这种方法就是直接在中断函数里面调用上面几个函数。


我的第一种处理方式就是在main函数的while(1)里面直接调用
void MCU_State_Change(void)
{
    if(b_mcu_exti_has_intterrupt )   /*只在直流下起左右*/
    {
        b_mcu_exti_has_intterrupt = 0;
        if(mcu_state == MCU_IS_STOP)
                {                  
                   mcu_state = MCU_IS_RUNNING;
                   SYSCLKConfig_STOP();
                   PWM_For_Light_Start(10);                                                  /*开灯*/
                   TIM16_For_Tick_Start();                                                  /*开定时器*/
                }
                else if(mcu_state == MCU_IS_RUNNING)
                {                    
                    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);
                }
        }
}   


然后在中断函数里面使b_mcu_exti_has_intterrupt = 1;这种方式就是很多误动作,有时按几下才能进入stop

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版