我现在要在一个中断线上同时实现中断和事件有没有可能呢?
为什么要这样呢,原因是我想让外部中断线EXTI5的中断来让MCU进入停止模式
也要让外部中断线EXTI5的中断来让MCU从停止模式唤醒,怎么实现呢?
于是我想,事件不是可以不执行外部中断服务程序嘛,但是这样就矛盾了,我到底设事件呢还是中断呢?
程序如下:
void EXTI9_5_IRQHandler (void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
LcdDisZimo0808(4,64,'4',0);
LcdDisZimo0808(5,64,'5',0);
LcdDisZimo0808(6,64,'6',0);
LcdDisZimo0808(7,64,'7',0);
LcdRefreshAll();
Delay(10000);
PWR_EnterSTOPMode (PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
RCC_Configuration(); //初始化时钟
LcdDisZimo0808(4,64,'9',0);
LcdDisZimo0808(5,64,'9',0);
LcdDisZimo0808(6,64,'9',0);
LcdDisZimo0808(7,64,'9',0);
LcdRefreshAll();
Delay(10000);
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line5);
}
}
这样的程序就进入了死循环当中一有外部中断就休眠,根本就出不来了。
我想让MCU唤醒的时候从初始化时钟开始执行,可以实现吗?或者说这样的一个思路应该用什么方法实现?
我又把程序改成了这样试了一下,还是不行,还是只运行到进入停止模式后就没反应了。也不会执行else里面的程序。不知为什么?
unsigned char PDI_FLAG=0;
这是变量的定义
void EXTI9_5_IRQHandler (void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line5);
if(PDI_FLAG==0)
{
LcdDisZimo0808(4,64,'4',0);
LcdDisZimo0808(5,64,'5',0);
LcdDisZimo0808(6,64,'6',0);
LcdDisZimo0808(7,64,'7',0);
LcdRefreshAll();
Delay(10000);
PDI_FLAG=1;
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
//LcdCommand(0xAE); //关显示
}
else
{
RCC_Configuration(); //初始化时钟
LcdDisZimo0808(4,64,'9',0);
LcdDisZimo0808(5,64,'9',0);
LcdDisZimo0808(6,64,'9',0);
LcdDisZimo0808(7,64,'9',0);
LcdRefreshAll();
Delay(10000);
//LcdCommand(0xAF); //开显示
PDI_FLAG=0;
}
}
}
在 else 前面加一个"}"
if(*********)
{
*****;
if(************)
{
*****;
}
}
else
{
***********;
}
以我的理解..格式应当为这样.
上面*号为程序内容..
仅提供格式.
此if else语句是:当if()里面的条件不满足时,,执行else内的程序..有可能是因为你的if()里面的条件已经满足了.所以不会进去else,,而且还是一直在满足条件中.
谢谢楼上耐心的回答,现在发现是外部中断根本唤醒不了,不知怎么搞的。下面的程序只运行了case 0:
再按外部中断的按键就没反应了,郁闷。
void EXTI9_5_IRQHandler (void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line5);
switch(PDI_FLAG)
{
case 0: LcdDisZimo0808(4,64,'4',0);
break;
case 1: LcdDisZimo0808(5,64,'5',0);
break;
case 2: LcdDisZimo0808(6,64,'6',0);
break;
case 3: LcdDisZimo0808(7,64,'7',0);
break;
}
LcdRefreshAll();
Delay(10000);
PDI_FLAG++;
//PDI_FLAG=1;
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
}
}
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
这个进入停止模式是不是不能放在中断里呀?
为什么放在主程序是可以唤醒的呢?
不确定是否能够这样用。
不管进入过程是在中断中还是在中断外,都请检查一下,系统是否进入了停止模式,是否被唤醒了,然后对比一下应该会有比较清晰的结论。可以通过测量功耗的变化,判断是否进入停止模式和是否被唤醒。
lz在EXTI中断里进入停止模式,并希望使用使用同一个EXTI中断唤醒是不可行的
因为MCU在进入停止模式前仍然在EXTI中断里,中断优先级相同不能打断自己,所以也不能唤醒MCU,lz可以尝试在进入停止模式前调高中断的优先级,可不可行我还没有测试过。
我建议楼主采用下面的方法:
看手册这段
Two options are available to select the Sleep mode entry mechanism,
depending on the SLEEPONEXIT bit in the Cortex-M3 System Control register:
● Sleep-now: if the SLEEPONEXIT bit is cleared, the MCU enters Sleep mode as soon
as WFI or WFE instruction is executed.
● Sleep-on-exit: if the SLEEPONEXIT bit is set, the MCU enters Sleep mode as soon as
it exits the lowest priority ISR.
把SLEEPONEXIT位在中断里置1,那么MCU在退出中断的时候就会自动进入睡眠模式,如果希望唤醒MCU,那么在中断里把这位清0就可以了。