本例展示了如何使用NVIC固件函数库来来展示Cortex-M3低功耗性能(WFE和WFI)。
本例使用了3条外部中断线路,线路3--KEY2,线路4--KEY3和线路13--JOY,在每一个信号下降研做为中断发生源或者事件源(event),其中外部中断线路3和13被设置为中断而线路4被设置成事件。用户需要在main程序开头的5个定义(define)语句中选择定义一个来决定进入那种低功耗模式。
这些选择为:
- Wait For Interrupt (WFI) Sleep On Exit:先按JOY,再加任一中断,即可进入SLEEP
=》无法唤醒 只有key2可进入中断
选择“#define WFISLEEPONEXIT”,(表示退出ISR后睡眠)在这个模式里,如果某中断有足够高的优先级,那么系统会进入这个中断,在从这个中断返回后,自动执行指令WFI进入Sleep模式。运行例程,表现如下:
与PC.07连接的LED1闪耀提示系统运行在RUN模式,主程序执行中。
按按钮key2,进入EXTI Line3的中断,会改变与PC.06相连的LED2状态。
按按钮JOY_LEFT,进入EXTI Line13的中断,与PC.04相连的LED4状态改变提示进入此中断,中断处理完返回后程序选中SLEEPONEXIT功能,这时,如果程序如果再进入任一中断(如按按钮进入EXTI Line3中断),从中断返回后,系统都会自动进入Sleep模式,这时,与PC.07连接的LED1不再闪耀
- Wait For Interrupt (WFI) Sleep Now =》key2可以唤醒 可以进入中断
=》key3无法唤醒
=》JOY无法唤醒 可以进入中断
选择“#define WFISLEEPNOW”在此模式下,一旦执行WFI指令,系统立刻进入Sleep模式。运行例程,表现如下:
与PC.07连接的LED1闪耀提示系统运行在RUN模式,主程序执行中。
按按钮JOY_LEFT,进入EXTI Line13的中断,与PC.04相连的LED4状态改变提示进入此中断,中断返回后程序执行WFI进入Sleep模式。与PC.07连接的LED1不再闪耀。
按按钮key2,进入EXTI Line3的中断,会改变与PC.06相连的LED2状态。同时把系统从Sleep模式中唤醒,与PC.07连接的LED1恢复闪耀。
- Wait For Event (WFE) SEV ON PEND ==》都可以唤醒 进不了中断
选择“#define WFESEVONPEND”,在此模式下,程序会直接执行WFE指令,且使能PRIMASK寄存器(主程序优先级为0)。
- /* Boost the execution priority to 0: no further exception can be asserted */
- NVIC_SETPRIMASK();
运行例程,表现如下:
与PC.07连接的LED1闪耀提示系统运行在RUN模式,主程序执行中。
按按钮JOY_LEFT,进入EXTI Line13的中断,与PC.04相连的LED4状态改变提示进入此中断,从中断返回后,主程序优先级被置0,因此将屏蔽所有中断,然后执行WFE进入Sleep模式。与PC.07连接的LED1不再闪耀。
此时,按按钮将不再进入中断,但是,在三条中断线路上的下降沿仍然构成事件,能够把系统唤醒,与PC.07连接的LED1恢复闪耀。但是,由于没有进入中断其它LED状态就不再改变。
如果定义了“#define RTC_Alarm_WFEWakeUp”,激活实时时钟警报功能,那么,即便不按按钮,6秒钟后CPU仍会被唤醒。
- Wait For Event (WFE) SEV ON EVENT =》可以唤醒 可以进入中断
选择“#define WFESEVONEVENT”,在此模式下,直接执行WFE指令。运行例程,表现如下:
与PC.07连接的LED1闪耀提示系统运行在RUN模式,主程序执行中。
按按钮JOY_LEFT,进入EXTI Line13的中断,与PC.04相连的LED4状态改变提示进入此中断,从中断返回后执行WFE进入Sleep模式。与PC.07连接的LED1不再闪耀。
此时,按任意按钮都会在三条线路上构成事件,将CPU唤醒,与前一种情况不同,此时,会进入中断,表现为LED状态会随着按按钮而相应地改变。
按下KEY2-->LED2翻转 按下JOY-->LED4翻转 LED1也翻转 :按下JOY唤醒则LED1翻转一下,同时进入中断,返回后LowPowerMode == 1,LED4翻转一下,执行WFE进入Sleep模式
如果定义了“#define RTC_Alarm_WFEWakeUp”,激活实时时钟警报功能,那么,即便不按按钮,6秒钟后CPU仍会被唤醒。
阅读(910) | 评论(0) | 转发(0) |