新闻中心

EEPW首页 > 电源与新能源 > 设计应用 > 基于WinCE5.0的嵌入式设备休眠唤醒技术研究

基于WinCE5.0的嵌入式设备休眠唤醒技术研究

作者:时间:2012-05-25来源:网络收藏

系统应用中降低设备功耗以提高续航能力是其设计的热点。在休眠状态,系统处于最低电流消耗状态,同时仍维持存储区中的内容,为了减少能量消耗和延长电池寿命,需要让处理器定期进入或退出休眠模式。Windows CE 作为一个广泛应用于设备上的操作系统,提供了完善的电源管理功能。其中,便是一个重要的功能。本文在结合S3C2440硬件基础上分析过程,分别采用外部中断唤醒和RTC中断唤醒两种方法实现了,并给出了具体实现代码。根据相应唤醒需求,将这两种方法应用于北京化工大学诊断与自愈工程研究中心的一款基于S3C2440和WindowsCE 5.0的智能巡检分析诊断仪,结果表明能准确达到实际的设置要求,效果良好。

本文引用地址:http://www.eepw.com.cn/article/230445.htm

1 休眠唤醒过程分析

对于电源控制逻辑模块,S3C2440 有多种电源管理方案以针对须执行的任务保持最优的电源消耗。S3C2440 中的电源管理模块对应 4 种模式:NORMAL 模式、SLOW 模式、IDLE 模式和SLEEP模式。

在SLEEP模式下,电源管理模块关闭内部电源,因此,CPU 和内部逻辑模块都没有电源消耗,但除了此模式下的唤醒模块。激活SLEEP模式需要2个独立的电源,其中一个为唤醒模块供电,另一个为包括CPU的其他逻辑模块供电,并且可以由power on/off控制。在SLEEP模式下,给CUP和内部逻辑单元供电的第二个电源被关闭,只有唤醒模块是工作的。这种状态下,可以通过外部中断EINT[15:0]或定时器的RTC(real time control)中断将系统从睡眠状态中唤醒[3],如图1所示。

在睡眠模式下,VDDi、VDDiam、VDDMPLL以及VDDUPLL会被关闭,其由PWREN引脚来控制,如PWREN信号被置位,VDDi和VDDiam则由一个外部变压器供电。当PWREN=0时,VDDi和VDDiam被关闭。

有多种方法可以使系统进入休眠,例如在Windows CE的桌面上,点左下角的开始图标,然后选择 “挂起”;或者,在应用程序或驱动中调用SetSystemPowerState()函数,都可以让系统进入休眠状态。实际上,这两种方法殊途同归,最终都需要通过OEM层OEMPowerOff()函数依次调用BSPPowerOff()函数,以关闭板级的相关电源,保存所有寄存器的值,关闭背光;调用 ConfigStopGPIO()函数,设置各IO休眠后的状态;如果支持KITL,调用OALKitlPowerOff()函数关闭KITL功能;调用OALCPUPoweroff()函数,使得CPU进入休眠模式。OALCPUPoweroff()函数保存当前系统的状态,把CPU上一些寄存器里的数据保存到RAM里去,然后禁止RAM自刷新的功能,加入唤醒中断源,最后使CPU进入休眠模式。当CPU处于Sleep状态时,RAM不会断电,这样RAM中的数据就不会丢失,当CPU被唤醒后使用RAM里的数据恢复系统。

当相应的中断源触发时,CPU就会被唤醒,电流消耗变大了,需要说明的是,此处仅唤醒CPU,之后才唤醒WINCE系统。当系统由SLEEP到NORMAL切换期间需经过一个RESET过程,这个过程称为 Power On Reset 。在S3C2440 CPU中,寄存器GSTATUS2专门用以判断发生Reset原因。Power On Reset后,在之前SLEEP过程中保存下来的RAM中的系统数据是不会丢失的。本文需要设计的唤醒子系统,就是把这些数值恢复到它们休眠前应处的地址。

在Bootloader中实现数据恢复的具体步骤如下:

(1)如果有唤醒源被触发,内部的复位信号就会动作。这和外部的 nReset引脚触发非常相似。复位持续时间由内部的 16 bit计数器逻辑决定,通过reset 复位决断时间可以计算tRST=(65535/XTAL_frequency);

(2)通过检测GSTATUS2[2],判断是否是由SLEEP模式唤醒引起的电源开启;

(3)通过设置 MISCCR[19:17]=000b,释放 SDRAM 的信号保护;

(4)配置 SDRAM 内存控制器;

(5)等待,直到 SDRAM 自刷新被释放,结束等待。大部分SDRAM需要等待所有 SDRAM 行的自刷新周期;

(6)GSTATUS[3:4]的信息可用于保存用户自定义数据,因为在 GSTATUS[3:4]中的值在睡眠模式下被保留;

(7)对 EINT[3:0],检查 SRCPND 寄存器;对EINT[15:4],查看 EINTPEND 寄存器而不是SRCPND寄存器。(尽管EINTPEND寄存器的一些位被置位,SRCPND 寄存器不会被置位)。

以上是一个通用的休眠唤醒过程,在实际应用中,可根据不同情况使用不同的唤醒方式。例如,以休眠模式待机,在需要使用仪器时才唤醒系统的情况下,就需要一个诸如按键的外部中断来唤醒系统;而对于仅做一个保存挂起动作的情况,即刻自动唤醒系统则更为便捷。S3C2440就提供了两种唤醒实现方式:外部中断实现方式和RTC中断实现方式。

2 基于外部中断的休眠唤醒

正如之前提到的,在OALCPUPoweroff里,系统进入休眠前,正确设置外部唤醒中断,才能够唤醒CPU。正确设置唤醒中断源,有3个要点:

(1)把对应的GPIO设置为中断功能;

(2)明确外部中断触发条件,如将某种唤醒使用的中断源所对应的IO接到一个按键上,需要通过按下按键实现唤醒,需要明确当按下这个按键时,IO接口上的电平会如何变化;

(3)根据按键按下时IO电平的变化条件设置EXTINTn寄存器。当按下按键时,IO口上的电平会发生从高到低的变化,那么就设置对应的EXTINTn,使得中断触发条件为Falling edge triggered即下降沿触发。

通过如下代码实现了通过按键K1、K2的外部中断唤醒方式:

; 6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
ldr r0, =vGPIOBASE
ldr r1, =0x5566//按键K1,K2(EINT0,EINT2)
str r1, [r0, #oGPFCON]
ldr r1, =0x82
str r1, [r0, #oEXTINT0]

此段代码,首先设置了外部中断0和外部中断2的中断功能,接着设置了中断的触发方式:下降沿触发方式。

当Windows CE操作系统在基于S3C2440的智能巡检分析诊断仪完全启动后,按下“挂起”键,待屏幕显示消失后,开始实验。

实验一:按下按键K1,使系统立即重新启动,重新进入Windows CE操作系统;
实验二:按下按键K2,使系统立即重新启动,重新进入Windows CE操作系统;
实验结果表明:即按即启,没有延迟,达到了外部中断-按键唤醒系统的理想效果。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

关键词: 嵌入式 休眠唤醒

评论


相关推荐

技术专区

关闭