3573|17

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教2410+CE5.0如何降低功耗 [复制链接]

我的系统是S3C2410加CE5.0

现在遇到的问题是功耗太大,在关掉屏背光的时候电流是100mA,一千多毫安时的电池根本就用不了多长时间,所以现在正在想办法降低功耗。

首先,想到的是休眠和唤醒,但是对这一块不甚了解,想问一下各位2410上面的休眠和唤醒要怎么做,修改哪些代码,我知道需要动BOOT和BSP底层的程序,但是不知道怎么改,我的平台是自优龙的YLE2410开发板而来的,希望在这个平台上面做成功的朋友能帮小弟一下。还有,如果改的话硬件是不是还要改一下,休眠时继续供电的电源芯片是要接MEMERY呢还是要接CORE呢?另外,2410休眠之后再唤醒需要多长时间,谢谢

其次,还有一个想法。看了芯片文档之后,发现除了正常工作之外还有好几种状态,包括休眠,还有IDLE,SLOW,那么我是不是可以在系统没有动作的时候把CPU的电源状态改变一下呢?比如改成IDLE,或者是改成SLOW模式,这样的话功耗不是就可以降下来了嘛,而且还不用改硬件了,只要能降到50-60mA就可以。不知道这种方法有没有人实现过。

最后,还可以把系统不用的时钟给停用,比如说USB HOST,IIS,IIC等。

不知道以上的三种哪个更合适一些,特别是第二个能不能实现,至于最后一条的话估计也不一定能砍掉多少电流。

产品快定型了,才发现功耗实在是太大,急啊,望各位前辈能出手相助,以解燃眉之急,谢谢,3Q。问题解决,高分相送。

最新回复

降低功耗主要是使系统在必要的时候进入休眠状态  详情 回复 发表于 2010-4-27 09:52
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
加电源管理驱动
一般状态时是on-->idle--->suspend
你可以自己定义各个阶段的时间
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关个背光就可以帮你省不少电了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
也就是说2410肯定能进IDLE模式呗,那应该会省好多的电吧
关屏背光是肯定的,大约能省几十个毫安不等,但是即使关掉背光的话电流还在100mA,这个是很痛苦的事情
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
2410肯定能支持WINCE的电源管理;

建议楼主先好好了解下 wince的电源管理,在找下牛人的博客,有很多牛人都在2410上实现了WINCE 的电源管理。

由于我们设备外挂GPS、GPRS、WIFI、二维条码模块、TFTLCD等很多设备,但我们设备在suspend后,整机电流不到30mA。(我们的WIFI没有彻底断掉电)

楼主如果做好,suspend时应该能在10mA以内吧
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
MARK最近在看 电源管理~呵呵~一起学习
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的系统是S3C2410加CE5.0

现在遇到的问题是功耗太大,在关掉屏背光的时候电流是100mA,一千多毫安时的电池根本就用不了多长时间,所以现在正在想办法降低功耗。

首先,想到的是休眠和唤醒,但是对这一块不甚了解,想问一下各位2410上面的休眠和唤醒要怎么做,修改哪些代码,我知道需要动BOOT和BSP底层的程序,(主要修改nboot,或者你自己的bootloader的汇编部分的代码,然后是kernel下的startup.s,重点关注下OemPowerOff这个函数,睡眠和唤醒都会走到它)但是不知道怎么改,我的平台是自优龙的YLE2410开发板而来的,希望在这个平台上面做成功的朋友能帮小弟一下。还有,如果改的话硬件是不是还要改一下(就我目前了解,硬件保持供电就ok了,不需要修改),休眠时继续供电的电源芯片是要接MEMERY呢还是要接CORE呢?另外,2410休眠之后再唤醒需要多长时间(这个时间是很短的,按下后睡眠,再按下后唤醒,唤醒过程不超过1秒lcd就可以亮,有wifi的话,wifi会重新下载firmware重连ap),谢谢

其次,还有一个想法。看了芯片文档之后,发现除了正常工作之外还有好几种状态,包括休眠,还有IDLE,SLOW,那么我是不是可以在系统没有动作的时候把CPU的电源状态改变一下呢?比如改成IDLE,或者是改成SLOW模式,这样的话功耗不是就可以降下来了嘛,而且还不用改硬件了,只要能降到50-60mA就可以。不知道这种方法有没有人实现过。(这个系统用到了timer4,会自动进入到idle状态,不需要你特别设置。如果用到DVS功能的话,还能自动调节cpu的频率)

最后,还可以把系统不用的时钟给停用,比如说USB HOST,IIS,IIC等。

不知道以上的三种哪个更合适一些,特别是第二个能不能实现,至于最后一条的话估计也不一定能砍掉多少电流。

产品快定型了,才发现功耗实在是太大,急啊,望各位前辈能出手相助,以解燃眉之急,谢谢,3Q。问题解决,高分相送。

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 kyzf 的回复:
2410肯定能支持WINCE的电源管理;

建议楼主先好好了解下 wince的电源管理,在找下牛人的博客,有很多牛人都在2410上实现了WINCE 的电源管理。

由于我们设备外挂GPS、GPRS、WIFI、二维条码模块、TFTLCD等很多设备,但我们设备在suspend后,整机电流不到30mA。(我们的WIFI没有彻底断掉电)

楼主如果做好,suspend时应该能在10mA以内吧
很强大,学习啦。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
我们没用到你说的平台,不过都是一样的,加电源管理驱动,加电源管理芯片。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

10
 
    也就是说肯定是要做电源管理了,这个电源管理是不是包括进入idle,suspend 模式,和电池的电量检测以及低电压报警?
    现在我的系统的电量检测和低电压报警是自己用EVC的对话框加上底层驱动实现的,而IDLE,SUSPEND这块没有实现,那么我接下来应该实现进入 idle或是suspend的,实现挂起的功能的话我要修改BSP下kernel下的startup.s文件,然后再修改我的bootloader里面的start.s文件,最后注册外部中断来实现唤醒。不知道我说的是不是正确的流程,请各位指点。另外硬件上面我还要改动吗?我现在板子上面只有一个1.8V和3.3V的两个电源芯片,我是不是还要加一个芯片来单独给SDRAM或是2410的CORE供电呢?而这个供电的使能脚就是PWREN脚吗?
    另外电池的管理,比如电量检测和低电压报警是包含在电源管理里面的吗?
    bbstr在回贴说“这个系统用到了timer4,会自动进入到idle状态,不需要你特别设置。如果用到DVS功能的话,还能自动调节cpu的频率”,我的系统确实是用的timer4来做OS滴答,那么我怎么让系统进入idle状态呢?是修改代码还是在WINCE系统里面设置呢?还请bbstr明示,谢谢。
    问题多多,呵呵,希望有做过的大侠帮忙,谢谢,解决后再送分报答
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 
建议楼主好好看看这篇文章:
WinCE电源管理的实现
http://www.hzlitai.com.cn/article/ARM9-article/system/1634.html

当然还有很多软件大牛的博客上,有详细讲各类处理器在wince上实现电源管理,楼主自己去搜索吧
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

12
 
不好意思,过完年回来一大堆事儿,就没上坛子,春节回家把《WinCE电源管理的实现 》看完了,也能了解了一点,但是对于CE上面的电源管理的细节还是不甚了解,如果谁能有相关的能涉及到注册表和代码之类的资料希望能小小弟提 一下,在此感谢了
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
我在我的设备上试了第一种方法,就是把不用的接口的CLK时钟关掉,但是几乎看不到有功耗的降低,这条已经被否了。

现在我想让系统能够进入IDLE模式,我在控制面板-》电源->方案里面电池电源和交流电源都设置了一分钟进入用户空闲,两分钟进入系统空闲,但是不论等待多长时间都不能看到进入空闲模式,功耗也没有有降低的现象,电流还是那么大,我想是不是我没有添加什么组件或是注册表有问题?
需要说的是我的系统里面没有实现电池驱动什么的。我BSP中的的代码如下:


  1. void
  2. CPUEnterIdle()
  3. {
  4.         static volatile CLKPWRreg * s2410CLKPW = (CLKPWRreg *)CLKPWR_BASE;
  5.         static volatile IOPreg    * s2410IOP   = (IOPreg    *)IOP_BASE;
  6.         static volatile UART0reg  * s2410UART0 = (UART0reg  *)UART0_BASE;
  7.         static volatile UART2reg  * s2410UART2 = (UART2reg  *)UART2_BASE;
  8.        
  9.         fInterruptFlag = FALSE;
  10.         INTERRUPTS_ON();
  11. //        RETAILMSG(1,(TEXT("::CPUEnterIdle,after INTERRUPTS_ON();\n")));
  12.         if ( !(s2410UART0->rUFSTAT & 0x3ff) && !(s2410UART2->rUFSTAT & 0x3ff) )                /* Check UART FIFO */
  13.         {
  14.                 if (!fSlowInterruptFlag)
  15.                 {
  16.                         s2410IOP->rGPFDAT &= ~(1 << 5);
  17.                         s2410CLKPW->rCLKCON |=  (1 << 2);                /* Enter IDLE Mode */
  18. //                        RETAILMSG(1,(TEXT("::CPUEnterIdle,after s2410CLKPW->rCLKCON |=  (1 << 2);                /* Enter IDLE Mode */;\n")));
  19.                         MMU_WaitForInterrupt();
  20.                        
  21.                 }

  22.                 while (!fInterruptFlag) {}                                        /* Wait until S3C2410X enters IDLE mode         */
  23.                 if (!fSlowInterruptFlag)
  24.                 {
  25.                         s2410CLKPW->rCLKCON &= ~(1 << 2);                /* turn-off IDLE bit.                           */
  26.                                                                                                         /* Any interrupt will wake up from IDLE mode    */
  27. //                        RETAILMSG(1,(TEXT("::CPUEnterIdle,after s2410CLKPW->rCLKCON &= ~(1 << 2);                /* turn-off IDLE bit.  */;\n")));                                                                                                       
  28.                         s2410IOP->rGPFDAT |= (1 << 5);
  29.                 }
  30.         }
  31.         else
  32.         {
  33. //                RETAILMSG(1,(TEXT("::CPUEnterIdle,else;\n")));
  34.                 while (!fInterruptFlag) {}                                        /* Wait until S3C2410X enters IDLE mode         */
  35.         }
  36. }

复制代码


这个函数不停的被调用,这个正常吗?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
降低功耗主要是使系统在必要的时候进入休眠状态,并配置GPIO电平
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
我的系统现在应该唤醒了,点击开始菜单的挂起后,电流从NORMAL的130ma到了50ma,(VDDalive,VDDiarm没有分开,用一颗电源芯片供电),而且PWREN也已经由3.3V降到了0V,这应该说明系统进入了POWER OFF模式了吧

我在休眠之前设置了EINT0作为唤醒中断,在休眠这后按下这个键后电流能够从50 MA升到了90MA,这是不是说明系统已经唤醒了呢?但是在DNW中却看不到接下来应该打印的串口调试信息,屏幕也没有变化,而我在汇编里面又加不了调试信息,所以请问我是不是休眠之后又唤醒了呢?

ResetHandler
ldr r0,=WTCON       ;watch dog disable
ldr r1,=0x0         
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff  ;all interrupt disable
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x3ff  ;all sub interrupt disable
str r1,[r0]

[ {FALSE}
; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);   
; Led_Display
ldr r0,=GPFCON
ldr r1,=0x5500  
str r1,[r0]
ldr r0,=GPFDAT
; ldr r1,=0x10
ldr r1,=0x10
str r1,[r0]
]
;To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
        
    [ PLL_ON_START
;Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=12MHz,Fout=50MHz
str r1,[r0]
]
;Check if the boot is caused by the wake-up from POWER_OFF mode.
ldr r1,=GSTATUS2
ldr r0,[r1]
tst r0,#0x2
;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
bne WAKEUP_POWER_OFF
; b WAKEUP_POWER_OFF



WAKEUP_POWER_OFF
;Release SCLKn after wake-up from the POWER_OFF mode.
ldr r1,=MISCCR
ldr r0,[r1]
bic r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE->H
str r0,[r1]
;Set memory control registers
ldr r0,=SMRDATA
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0      
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
mov r1,#256
0 subs r1,r1,#1  ;1) wait until the SelfRefresh is released.
bne %B0  

ldr r1,=GSTATUS3  ;GSTATUS3 has the start address just after POWER_OFF wake-up
; mov r1,#0
ldr r0,[r1]
mov pc,r0

我感觉是不是GSTATUS3里面存储的返回时的地址错误,导致没有返回CPUPowerOff()

我的FW.S里面相关代码
    LEAF_ENTRY CPUPowerOff
    ; 1. Save register state and return address on the stack.
    ;
    stmdb   sp!, {r4-r12}                  
    stmdb   sp!, {lr}
;    b .
    ; 2. Save MMU & CPU Registers to RAM.
    ;
    ldr     r3, =SLEEPDATA_BASE_VIRTUAL         ; base of Sleep mode storage
    ldr     r2, =Awake_address
    str     r2, [r3], #4                        ; save resume function address (virtual).
   
    mrc     p15, 0, r2, c1, c0, 0
    ldr     r0, =MMU_CTL_MASK
    bic     r2, r2, r0
    str     r2, [r3], #4                        ; save MMU control data.
    mrc     p15, 0, r2, c2, c0, 0
    ldr     r0, =MMU_TTB_MASK
    bic     r2, r2, r0
    str     r2, [r3], #4                        ; save TTB address.
    mrc     p15, 0, r2, c3, c0, 0
    str     r2, [r3], #4                        ; save domain access control.
    str     sp, [r3], #4                        ; save SVC mode stack pointer.
    mrs     r2, spsr
    str     r2, [r3], #4                        ; save SVC status register.
    mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit     ; enter FIQ mode, no interrupts.
    msr     cpsr, r1
    mrs     r2, spsr
    stmia   r3!, {r2, r8-r12, sp, lr}           ; save the FIQ mode registers.
    mov     r1, #Mode_ABT:OR:I_Bit:OR:F_Bit     ; enter ABT mode, no interrupts.
    msr     cpsr, r1
    mrs     r0, spsr
    stmia   r3!, {r0, sp, lr}                   ; save the ABT mode Registers.
    mov     r1, #Mode_IRQ:OR:I_Bit:OR:F_Bit     ; enter IRQ mode, no interrupts.
    msr     cpsr, r1
    mrs     r0, spsr
    stmia   r3!, {r0, sp, lr}                   ; save the IRQ Mode Registers.
    mov     r1, #Mode_UND:OR:I_Bit:OR:F_Bit     ; enter UND mode, no interrupts.
    msr     cpsr, r1
    mrs     r0, spsr
    stmia   r3!, {r0, sp, lr}                   ; save the UND mode Registers.
    mov     r1, #Mode_SYS:OR:I_Bit:OR:F_Bit     ; enter SYS mode, no interrupts.
    msr     cpsr, r1
    stmia   r3!, {sp, lr}                       ; save the SYS mode Registers.
    mov     r1, #Mode_SVC:OR:I_Bit:OR:F_Bit     ; back to SVC mode, no interrupts.
    msr     cpsr, r1
  
   ; 3. Compute the checksum on SleepData (verify integrity of data after resume).
   ;
    ldr     r3, =SLEEPDATA_BASE_VIRTUAL         ; get pointer to SLEEPDATA.
    mov     r2, #0
    ldr     r0, =SLEEPDATA_SIZE                 ; get size of data structure (in words).
30
    ldr     r1, [r3], #4                        ; compute the checksum.
    and     r1, r1, #0x1
    mov     r1, r1, LSL #31
    orr     r1, r1, r1, LSR #1
    add     r2, r2, r1
    subs    r0, r0, #1
    bne     %b30

    ldr     r0, =vGPIOBASE
    str     r2, [r0, #oGSTATUS3]                ; save the checksum in the Power Manager Scratch pad register.
    ; 4. Mask and clear all interrupts.
    ;
    ldr     r0, =vINTBASE
    mvn     r2, #0
    str     r2, [r0, #oINTMSK]
    str     r2, [r0, #oSRCPND]
    str     r2, [r0, #oINTPND]
    ; 5. Flush caches and TLBs.
    ;
    bl      ARMClearUTLB
    bl      ARMFlushICache
    ldr     r0, = (DCACHE_LINES_PER_SET - 1)   
    ldr     r1, = (DCACHE_NUM_SETS - 1)   
    ldr     r2, =  DCACHE_SET_INDEX_BIT   
    ldr     r3, =  DCACHE_LINE_SIZE     
    bl      ARMFlushDCache
    ; 6. Set external wake-up interrupts (EINT0-2: power-button and keyboard).
    ;
;    ldr     r0, =vGPIOBASE
;    ldr     r1, =0x550a
;    str     r1, [r0, #oGPFCON]
;   ldr     r1, =0x55550100
;   str     r1, [r0, #oGPGCON]
    ; 7. Switch to power-off mode.
    ;
ldr  r0, =vMISCCR   ; hit the TLB
ldr  r0, [r0]
ldr  r0, =vCLKCON
ldr  r0, [r0]
    ; **These registers are used later during power-off.
    ;
    ldr     r0, =vREFRESH  
    ldr     r1, [r0]                            ; r1 = rREFRESH.
    orr     r1, r1, #(1 << 22)
    ; **These registers are used later during power-off.
    ;
    ldr     r2, =vMISCCR
    ldr     r3, [r2]
    orr     r3, r3, #(7 << 17)                  ; make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up.
    ; **These registers are used later during power-off.
    ;
    ldr     r4, =vCLKCON
    ldr     r5, =0x7fff8                        ; power-off mode.

在查资料的时候看到有的唤醒是因为
SLEEPDATA_BASE_VIRTUAL          EQU 0xAC058000  ; keep in sync w/ config.bib
SLEEPDATA_BASE_PHYSICAL         EQU 0x30058000

两个地址不对而引起的,我想问一下版主和各位前辈,在2410上调唤醒的时候有没有遇到过类似的情况,搞了好几天了,快崩溃了,谢谢
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

16
 
我弄了一个LED来调试,结果显示确实是进入了休眠模式,也能够唤醒,也能够判断GSTATUS2 来决定是否跳到WAKEUP_POWER_OFF处,从程序看进入这个里面后就是设置一些东西,然后从GSTATUS3 取出跳转的地址,最后进入Fw.s原来休眠的地方。但是现在从现象来看WINCE没有起来,只是电流大了,屏幕和休眠时一样胡乱的显示一些东西,代码如下:WAKEUP_POWER_OFF
        ;Release SCLKn after wake-up from the POWER_OFF mode.

        ldr        r0,=GPFDAT                ;灯灭
        ldr        r1,=0x10
        str        r1,[r0]

        ldr r1,=MISCCR
        ldr        r0,[r1]
        bic        r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE->H
        str        r0,[r1]

        ;Set memory control registers
        ldr        r0,=SMRDATA
        ldr        r1,=BWSCON        ;BWSCON Address
        add        r2, r0, #52        ;End address of SMRDATA
0      
        ldr        r3, [r0], #4
        str        r3, [r1], #4
        cmp        r2, r0
        bne        %B0

        mov r1,#256
0        subs r1,r1,#1                ;1) wait until the SelfRefresh is released.
        bne %B0               
        
        ldr r1,=GSTATUS3         ;GSTATUS3 has the start address just after POWER_OFF wake-up
;        mov r1,#0
        ldr r0,[r1]
        mov pc,r0

是不是我GSTATUS3 取出来的值不对呢?也就是说在休眠之前GSTATUS3 里没有保存正确的唤醒跳转地址
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
结贴
我在eeworld新开了一个贴,请教唤醒的问题,希望大家前去指教,谢谢
http://topic.eeworld.net/u/20100315/11/c4a63701-9c15-4af1-8f99-88ff652268cd.html?seed=428575888&r=63933913
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

18
 
降低功耗主要是使系统在必要的时候进入休眠状态
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表