你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
creep 发表于 2015-6-3 09:36 你感觉对就行。 我也是作为开关机按键使用的,感觉特别灵敏,无论开机关机都没有误操作过。 ...
阳阳NO1 发表于 2015-6-3 10:41 能把你的代码给我参考下吗?非常感谢
creep 发表于 2015-6-3 11:05 你可以把你的代码贴出来让大家讨论下,外部中断唤不醒会不会是其他问题导致的外部中断没有发生。 ...
阳阳NO1 发表于 2015-6-3 16:02 void EXTI0_1_IRQHandler(void) { unsigned int i;
creep 发表于 2015-6-2 09:40 进入中断后时钟切换到内部8M时钟,唤醒后要重新配置系统时钟。
能把你的代码给我参考下吗?非常感谢
你可以把你的代码贴出来让大家讨论下,外部中断唤不醒会不会是其他问题导致的外部中断没有发生。
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都唤醒不了,这个问题都困扰我三天了
使用这种方法一次也没有唤醒过吗?可不可以贴一下sys_sleep_all();的代码
{
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
请教大神,现在也需要做按键唤醒的实现
请问进入外部中断后是系统自动进入内部的8M时钟还是自己去设置的
,还有就是清除所有中断标志位后要恢复系统时钟再进入standby模式吗?